diff --git a/.circleci/config.yml b/.circleci/config.yml index 697ba3685..9764c6d8c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,115 +11,120 @@ commands: type: string steps: - run: - name: Install dependencies + name: Make Board (console logs not contiguous because multiple CPUs used to build under CircleCI, see logs in artifacts or Output build failing logs below in case of failed step) command: | - ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime - apt update - apt install -y build-essential zlib1g-dev uuid-dev libdigest-sha-perl libelf-dev bc bzip2 bison flex git gnupg gawk iasl m4 nasm patch python python2 python3 wget gnat cpio ccache pkg-config cmake libusb-1.0-0-dev autoconf texinfo ncurses-dev doxygen graphviz udev libudev1 libudev-dev automake libtool rsync innoextract sudo libssl-dev device-tree-compiler u-boot-tools sharutils e2fsprogs parted curl unzip imagemagick libncurses5-dev zip - - run: - name: Make Board (FULL ORDERED BUILD LOGS HERE UNTIL JOB FAILED) - command: | - rm -rf build/<>/<>/* build/<>/log/* && make V=1 BOARD=<> <> || touch ./tmpDir/failed_build + echo "Sourcing /devenv.sh since docker entrypoint doesn't do it as expected" + source /devenv.sh + rm -rf build/<< parameters.arch >>/<< parameters.target >>/* build/<< parameters.arch >>/log/* + #Pass AVAILABLE_MEM_GB=8 to respect CircleCI free tier RAM assignation, which otherwise randomly fails. See Makefile calculations. + # Without AVAILABLE_MEM_GB=8: CircleCI passes '-j36 --load-average=54' + # With AVAILABLE_MEM_GB=8: CircleCI passes '-j8 --load-average=12' + make V=1 BOARD=<< parameters.target >> << parameters.subcommand >> AVAILABLE_MEM_GB=8 | ts || touch ./tmpDir/failed_build no_output_timeout: 3h - run: name: Output hashes command: | - cat build/<>/<>/hashes.txt || echo "No hashes.txt for this build step..." + cat build/<< parameters.arch >>/<< parameters.target >>/hashes.txt || echo "No hashes.txt for this build step..." - run: name: Output sizes command: | - cat build/<>/<>/sizes.txt || echo "No sizes.txt for this build step..." + cat build/<< parameters.arch >>/<< parameters.target >>/sizes.txt || echo "No sizes.txt for this build step..." - run: name: Archiving build logs. command: | - tar zcvf build/<>/<>/logs.tar.gz $(find build/ -name "*.log") + tar zcvf build/<< parameters.arch >>/<< parameters.target >>/logs.tar.gz $(find build/ -name "*.log") - run: name: Output build failing logs command: | - if [[ -f ./tmpDir/failed_build ]]; then find ./build/<>/ -name "*.log" -type f -mmin -1|while read log; do echo ""; echo '==>' "$log" '<=='; echo ""; cat $log;done; exit 1;else echo "Step hasn't failed. Continuing with next step..."; fi \ + if [[ -f ./tmpDir/failed_build ]]; then + find "./build/<< parameters.arch >>/" -name "*.log" -type f -mmin -1 -exec tail -n +1 '{}' + + exit 1 + else + echo "Step hasn't failed. Continuing with next step..." + fi - store_artifacts: - path: build/<>/<> + path: build/<< parameters.arch >>/<< parameters.target >> jobs: prep_env: docker: - - image: debian:11 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large + working_directory: ~/heads steps: - - run: - name: Install dependencies - command: | - ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime - apt update - apt install -y build-essential zlib1g-dev uuid-dev libdigest-sha-perl libelf-dev bc bzip2 bison flex git gnupg gawk iasl m4 nasm patch python python2 python3 wget gnat cpio ccache pkg-config cmake libusb-1.0-0-dev autoconf texinfo ncurses-dev doxygen graphviz udev libudev1 libudev-dev automake libtool rsync innoextract sudo imagemagick libncurses5-dev - checkout - - run: name: git reset command: | - git reset --hard "$CIRCLE_SHA1" \ - + git reset --hard "$CIRCLE_SHA1" - run: name: Make tmp dir command: | - mkdir ./tmpDir \ - + mkdir ./tmpDir - run: name: Creating all modules and patches digest (All modules cache digest) command: | - find ./Makefile ./patches/ ./modules/ -type f | sort -h |xargs sha256sum > ./tmpDir/all_modules_and_patches.sha256sums \ - + find .circleci/config.yml ./Makefile ./flake.lock ./patches/ ./modules/ -type f | sort -h |xargs sha256sum > ./tmpDir/all_modules_and_patches.sha256sums - run: name: Creating coreboot (and associated patches) and musl-cross-make modules digest (musl-cross-make and coreboot cache digest) command: | - find ./Makefile ./modules/coreboot ./modules/musl-cross* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross.sha256sums \ - + find .circleci/config.yml ./flake.lock ./modules/coreboot ./modules/musl-cross-make* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross-make.sha256sums - run: name: Creating musl-cross-make and musl-cross-make patches digest (musl-cross-make cache digest) command: | - find ./Makefile modules/musl-cross* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross.sha256sums \ - + find ./flake.lock modules/musl-cross-make* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross-make.sha256sums - restore_cache: + # First matched/found key wins and following keys are not tried keys: - #Restore existing cache for matching modules digest, validated to be exactly the same as in github current commit. - #This cache was made on top of below caches, if previously existing. If no module definition changed, we reuse this one. Otherwise... - - heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} - #If precedent cache not found, restore cache for coreboot module (and patches) and musl-cross-make digests (coreboot: triannual release) - #Otehrwise.... - - heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} - #If precedent cache not found. Restore cache for musl-cross-make module digest (rarely modified). - #Otherwise, we build cleanly. - - heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + # Cache for matching modules digest, validated to be exactly the same as in GitHub current commit. + # This cache was made on top of below caches, if previously existing. + # If no module definition changed, we reuse this one + - nix-docker-heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} + + # Cache for coreboot module (and patches) and musl-cross-make digests (coreboot: triannual release) + - nix-docker-heads-coreboot-musl-cross-make-{{ checksum "./tmpDir/coreboot_musl-cross-make.sha256sums" }}{{ .Environment.CACHE_VERSION }} + + # Cache for musl-cross-make module digest (rarely modified). + - nix-docker-heads-musl-cross-make-{{ checksum "./tmpDir/musl-cross-make.sha256sums" }}{{ .Environment.CACHE_VERSION }} - run: name: Download and neuter xx20 ME (keep generated GBE and extracted IFD in tree) command: | ./blobs/xx20/download_parse_me.sh - + - run: + name: Download Optiplex 7010/9010 blobs + command: | + ./blobs/xx30/optiplex_7010_9010.sh ./blobs/xx30 + # me_cleaner.py present under heads blobs/utils/me_cleaner dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py - run: name: Download and neuter xx30 ME (keep generated GBE and extracted IFD in tree) - # me_cleaner.py present under heads xx30 blobs dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py command: | - ./blobs/xx30/download_clean_me_manually.sh -m $(readlink -f ./blobs/xx30/me_cleaner.py) - + ./blobs/xx30/download_clean_me_manually.sh -m $(readlink -f ./blobs/utils/me_cleaner/me_cleaner.py) + - run: + name: Download, neuter and deguard xx80 ME (keep generated GBE and extracted IFD in tree) + command: | + ./blobs/xx80/download_clean_deguard_me_pad_tb.sh -m $(readlink -f ./blobs/utils/me_cleaner/me_cleaner.py) ./blobs/xx80/ - run: name: Download and extract t530 vbios roms for dgpu boards command: | + echo skipping for now + exit 0 ./blobs/xx30/vbios_t530.sh - - run: name: Download and extract w530 vbios roms for dgpu boards command: | + echo skipping for now + exit 0 ./blobs/xx30/vbios_w530.sh - - persist_to_workspace: - root: ~/ + root: ~/heads paths: - . build_and_persist: docker: - - image: debian:11 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large + working_directory: ~/heads parameters: arch: type: string @@ -130,23 +135,24 @@ jobs: type: string steps: - attach_workspace: - at: ~/ + at: ~/heads - build_board: - arch: <> - target: <> - subcommand: <> + arch: << parameters.arch >> + target: << parameters.target >> + subcommand: << parameters.subcommand >> - persist_to_workspace: - root: ~/ + root: ~/heads paths: - - project/packages/<> - - project/build/<> - - project/crossgcc/<> - - project/install/<> + - packages/<< parameters.arch >> + - build/<< parameters.arch >> + - crossgcc/<< parameters.arch >> + - install/<< parameters.arch >> build: docker: - - image: debian:11 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large + working_directory: ~/heads parameters: arch: type: string @@ -157,53 +163,52 @@ jobs: type: string steps: - attach_workspace: - at: ~/ + at: ~/heads - build_board: arch: <> - target: <> + target: <> subcommand: <> save_cache: docker: - - image: debian:11 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large + working_directory: ~/heads steps: - attach_workspace: - at: ~/ + at: ~/heads - save_cache: - #Generate cache for the same musl-cross module definition if hash is not previously existing - #CircleCI removed their wildcard support, so we have to list precise versions to cache in directory names - key: heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + # Generate cache for the same musl-cross-make module definition if hash is not previously existing + # CircleCI removed their wildcard support, so we have to list precise versions to cache in directory names + key: nix-docker-heads-musl-cross-make-{{ checksum "./tmpDir/musl-cross-make.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: + - build/ppc64/musl-cross-make-fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c + - build/x86/musl-cross-make-fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c - crossgcc - - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - packages - save_cache: - #Generate cache for the same coreboot mnd musl-cross-make modules definition if hash is not previously existing - #CircleCI removed their wildcard support, so we have to list precise versions to cache in directory names - key: heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + # Generate cache for the same coreboot and musl-cross-make modules definition if hash is not previously existing + # CircleCI removed their wildcard support, so we have to list precise versions to cache in directory names + key: nix-docker-heads-coreboot-musl-cross-make-{{ checksum "./tmpDir/coreboot_musl-cross-make.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: + - build/ppc64/coreboot-talos_2 + - build/ppc64/musl-cross-make-fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c + - build/x86/coreboot-4.11 + - build/x86/coreboot-24.02.01 + - build/x86/coreboot-24.12 + - build/x86/coreboot-dasharo + - build/x86/coreboot-purism + - build/x86/musl-cross-make-fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c - crossgcc - - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - packages - - build/x86/coreboot-4.11 - - build/x86/coreboot-4.13 - - build/x86/coreboot-4.14 - - build/x86/coreboot-4.15 - - build/x86/coreboot-4.17 - - build/x86/coreboot-4.19 - - build/x86/coreboot-git - - build/ppc64/coreboot-git - save_cache: - #Generate cache for the exact same modules definitions if hash is not previously existing - key: heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} + # Generate cache for the exact same modules definitions if hash is not previously existing + key: nix-docker-heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - - crossgcc - build - - packages + - crossgcc - install + - packages workflows: version: 2 @@ -211,319 +216,260 @@ workflows: jobs: - prep_env -# Below, sequentially build one board for each coreboot -# version. The last board in the sequence is the dependency -# for the parallel boards built at the end, and also save_cache. + # This step builds musl-cross-make for x86 architecture, which will be used by subsequent x86 board builds + - build_and_persist: + name: x86-musl-cross-make + target: t480-hotp-maximized + subcommand: "musl-cross-make" + requires: + - prep_env - # coreboot 4.19 + # This step builds musl-cross-make for ppc64 architecture, which will be used by subsequent ppc64 board builds - build_and_persist: - name: x230-hotp-maximized - target: x230-hotp-maximized - subcommand: "" + name: ppc64-musl-cross-make + arch: ppc64 + target: UNTESTED_talos-2 + subcommand: "musl-cross-make" requires: - prep_env - # coreboot-git librems + # Below, sequentially build one board for each coreboot version. + # The last board in the sequence is the dependency for the parallel boards built at the end, and also save_cache. + + # coreboot 24.02.01 + - build_and_persist: + name: novacustom-nv4x_adl + target: novacustom-nv4x_adl + subcommand: "" + requires: + - x86-musl-cross-make + + # coreboot purism: based on coreboot 24.02.01, reuse dasharo 24.02.01 crossgcc - build_and_persist: name: librem_14 target: librem_14 subcommand: "" requires: - - x230-hotp-maximized + - novacustom-nv4x_adl - # coreboot-git Nitropads depending on x230-hotp-maximized cache - # since kernel is 6.x and coreboot is git is unshared - # We use nitropad's coreboot's fork crossgcc - # No need to wait further for other board's cache. - # We reuse built modules from x230-hotp-maximized cache only + # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build_and_persist: - name: nitropad-nv41 - target: nitropad-nv41 + name: t480-hotp-maximized + target: t480-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - x86-musl-cross-make - # coreboot-git Talos II (PPC) + # coreboot talos_2 - build_and_persist: - name: talos-2 + name: UNTESTED_talos-2 arch: ppc64 - target: talos-2 + target: UNTESTED_talos-2 subcommand: "" requires: - - prep_env + - ppc64-musl-cross-make - #Cache one workspace per architecture. Make sure workspace caches are chainloaded and the last in chain for an arch is saved. - - save_cache: + # coreboot 4.11 + - build_and_persist: + name: librem_l1um + target: librem_l1um + subcommand: "" requires: - - talos-2 - - nitropad-nv41 + - x86-musl-cross-make -# -# Those onboarding new boards should add their entries below. -# -# + # Cache one workspace per architecture + # Make sure workspace caches are chainloaded and the last in chain for an arch is saved + - save_cache: + requires: + - UNTESTED_talos-2 + - t480-hotp-maximized -#Coreboot 4.19 boards + # Those onboarding new boards should add their entries below. + # coreboot 24.12 boards - build: name: x220-hotp-maximized target: x220-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: x220-maximized target: x220-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: t420-hotp-maximized target: t420-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_t520-hotp-maximized - target: UNTESTED_t520-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: t420-maximized target: t420-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: UNTESTED_t520-maximized - target: UNTESTED_t520-maximized + name: t430-hotp-maximized + target: t430-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: x230-legacy-flash - target: x230-legacy-flash + name: x230-maximized + target: x230-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: UNTESTED_t430-legacy-flash - target: UNTESTED_t430-legacy-flash + name: optiplex-7010_9010-maximized + target: optiplex-7010_9010-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: UNTESTED_t430-legacy - target: UNTESTED_t430-legacy + name: optiplex-7010_9010-hotp-maximized + target: optiplex-7010_9010-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: UNTESTED_t430-hotp-legacy - target: UNTESTED_t430-hotp-legacy + name: optiplex-7010_9010_TXT-maximized + target: optiplex-7010_9010_TXT-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: x230-legacy - target: x230-legacy + name: optiplex-7010_9010_TXT-hotp-maximized + target: optiplex-7010_9010_TXT-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: x230-hotp-legacy - target: x230-hotp-legacy + name: x230-hotp-maximized + target: x230-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: x230-hotp-maximized_usb-kb target: x230-hotp-maximized_usb-kb subcommand: "" requires: - - x230-hotp-maximized - - - build: - name: t430-hotp-maximized - target: t430-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: x230-maximized - target: x230-maximized - subcommand: "" - requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: x230-maximized-fhd_edp target: x230-maximized-fhd_edp subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: x230-hotp-maximized-fhd_edp target: x230-hotp-maximized-fhd_edp subcommand: "" requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_t530-hotp-maximized - target: UNTESTED_t530-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_t530-dgpu-hotp-maximized - target: UNTESTED_t530-dgpu-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: w530-hotp-maximized target: w530-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_w530-dgpu-K1000m-hotp-maximized - target: UNTESTED_w530-dgpu-K1000m-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized + - t480-hotp-maximized - - build: - name: UNTESTED_w530-dgpu-K2000m-hotp-maximized - target: UNTESTED_w530-dgpu-K2000m-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - build: name: t430-maximized target: t430-maximized subcommand: "" requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_t530-maximized - target: UNTESTED_t530-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_t530-dgpu-maximized - target: UNTESTED_t530-dgpu-maximized - subcommand: "" - requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: w530-maximized target: w530-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: UNTESTED_w530-dgpu-K1000m-maximized - target: UNTESTED_w530-dgpu-K1000m-maximized + name: UNTESTED_t530-maximized + target: UNTESTED_t530-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: UNTESTED_w530-dgpu-K2000m-maximized - target: UNTESTED_w530-dgpu-K2000m-maximized + name: UNTESTED_t530-hotp-maximized + target: UNTESTED_t530-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: t440p-maximized - target: t440p-maximized + name: UNTESTED_t440p-maximized + target: UNTESTED_t440p-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: t440p-hotp-maximized - target: t440p-hotp-maximized + name: UNTESTED_t440p-hotp-maximized + target: UNTESTED_t440p-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: w541-maximized - target: w541-maximized + name: UNTESTED_w541-maximized + target: UNTESTED_w541-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: w541-hotp-maximized - target: w541-hotp-maximized + name: UNTESTED_w541-hotp-maximized + target: UNTESTED_w541-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: qemu-coreboot-fbwhiptail-tpm2-hotp target: qemu-coreboot-fbwhiptail-tpm2-hotp subcommand: "" requires: - - x230-hotp-maximized - - - build: - name: z220-cmt-maximized - target: z220-cmt-maximized - subcommand: "" - requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: z220-cmt-hotp-maximized - target: z220-cmt-hotp-maximized + name: UNTESTED_z220-cmt-maximized + target: UNTESTED_z220-cmt-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: - name: UNTESTED_p8z77-m_pro-tpm1-maximized - target: UNTESTED_p8z77-m_pro-tpm1-maximized + name: UNTESTED_z220-cmt-hotp-maximized + target: UNTESTED_z220-cmt-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - - build: - name: UNTESTED_p8z77-m_pro-tpm1-hotp-maximized - target: UNTESTED_p8z77-m_pro-tpm1-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized - -#coreboot-git librem boards + # coreboot purism + # librem boards - build: name: librem_13v2 target: librem_13v2 @@ -566,68 +512,40 @@ workflows: requires: - librem_14 -#coreboot-git dasharo clevo_release + staging IASL patch - - build: - name: nitropad-ns50 - target: nitropad-ns50 - subcommand: "" - requires: - - nitropad-nv41 - -# - build: -# name: UNTESTED_kgpe-d16_workstation-usb_keyboard -# target: UNTESTED_kgpe-d16_workstation-usb_keyboard -# subcommand: "" -# requires: -# - UNTESTED_kgpe-d16_workstation - -# - build: -# name: UNTESTED_kgpe-d16_server -# target: UNTESTED_kgpe-d16_server -# subcommand: "" -# requires: -# - UNTESTED_kgpe-d16_workstation - -# - build: -# name: UNTESTED_kgpe-d16_server-whiptail -# target: UNTESTED_kgpe-d16_server-whiptail -# subcommand: "" -# requires: -# - UNTESTED_kgpe-d16_workstation - -# - build: -# name: librem_l1um -# target: librem_l1um -# subcommand: "" -# requires: -# - librem_14 - -######################## -######################## -### OLD STUFF ### -######################## -######################## -# linuxboot steps need something to pass in the kernel header path -# skipping for now -# - run: -# name: UNTESTED_qemu-linuxboot-edk2 -# command: | -# ./build/make-4.2.1/make \ -# CROSS=/cross/bin/x86_64-linux-musl- \ -# BOARD=UNTESTED_qemu-linuxboot \ -# `/bin/pwd`/build/linuxboot-git/build/qemu/.configured \ -# # Run first to avoid too many processes -# -# - run: -# name: UNTESTED_qemu-linuxboot -# command: | -# ./build/make-4.2.1/make \ -# CROSS=/cross/bin/x86_64-linux-musl- \ -# CPUS=16 \ -# V=1 \ -# BOARD=UNTESTED_qemu-linuxboot \ -# -# - store-artifacts: -# path: build/UNTESTED_qemu-linuxboot/linuxboot.rom -# - store-artifacts: -# path: build/UNTESTED_qemu-linuxboot/hashes.txt + - build: + name: librem_11 + target: librem_11 + subcommand: "" + requires: + - librem_14 + + # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache + - build: + name: t480-maximized + target: t480-maximized + subcommand: "" + requires: + - t480-hotp-maximized + + # dasharo release, share 24.02.01 utils/crossgcc + - build: + name: UNTESTED_nitropad-ns50 + target: UNTESTED_nitropad-ns50 + subcommand: "" + requires: + - novacustom-nv4x_adl + + #NovaCustom v56 boards are based on coreboot 24.02.01 fork, so depend on x230 + - build: + name: novacustom-v560tu + target: novacustom-v560tu + subcommand: "" + requires: + - novacustom-nv4x_adl + + - build: + name: novacustom-v540tu + target: novacustom-v540tu + subcommand: "" + requires: + - novacustom-nv4x_adl diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..b85b26d14 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +has nix && use flake diff --git a/.github/ISSUE_TEMPLATE/bug-report-for-everything-except-build-errors.md b/.github/ISSUE_TEMPLATE/bug-report-for-everything-except-build-errors.md index b4cf1b072..edcb995a9 100644 --- a/.github/ISSUE_TEMPLATE/bug-report-for-everything-except-build-errors.md +++ b/.github/ISSUE_TEMPLATE/bug-report-for-everything-except-build-errors.md @@ -11,90 +11,92 @@ assignees: '' ### A. Provide Hardware Details -**1. What board are you using (see list of boards [here](https://github.com/eganonoa/heads/tree/master/boards))?** - -**2. Does your computer have a dGPU or is it iGPU-only?** -- [ ] dGPU -- [ ] iGPU-only - -**3. Who installed Heads on this computer?** -- [ ] Insurgo -- [ ] Nitrokey -- [ ] Purism -- [ ] Other provider -- [ ] Self-installed - -**4. What PGP key is being used?** -- [ ] Librem Key -- [ ] Nitrokey Pro 2 -- [ ] Nitrokey Storage -- [ ] Yubikey -- [ ] Other - -**5. Are you using the PGP key to provide HOTP verification?** -- [ ] Yes -- [ ] No -- [ ] I don't know +1. What board are you using? (Choose from the list of boards [here](https://github.com/eganonoa/heads/tree/master/boards)) + +2. Does your computer have a dGPU or is it iGPU-only? + - [ ] dGPU (Distinct GPU other then internal GPU) + - [ ] iGPU-only (Internal GPU, normally Intel GPU) + +3. Who installed Heads on this computer? + - [ ] Insurgo (Issues to be reported at https://github.com/linuxboot/heads/issues) + - [ ] Nitrokey (Issues to be reported at https://github.com/Nitrokey/heads/issues) + - [ ] Purism (Issues to be reported at https://source.puri.sm/firmware/pureboot/-/issues) + - [ ] Novacustom (Issues to be reported at https://github.com/Dasharo/dasharo-issues) + - [ ] HardnenedVault (Issues to be reported at https://github.com/hardenedvault/vaultboot/issues) + - [ ] Other provider + - [ ] Self-installed + +4. What PGP key is being used? + - [ ] Librem Key (Nitrokey Pro 2 rebranded) + - [ ] Nitrokey Pro + - [ ] Nitrokey Pro 2 + - [ ] Nitrokey 3 NFC + - [ ] Nitrokey 3 NFC Mini + - [ ] Nitrokey Storage + - [ ] Nitrokey Storage 2 + - [ ] Yubikey + - [ ] Other + +5. Are you using the PGP key to provide HOTP verification? + - [ ] Yes + - [ ] No + - [ ] I don't know ### B. Identify how the board was flashed -**1. Is this problem related to updating heads or flashing it for the first time?** -- [ ] First-time flash -- [ ] Updating heads +1. Is this problem related to updating heads or flashing it for the first time? + - [ ] First-time flash + - [ ] Updating heads -**2. If the problem is related to an update, how did you attempt to apply the update?** -- [ ] Using the Heads GUI -- [ ] Flashrom via the Recovery Shell -- [ ] External flashing +2. If the problem is related to an update, how did you attempt to apply the update? + - [ ] Using the Heads menus + - [ ] Flashrom via the Recovery Shell + - [ ] External flashing -**3. How was Heads initially flashed** -- [ ] External flashing -- [ ] Internal-only / 1vyrain -- [ ] Don't know +3. How was Heads initially flashed? + - [ ] External flashing + - [ ] Internal-only / 1vyprep+1vyrain / skulls + - [ ] Don't know -**4. Was the board flashed with a maximized or non-maximized/legacy rom?** -- [ ] Maximized -- [ ] Non-maximized / legacy -- [ ] I don't know +4. Was the board flashed with a maximized or non-maximized/legacy rom? + - [ ] Maximized + - [ ] Non-maximized / legacy + - [ ] I don't know -**5. If Heads was externally flashed, was IFD unlocked?** -- [ ] Yes -- [ ] No -- [ ] Don't know +5. If Heads was externally flashed, was IFD unlocked? + - [ ] Yes + - [ ] No + - [ ] Don't know ### C. Identify the rom related to this bug report -**1. Did you download or build the rom at issue in this bug report?** -- [ ] I downloaded it -- [ ] I built it - -**2. If you downloaded your rom, where did you get it from?** -- [ ] Heads CircleCi -- [ ] Purism -- [ ] Nitrokey -- [ ] Somewhere else (please identify) - -*Please provide the release number or otherwise identify the rom downloaded* - -**3. If you built your rom, which repository:branch did you use?** -- [ ] Heads:Master -- [ ] Other (please identify) - -**4. What version of coreboot did you use in building?** -- [ ] 4.8.1 (current default in heads:master) -- [ ] 4.13 -- [ ] 4.14 -- [ ] 4.15 -- [ ] Other (please specify) -- [ ] I don't know - -**5. In building the rom where did you get the blobs?** -- [ ] No blobs required -- [ ] Provided by the company that installed Heads on the device -- [ ] Extracted from a backup rom taken from this device -- [ ] Extracted from another backup rom taken from another device (please identify the board model) -- [ ] Extracted from the online bios using the automated tools provided in Heads -- [ ] I don't know +1. Did you download or build the rom at issue in this bug report? + - [ ] I downloaded it + - [ ] I built it + +2. If you downloaded your rom, where did you get it from? + - [ ] Heads CircleCi + - [ ] Purism + - [ ] Nitrokey + - [ ] Dasharo DTS (Novacustom) + - [ ] Somewhere else (please identify) + + *Please provide the release number or otherwise identify the rom downloaded* + +3. If you built your rom, which repository:branch did you use? + - [ ] Heads:Master + - [ ] Other (please identify) + +4. What version of coreboot did you use in building? +{ You can find this information from github commit ID or once flashed, by giving the complete version from Sytem Information under Options --> menu} + +5. In building the rom, where did you get the blobs? + - [ ] No blobs required + - [ ] Provided by the company that installed Heads on the device + - [ ] Extracted from a backup rom taken from this device + - [ ] Extracted from another backup rom taken from another device (please identify the board model) + - [ ] Extracted from the online bios using the automated tools provided in Heads + - [ ] I don't know ## Please describe the problem diff --git a/.github/ISSUE_TEMPLATE/bug-report-for-heads-build-errors.md b/.github/ISSUE_TEMPLATE/bug-report-for-heads-build-errors.md index e31aace7e..63d5fb276 100644 --- a/.github/ISSUE_TEMPLATE/bug-report-for-heads-build-errors.md +++ b/.github/ISSUE_TEMPLATE/bug-report-for-heads-build-errors.md @@ -16,11 +16,7 @@ assignees: '' - [ ] Other (please specify) **3. What version of coreboot are you trying to build** -- [ ] 4.13 -- [ ] 4.14 -- [ ] 4.15 -- [ ] 4.17 -- [ ] Other (please specify) + **4. In building the rom where did you get the blobs?** - [ ] No blobs required diff --git a/.gitignore b/.gitignore index b41afbf1c..720f911aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,25 @@ -.*.sw* -*.xz +*.bad *.bz2 +*.cpio +*.dep +*.ffs +*.fv *.gz -*.sign -*.rom -*.o -*.gz -*.tgz *.img -*.rom -*.cpio -typescript* -config/*.old *.log -*~ -crossgcc -clean +*.lz +*.o +*.rom *.sec -*.dep -*.ffs +*.sign +*.tgz *.vol -*.lz -*.fv -*.bad +*.xz +*~ +.*.sw* +/.direnv +clean +config/*.old +crossgcc +typescript* +result diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md new file mode 100644 index 000000000..a86798b05 --- /dev/null +++ b/BOARD_TESTERS.md @@ -0,0 +1,61 @@ +Live list of community supported platform testers per last coreboot/linux version bump +== + +Heads is a community project, where boards under boards/* need to be tested by board owners when coreboot/linux version bumps happen prior of a Pull Request (PR) merge. +This list will be maintained per coreboot/linux version bumps PRs. + +Please see boards/BOARD_NAME/BOARD_NAME.config for HCL details. + +---- + +As per https://github.com/linuxboot/heads/issues/692, currently built CircleCI boards ROMs are: + +Laptops +== + +xx20 (Sandy): +=== +- [ ] t420 (xx20): @notgivenby @alexmaloteaux @akfhasodh @doob85 +- [ ] x220 (xx20): @srgrint @Thrilleratplay + +xx30 (Ivy): +=== +- [ ] t430 (xx30): @notgivenby @nestire(t430-legacy, t430-maximized) @Thrilleratplay @alexmaloteaux @lsafd @bwachter(iGPU maximized) @shamen123 @eganonoa(iGPU) @nitrosimon @jans23 @icequbes1 (iGPU) @weyounsix (t430-dgpu) +- [ ] w530 (xx30): @eganonoa @zifxify @weyounsix (dGPU: w530-k2000m) @jnscmns (dGPU K1000M) @computer-user123 (w530 / & w530 k2000 : prefers iGPU) @tlaurion +- [ ] x230 (xx30): @nestire(x230-legacy, x230-maximized) @tlaurion(maximized) @osresearch @merge @jan23 @MrChromebox @shamen123 @eganonoa @bwachter @Thrilleratplay @jnscmns +- [ ] x230-fhd/edp variant: @n4ru @computer-user123 (nitro caster board) @Tonux599 @househead @pcm720 (eDP 4.0 board and 1440p display) @doob85 https://matrix.to/#/@rsabdpy:matrix.org (agan mod board) +- [ ] x230t : @fhvyhjriur +- [ ] t530 (xx30): @fhvyhjriur @3hhh (Opportunity to mainstream and close https://github.com/linuxboot/heads/issues/1682) +- [ ] Optiplex 7010/9010 SFF/DT: @tlaurion (owns DT variant) + +xx4x(Haswell): +=== +- [ ] t440p: @fhvyhjriur @ThePlexus @srgrint @akunterkontrolle @rbreslow +- [ ] w541 (similar to t440p): @ResendeGHF @gaspar-ilom (Always tested late: Needs more responsive board testers or risk to become unmaintained.) + +xx8x(Kaby Lake Refresh): +=== +- [ ] t480: @gaspar-ilom @doritos4mlady @MattClifton76 @notgivenby @akunterkontrolle + +Librems: +=== +- [ ] Librem 11(JasperLake): @JonathonHall-Purism +- [ ] Librem 13v2 (Skylake): @JonathonHall-Purism +- [ ] Librem 13v4 (Kabylake): @JonathonHall-Purism +- [ ] Librem 14 (CometLake): @JonathonHall-Purism +- [ ] Librem 15v3 (Skylake): @JonathonHall-Purism +- [ ] Librem 15v4 (Kabylake): @JonathonHall-Purism + +Clevo: +=== +- [ ] Nitropad NS50 (AlderLake) : @daringer +- [ ] Novacustom NV4x (AlderLake) : @tlaurion @daringer +- [ ] Novacustom v560tu (MeteorLake) : @tlaurion @daringer @mkopec + +Desktops/Servers +== +- [ ] kgpe-d16 (AMD fam15h) (dropped in coreboot 4.12): @arhabd @Tonux599 @zifxify https://matrix.to/#/@rsabdpy:matrix.org +- [ ] Librem L1UM v1 (Broadwell): @JonathonHall-Purism +- [ ] Librem L1Um v2 (CoffeeLake): @JonathonHall-Purism +- [ ] Talos II (PPC64LE, Power9) : @tlaurion (Will become untested, no other known users, not worth my time nor effort even though massive investment of all forms) +- [ ] z220-cmt (HP Z220 CMT): @d-wid diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..d2a797503 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,73 @@ +# Contributing to LinuxBoot/Heads + +Thank you for your interest in contributing to LinuxBoot/Heads! We welcome contributions +from everyone. Following these contribution guidelines will make handling of issues and +PRs a faster and smoother process, so please try to adhere to them. + +## Communication Channels + +For the most up-to-date information on our community channels, please visit: +https://osresearch.net/community/ + +## Best Practices for Issues and Contributions + +Before opening an issue or submitting a contribution, please: + +1. Search existing resources (GitHub issues, wiki, Matrix channel history). +2. Review the documentation at https://osresearch.net. +3. Choose the appropriate channel for your contribution or question. + +If you're unsure about what kind of issue you're looking at or whether it's an actual issue + with the project rather than your usage mistake, feel free to post a quick question briefly + (actual amount of details depends on the situation) describing the situation and expect to + either get a suitable answer or a request to provide a detailed problem report on GitHub + which will be treated with more attention. In case of an absence of a GitHub account and + unwillingness to create one, detailed report can also be submitted via Matrix and an issue + will be opened on GitHub by a maintainer. + +### When Starting a Discussion on Matrix + +- Clearly state your topic or question. +- Provide context, including your environment (OS, hardware, etc.) if relevant. +- Be patient and respectful while waiting for responses. Feel free to "ping" (draw attention) after some time if it looks like your question wasn't noticed. +- Structure your topic effectively with a clear title and organized content. +- Use code blocks for command outputs or error messages. +- Consider breaking complex topics into smaller, manageable questions. +- Tag your topic with relevant keywords. + +### When Opening an Issue on GitHub +- Search globally on linuxboot organization for related keywords first. + - EG: yubikey search in issues: https://github.com/search?q=org%3Alinuxboot+yubikey&type=issues +- Choose a clear and descriptive title. +- Clearly describe the problem or suggestion: + - Summarize the issue or feature request. + - Explain current behavior and expected behavior. + - For bugs, provide steps to reproduce. + - For feature requests, explain use case and benefits. +- Mention your environment details. +- If you have a proposed solution, describe it briefly. +- Check for related issues or pull requests and link them. +- Format your issue for readability using Markdown. + - Here is a nice advanced online editor alternative to GitHub: https://stackedit.io/app# +- Be responsive to follow-up questions. + +### For Pull Requests + +- Link to related issues or discussions. +- Provide a clear description of the changes and their purpose. +- Be responsive to feedback and prepared to make adjustments. +- **Important**: All commits to linuxboot/heads (*not heads-wiki!*) must be signed. + - For instructions, see: [Signing commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits) + - If you won't GPG-sign your commits (GitHub signature doesn't count), they will get signed by a maintainer after a successful review, but it's strongly preferred you do it yourself. + +## GitHub Repositories + +- **linuxboot/heads**: https://github.com/linuxboot/heads + - Main repository for code, development, and user experience improvements. + - All commits must be signed. +- **linuxboot/heads-wiki**: https://github.com/linuxboot/heads-wiki + - Repository for project documentation. + - Content is rendered and searchable at https://osresearch.net + - *Commits don't have to be signed to lower bar for contribution*. + +We appreciate your contributions to the LinuxBoot/Heads project! diff --git a/FAQ.md b/FAQ.md index e3909b1d6..1e2c1c609 100644 --- a/FAQ.md +++ b/FAQ.md @@ -112,8 +112,8 @@ your disk password, which is perhaps an improvement. Disk key in TPM (LUKS TPM Disk Unlock Key) or user passphrase? --- -Depends on your threat model. With the disk key in the TPM an attacker -would need to have the entire machine (or a backdoor in the TPM) +Depends on your threat model. With the Disk Unlock Key in the TPM an +attacker would need to have the entire machine (or a backdoor in the TPM) to get the key and their attempts to unlock it can be rate limited by the TPM hardware. diff --git a/Makefile b/Makefile index de0d3e4f5..ceaf0b61c 100644 --- a/Makefile +++ b/Makefile @@ -25,11 +25,48 @@ INSTALL = $(pwd)/install/$(CONFIG_TARGET_ARCH) log_dir = $(build)/log board_build = $(build)/$(BOARD) + +# Estimated memory required per job in GB (e.g., 1GB for gcc) +MEM_PER_JOB_GB ?= 1 + # Controls how many parallel jobs are invoked in subshells -CPUS ?= $(shell nproc) -MAKE_JOBS ?= -j$(CPUS) --max-load 16 +CPUS ?= $(shell nproc) +AVAILABLE_MEM_GB ?= $(shell cat /proc/meminfo | grep MemAvailable | awk '{print int($$2 / 1024)}') + +# Calculate the maximum number of jobs based on available memory +MAX_JOBS_MEM := $(shell echo $$(( $(AVAILABLE_MEM_GB) / $(MEM_PER_JOB_GB) ))) + +# Use the minimum of the system's CPUs and the calculated max jobs based on memory +CPUS := $(shell echo $$(($(CPUS) < $(MAX_JOBS_MEM) ? $(CPUS) : $(MAX_JOBS_MEM)))) + +# Load average can be adjusted to be higher than CPUS to allow for some CPU overcommit +# Multiply by 3 and then divide by 2 to achieve the effect of multiplying by 1.5 using integer arithmetic +LOADAVG ?= $(shell echo $$(( ($(CPUS) * 3) / 2 ))) + +# Construct MAKE_JOBS with dynamic CPU count and load average +MAKE_JOBS := -j$(CPUS) --load-average=$(LOADAVG) # Add other flags as needed to be more adaptive to CIs + +# Print out the settings and compare system values with actual ones used +$(info ----------------------------------------------------------------------) +$(info !!!!!! BUILD SYSTEM INFO !!!!!!) +$(info System CPUS: $(shell nproc)) +$(info System Available Memory: $(AVAILABLE_MEM_GB) GB) +$(info System Load Average: $(shell uptime | awk '{print $$10}')) +$(info ----------------------------------------------------------------------) +$(info Used **CPUS**: $(CPUS)) +$(info Used **LOADAVG**: $(LOADAVG)) +$(info Used **AVAILABLE_MEM_GB**: $(AVAILABLE_MEM_GB) GB) +$(info ----------------------------------------------------------------------) +$(info **MAKE_JOBS**: $(MAKE_JOBS)) +$(info ) +$(info Variables available for override (use 'make VAR_NAME=value'):) +$(info **CPUS** (default: number of processors, e.g., 'make CPUS=4')) +$(info **LOADAVG** (default: 1.5 times CPUS, e.g., 'make LOADAVG=54')) +$(info **AVAILABLE_MEM_GB** (default: memory available on the system in GB, e.g., 'make AVAILABLE_MEM_GB=4')) +$(info **MEM_PER_JOB_GB** (default: 1GB per job, e.g., 'make MEM_PER_JOB_GB=2')) +$(info ----------------------------------------------------------------------) +$(info !!!!!! Build starts !!!!!!) -WGET ?= wget # Timestamps should be in ISO format DATE=`date --rfc-3339=seconds` @@ -72,6 +109,24 @@ CONFIG_HEADS ?= y # Unless otherwise specified, we are building bash to have non-interactive shell for scripts (arrays and bashisms) CONFIG_BASH ?= y +# Unless otherwise specified, we build kbd to have setfont, loadkeys and keymaps +CONFIG_KBD ?= y +#loadkeys permits to load .map source files directly +CONFIG_KBD_LOADKEYS ?= y + + +# USB keyboards can be ignored, optionally supported, or required. +# +# To optionally support USB keyboards, export CONFIG_SUPPORT_USB_KEYBOARD=y. To +# default the setting to 'on', also export CONFIG_USER_USB_KEYBOARD=y. +# +# To require USB keyboard support (not user-configurable, for boards with no +# built-in keyboard), export CONFIG_USB_KEYBOARD_REQUIRED=y. +ifeq "$(CONFIG_USB_KEYBOARD_REQUIRED)" "y" +# CONFIG_USB_KEYBOARD_REQUIRED implies CONFIG_SUPPORT_USB_KEYBOARD. +export CONFIG_SUPPORT_USB_KEYBOARD=y +endif + # Determine arch part for a host triplet ifeq "$(CONFIG_TARGET_ARCH)" "x86" MUSL_ARCH := x86_64 @@ -128,9 +183,10 @@ initrd_dir := $(BOARD) initrd_tmp_dir := $(shell mktemp -d) initrd_lib_dir := $(initrd_tmp_dir)/lib initrd_bin_dir := $(initrd_tmp_dir)/bin +initrd_data_dir := $(initrd_tmp_dir)/data modules-y += initrd -$(shell mkdir -p "$(initrd_lib_dir)" "$(initrd_bin_dir)") +$(shell mkdir -p "$(initrd_lib_dir)" "$(initrd_bin_dir)" "$(initrd_data_dir)") # We are running our own version of make, # proceed with the build. @@ -139,17 +195,18 @@ $(shell mkdir -p "$(initrd_lib_dir)" "$(initrd_bin_dir)") SHELL := /usr/bin/env bash .SHELLFLAGS := -o pipefail -c -# Include the musl-cross module early so that $(CROSS) will +# Include the musl-cross-make module early so that $(CROSS) will # be defined prior to any other module. -include modules/musl-cross +include modules/musl-cross-make -musl_dep := musl-cross +musl_dep := musl-cross-make target := $(shell echo $(CROSS) | grep -Eoe '([^/]*?)-linux-musl') arch := $(subst -linux-musl, , $(target)) heads_cc := $(CROSS)gcc \ -fdebug-prefix-map=$(pwd)=heads \ -gno-record-gcc-switches \ -D__MUSL__ \ + --sysroot $(INSTALL) \ -isystem $(INSTALL)/include \ -L$(INSTALL)/lib \ @@ -180,9 +237,9 @@ ifeq ($(CONFIG_COREBOOT), y) # Legacy flash boards don't generate an update package, the only purpose of # those boards is to be flashed over vendor firmware via an exploit. ifneq ($(CONFIG_LEGACY_FLASH), y) -# talos-2 builds its own update package, which is not integrated with the ZIP -# method currently -ifneq ($(BOARD), talos-2) +# Boards containing 'talos-2' build their own update package, which is not integrated with the ZIP method currently +ifneq ($(findstring talos-2, $(BOARD)),) +else # Coreboot targets create an update package that can be applied with integrity # verification before flashing (see flash-gui.sh). The ZIP package format # allows other metadata that might be needed to added in the future without @@ -194,9 +251,16 @@ $(board_build)/$(CB_UPDATE_PKG_FILE): $(board_build)/$(CB_OUTPUT_FILE) cd "$(board_build)/update_pkg" && sha256sum "$(CB_OUTPUT_FILE)" >sha256sum.txt cd "$(board_build)/update_pkg" && zip -9 "$@" "$(CB_OUTPUT_FILE)" sha256sum.txt +# Only add the hash and size if split_8mb4mb.mk is not included +ifeq ($(wildcard split_8mb4mb.mk),) +all: $(board_build)/$(CB_OUTPUT_FILE) $(board_build)/$(CB_UPDATE_PKG_FILE) + @sha256sum $(board_build)/$(CB_OUTPUT_FILE) | tee -a "$(HASHES)" + @stat -c "%8s:%n" $(board_build)/$(CB_OUTPUT_FILE) | tee -a "$(SIZES)" +else all: $(board_build)/$(CB_OUTPUT_FILE) $(board_build)/$(CB_UPDATE_PKG_FILE) endif endif +endif ifneq ($(CONFIG_COREBOOT_BOOTBLOCK),) all: $(board_build)/$(CB_BOOTBLOCK_FILE) @@ -218,12 +282,10 @@ all payload: FORCE: # Copies config while replacing predefined placeholders with actual values +# This is used in a command like 'this && $(call install_config ...) && that' +# so it needs to evaluate to a shell command. define install_config = - sed -e 's!@BOARD_BUILD_DIR@!$(board_build)!g' \ - -e 's!@BLOB_DIR@!$(pwd)/blobs!g' \ - -e 's!@BRAND_DIR@!$(pwd)/branding/$(BRAND_NAME)!g' \ - -e 's!@BRAND_NAME@!$(BRAND_NAME)!g' \ - "$1" > "$2" + $(pwd)/bin/prepare_module_config.sh "$1" "$2" "$(board_build)" "$(BRAND_NAME)" endef # Make helpers to operate on lists of things @@ -235,14 +297,29 @@ define map = $(foreach _,$2,$(eval $(call $1,$_))) endef +# Data files can be specified in modules/* to be added into data.cpio. +# Each module should set _data += src|dst +# Example (in modules/ncurses): +# ncurses_data += $(INSTALL)/usr/lib/terminfo/l/linux|etc/terminfo/l/linux +# +# The main Makefile will collect all data files from enabled modules: +# $(call data,$(modules-y)) + # Bring in all of the module definitions; # these are the external pieces that will be downloaded and built # as part of creating the Heads firmware image. include modules/* +# Collect all data files from enabled modules +data_files := +$(foreach m,$(modules-y),$(eval data_files += $($(m)_data))) + define bins = $(foreach m,$1,$(call prefix,$(build)/$($m_dir)/,$($m_output))) endef +define data = +$(foreach m,$1,$(call prefix,$(build)/$($m_dir)/,$($m_data))) +endef define libs = $(foreach m,$1,$(call prefix,$(build)/$($m_dir)/,$($m_libraries))) endef @@ -325,7 +402,9 @@ define define_module = # First time: # Checkout the tree instead and create the canary file with repo and # revision so that we know that the files are all present and their - # version. + # version. Submodules are _not_ checked out, because coreboot has + # many submodules that won't be used, let coreboot check out its own + # submodules during build # # Other times: # If .canary contains the same repo and revision combination, do nothing. @@ -337,41 +416,52 @@ define define_module = # XXX: "git clean -dffx" is a hack for coreboot during commit switching, need # module-specific cleanup action to get rid of it. $(build)/$($1_base_dir)/.canary: FORCE - if [ ! -e "$$@" ]; then \ - git clone $($1_repo) "$(build)/$($1_base_dir)"; \ - git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash) && git submodule update --init --checkout; \ - echo -n '$($1_repo)|$($1_commit_hash)' > "$$@"; \ - elif [ "$$$$(cat "$$@")" != '$($1_repo)|$($1_commit_hash)' ]; then \ - echo "Switching $1 to $($1_repo) at $($1_commit_hash)" && \ + if [ ! -e "$$@" ] && [ ! -d "$(build)/$($1_base_dir)" ]; then \ + echo "INFO: .canary file and directory not found. Cloning repository $($1_repo) into $(build)/$($1_base_dir)" && \ + git clone $($1_repo) "$(build)/$($1_base_dir)" && \ + echo "INFO: Resetting repository to commit $($1_commit_hash)" && \ + git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash) && \ + echo "INFO: Creating .canary file with repo and commit hash" && \ + echo -n '$($1_repo)|$($1_commit_hash)' > "$$@" ; \ + elif [ ! -e "$$@" ] || [ "$$$$(cat "$$@")" != '$($1_repo)|$($1_commit_hash)' ]; then \ + echo "INFO: .canary file missing or differs. Resetting $1 to $($1_repo) at $($1_commit_hash)" && \ git -C "$(build)/$($1_base_dir)" reset --hard HEAD^ && \ - echo "git fetch $($1_repo) $($1_commit_hash) --recurse-submodules=no" && \ + echo "INFO: Fetching commit $($1_commit_hash) from $($1_repo) (without recursing submodules)" && \ git -C "$(build)/$($1_base_dir)" fetch $($1_repo) $($1_commit_hash) --recurse-submodules=no && \ - echo "git reset --hard $($1_commit_hash)" && \ + echo "INFO: Resetting repository to commit $($1_commit_hash)" && \ git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash) && \ - echo "git clean" && \ + echo "INFO: Cleaning repository directory (including payloads and util/cbmem)" && \ git -C "$(build)/$($1_base_dir)" clean -df && \ git -C "$(build)/$($1_base_dir)" clean -dffx payloads util/cbmem && \ - echo "git submodule sync" && \ + echo "INFO: Synchronizing submodules" && \ git -C "$(build)/$($1_base_dir)" submodule sync && \ - echo "git submodule update" && \ + echo "INFO: Updating submodules (init and checkout)" && \ git -C "$(build)/$($1_base_dir)" submodule update --init --checkout && \ - echo -n '$($1_repo)|$($1_commit_hash)' > "$$@"; \ + echo "INFO: Updating .canary file with new repo info" && \ + echo -n '$($1_repo)|$($1_commit_hash)' > "$$@" ; \ fi if [ ! -e "$(build)/$($1_base_dir)/.patched" ]; then \ + echo "INFO: .patched file not found. Beginning patch application for $1" && \ if [ -r patches/$($1_patch_name).patch ]; then \ - ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) ) \ - < patches/$($1_patch_name).patch \ - || exit 1 ; \ - fi && \ - if [ -d patches/$($1_patch_name) ] && \ - [ -r patches/$($1_patch_name) ] ; then \ - for patch in patches/$($1_patch_name)/*.patch ; do \ - echo "Applying patch file : $$$$patch " ; \ - ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) ) \ - < $$$$patch \ - || exit 1 ; \ - done ; \ - fi && \ + echo "INFO: Applying single patch file: patches/$($1_patch_name).patch" && \ + if ! git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch; then \ + echo "ERROR: Failed to apply patch: patches/$($1_patch_name).patch. Reversing and reapplying." && \ + git apply --reverse --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch || true && \ + git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch || exit 1; \ + fi; \ + fi; \ + if [ -d patches/$($1_patch_name) ]; then \ + echo "INFO: Applying multiple patch files from directory: patches/$($1_patch_name)" && \ + for patch in patches/$($1_patch_name)/*.patch; do \ + echo "INFO: Applying patch file: $$$$patch" && \ + if ! git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < "$$$$patch"; then \ + echo "ERROR: Failed to apply patch: $$$$patch. Reversing and reapplying." && \ + git apply --reverse --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < "$$$$patch" || true && \ + git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < "$$$$patch" || exit 1; \ + fi; \ + done; \ + fi; \ + echo "INFO: Patches applied successfully. Creating .patched file." && \ touch "$(build)/$($1_base_dir)/.patched"; \ fi else @@ -396,20 +486,45 @@ define define_module = mkdir -p "$$(dir $$@)" tar -xf "$(packages)/$($1_tar)" $(or $($1_tar_opt),--strip 1) -C "$$(dir $$@)" if [ -r patches/$($1_patch_name).patch ]; then \ - ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) ) \ - < patches/$($1_patch_name).patch \ - || exit 1 ; \ - fi - if [ -d patches/$($1_patch_name) ] && \ - [ -r patches/$($1_patch_name) ] ; then \ - for patch in patches/$($1_patch_name)/*.patch ; do \ - echo "Applying patch file : $$$$patch " ; \ - ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) ) \ - < $$$$patch \ - || exit 1 ; \ + echo "INFO: Applying single patch file: patches/$($1_patch_name).patch" && \ + if ! ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch ); then \ + echo "ERROR: Failed to apply patch: patches/$($1_patch_name).patch. Reversing and reapplying." && \ + ( git apply --reverse --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch ) || true && \ + ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch ) || exit 1 ; \ + fi ; \ + fi ; \ + if [ -d patches/$($1_patch_name) ]; then \ + echo "INFO: Applying multiple patch files from directory: patches/$($1_patch_name)" && \ + for patch in patches/$($1_patch_name)/*.patch; do \ + echo "INFO: Applying patch file: $$$$patch" && \ + if ! ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < $$$$patch ); then \ + echo "ERROR: Failed to apply patch: $$$$patch. Reversing and reapplying." && \ + ( git apply --reverse --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < $$$$patch ) || true && \ + echo "INFO: Reapplying patch file: $$$$patch" && \ + ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < $$$$patch ) || exit 1 ; \ + fi ; \ done ; \ fi - @touch "$$@" + if [ ! -e "$$@" ] && [ -e "$(build)/$($1_base_dir)/.patched" ]; then \ + echo "INFO: .canary file not found but .patched exists. Reversing and reapplying patches for $1" && \ + if [ -r patches/$($1_patch_name).patch ]; then \ + echo "INFO: Reversing single patch file: patches/$($1_patch_name).patch." && \ + ( git apply --reverse --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch ) || true && \ + echo "INFO: Reapplying single patch file: patches/$($1_patch_name).patch." && \ + ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch ) || exit 1 ; \ + fi ; \ + if [ -d patches/$($1_patch_name) ]; then \ + echo "INFO: Reversing and reapplying multiple patch files from directory: patches/$($1_patch_name)" && \ + for patch in patches/$($1_patch_name)/*.patch; do \ + echo "INFO: Reversing patch file: $$$$patch" && \ + ( git apply --reverse --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < $$$$patch ) || true && \ + echo "INFO: Reapplying patch file: $$$$patch" && \ + ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < $$$$patch ) || exit 1 ; \ + done ; \ + fi ; \ + rm -f "$(build)/$($1_base_dir)/.patched" ; \ + fi + touch "$$@" endif # Allow the module to override the destination configuration file @@ -469,7 +584,8 @@ define define_module = stat $(call outputs,$1) >/dev/null 2>/dev/null || echo FORCE \ )) - $(build)/$($1_dir)/.build: $($1.force) \ + #TODO: something better then removing .build: $($1.force) so that newt/ncurses are not rebuilt inconditionally? + $(build)/$($1_dir)/.build: \ $(foreach d,$($1_depends),$(build)/$($d_dir)/.build) \ $(dir $($1_config_file_path)).configured \ @@ -506,8 +622,8 @@ endef $(call map, define_module, $(modules-y)) -# hack to force musl-cross to be built before musl -#$(build)/$(musl_dir)/.configured: $(build)/$(musl-cross_dir)/../../crossgcc/x86_64-linux-musl/bin/x86_64-musl-linux-gcc +# hack to force musl-cross-make to be built before musl +#$(build)/$(musl_dir)/.configured: $(build)/$(musl-cross-make_dir)/../../crossgcc/x86_64-linux-musl/bin/x86_64-musl-linux-gcc # # Install a file into the initrd, if it changed from @@ -520,7 +636,7 @@ endef # # Files that should be copied into the initrd -# THis should probably be done in a more scalable manner +# This should probably be done in a more scalable manner # define initrd_bin_add = $(initrd_bin_dir)/$(notdir $1): $1 @@ -529,6 +645,20 @@ $(initrd_bin_dir)/$(notdir $1): $1 initrd_bins += $(initrd_bin_dir)/$(notdir $1) endef +define initrd_data_add = +$(initrd_data_dir)/$(2): $(1) + $(call do,INSTALL-DATA,$(1:$(pwd)/%=%) => $(2),\ + mkdir -p "$(dir $(initrd_data_dir)/$(2))"; \ + cp -a --remove-destination "$(1)" "$(initrd_data_dir)/$(2)"; \ + ) +endef + +# Register all data_files for installation +$(foreach entry,$(data_files),\ + $(eval src := $(word 1,$(subst |, ,$(entry)))) \ + $(eval dst := $(word 2,$(subst |, ,$(entry)))) \ + $(eval $(call initrd_data_add,$(src),$(dst))) \ +) define initrd_lib_add = $(initrd_lib_dir)/$(notdir $1): $1 @@ -539,11 +669,12 @@ endef # Only some modules have binaries that we install # Shouldn't this be specified in the module file? -#bin_modules-$(CONFIG_MUSL) += musl-cross +#bin_modules-$(CONFIG_MUSL) += musl-cross-make bin_modules-$(CONFIG_KEXEC) += kexec bin_modules-$(CONFIG_TPMTOTP) += tpmtotp bin_modules-$(CONFIG_PCIUTILS) += pciutils bin_modules-$(CONFIG_FLASHROM) += flashrom +bin_modules-$(CONFIG_FLASHPROG) += flashprog bin_modules-$(CONFIG_CRYPTSETUP) += cryptsetup bin_modules-$(CONFIG_CRYPTSETUP2) += cryptsetup2 bin_modules-$(CONFIG_GPG) += gpg @@ -569,12 +700,15 @@ bin_modules-$(CONFIG_KBD) += kbd bin_modules-$(CONFIG_ZSTD) += zstd bin_modules-$(CONFIG_E2FSPROGS) += e2fsprogs bin_modules-$(CONFIG_EXFATPROGS) += exfatprogs -bin_modules-$(CONFIG_IOTOOLS) += iotools $(foreach m, $(bin_modules-y), \ $(call map,initrd_bin_add,$(call bins,$m)) \ ) +# Install the data for every module that we have built +$(foreach m, $(modules-y), \ + $(call map,initrd_data_add,$(call data,$m)) \ +) # Install the libraries for every module that we have built $(foreach m, $(modules-y), \ $(call map,initrd_lib_add,$(call libs,$m)) \ @@ -595,7 +729,7 @@ endif $(COREBOOT_UTIL_DIR)/cbmem/cbmem \ $(COREBOOT_UTIL_DIR)/superiotool/superiotool \ $(COREBOOT_UTIL_DIR)/inteltool/inteltool \ -: $(build)/$(coreboot_base_dir)/.canary musl-cross +: $(build)/$(coreboot_base_dir)/.canary musl-cross-make +$(call do,MAKE,$(notdir $@),\ $(MAKE) -C "$(dir $@)" $(CROSS_TOOLS) \ ) @@ -628,7 +762,21 @@ initrd-y += $(build)/$(initrd_dir)/tools.cpio initrd-y += $(build)/$(initrd_dir)/board.cpio initrd-$(CONFIG_HEADS) += $(build)/$(initrd_dir)/heads.cpio -#$(build)/$(initrd_dir)/.build: $(build)/$(initrd_dir)/initrd.cpio.xz +# Only build data.cpio if there are data files +ifneq ($(strip $(data_files)),) + +# Build data.cpio for data files only +$(build)/$(initrd_dir)/data.cpio: $(data_initrd_files) FORCE + @mkdir -p "$(initrd_data_dir)" + $(call do-cpio,$@,$(initrd_data_dir)) + +# Ensure data.cpio is included in initrd.cpio.xz +initrd-y += $(build)/$(initrd_dir)/data.cpio + +# Ensure data.cpio is always built as part of the main build +all: $(build)/$(initrd_dir)/data.cpio + +endif $(build)/$(initrd_dir)/initrd.cpio.xz: $(initrd-y) $(call do,CPIO-XZ ,$@,\ @@ -658,11 +806,10 @@ all: $(bundle-y) # The board.cpio is built from the board's initrd/ directory. It contains # board-specific support scripts. +$(build)/$(initrd_dir)/board.cpio: FORCE ifeq ($(wildcard $(pwd)/boards/$(BOARD)/initrd),) -$(build)/$(initrd_dir)/board.cpio: cpio -H newc -o "$@" else -$(build)/$(initrd_dir)/board.cpio: FORCE $(call do-cpio,$@,$(pwd)/boards/$(BOARD)/initrd) endif @@ -677,11 +824,11 @@ $(build)/$(initrd_dir)/heads.cpio: FORCE # # The tools initrd is made from all of the things that we've # created during the submodule build. -# $(build)/$(initrd_dir)/tools.cpio: \ $(initrd_bins) \ $(initrd_libs) \ $(initrd_tmp_dir)/etc/config \ + FORCE $(call do-cpio,$@,$(initrd_tmp_dir)) @$(RM) -rf "$(initrd_tmp_dir)" @@ -706,13 +853,32 @@ $(initrd_tmp_dir)/etc/config: FORCE >> $@ ; \ ) +# List of all installed DATA files (for cpio input and hash logging) +data_initrd_files := $(foreach entry,$(data_files),$(initrd_data_dir)/$(word 2,$(subst |, ,$(entry)))) + +# Only build data.cpio if there are data files +ifneq ($(strip $(data_files)),) + +# Build data.cpio for data files only +$(build)/$(initrd_dir)/data.cpio: $(data_initrd_files) FORCE + @mkdir -p "$(initrd_data_dir)" + $(call do-cpio,$@,$(initrd_data_dir)) + +# Ensure data.cpio is included in initrd.cpio.xz +initrd-y += $(build)/$(initrd_dir)/data.cpio + +# Ensure data.cpio is always built as part of the main build +all: $(build)/$(initrd_dir)/data.cpio + +endif + # Ensure that the initrd depends on all of the modules that produce # binaries for it $(build)/$(initrd_dir)/tools.cpio: $(foreach d,$(bin_modules-y),$(build)/$($d_dir)/.build) # List of all modules, excluding the slow to-build modules -modules-slow := musl musl-cross kernel_headers +modules-slow := musl musl-cross-make kernel_headers module_dirs := $(foreach m,$(filter-out $(modules-slow),$(modules-y)),$($m_dir)) echo_modules: @@ -726,27 +892,81 @@ modules.clean: done board.move_untested_to_tested: - @echo "NEW_BOARD variable will remove UNTESTED_ prefix from $(BOARD)" + @echo "Moving $(BOARD) from UNTESTED to tested status" @NEW_BOARD=$$(echo $(BOARD) | sed 's/^UNTESTED_//'); \ + INCLUDE_BOARD=$$(grep "include \$$(pwd)/boards/" boards/$(BOARD)/$(BOARD).config | sed 's/.*boards\/\(.*\)\/.*/\1/'); \ + NEW_INCLUDE_BOARD=$$(echo $$INCLUDE_BOARD | sed 's/^UNTESTED_//'); \ + echo "Updating config file: boards/$(BOARD)/$(BOARD).config"; \ + sed -i 's/$(BOARD)/'$${NEW_BOARD}'/g' boards/$(BOARD)/$(BOARD).config; \ + sed -i 's/'$$INCLUDE_BOARD'/'$$NEW_INCLUDE_BOARD'/g' boards/$(BOARD)/$(BOARD).config; \ + echo "Renaming config file to $${NEW_BOARD}.config"; \ + mv boards/$(BOARD)/$(BOARD).config boards/$(BOARD)/$${NEW_BOARD}.config; \ + echo "Renaming board directory to $${NEW_BOARD}"; \ + mv boards/$(BOARD) boards/$${NEW_BOARD}; \ + echo "Updating .circleci/config.yml"; \ + sed -i "s/$(BOARD)/$${NEW_BOARD}/g" .circleci/config.yml; \ + echo "Operation completed for $(BOARD) -> $${NEW_BOARD}" + +board.move_unmaintained_to_tested: + @echo "NEW_BOARD variable will remove UNMAINTAINED_ prefix from $(BOARD)" + @NEW_BOARD=$$(echo $(BOARD) | sed 's/^UNMAINTAINED_//'); \ echo "Renaming boards/$$BOARD/$$BOARD.config to boards/$$BOARD/$$NEW_BOARD.config"; \ mv boards/$$BOARD/$$BOARD.config boards/$$BOARD/$$NEW_BOARD.config; \ echo "Renaming boards/$$BOARD to boards/$$NEW_BOARD"; \ rm -rf boards/$$NEW_BOARD; \ mv boards/$$BOARD boards/$$NEW_BOARD; \ echo "Replacing $$BOARD with $$NEW_BOARD in .circleci/config.yml"; \ + sed -i "s/$$BOARD/$$NEW_BOARD/g" .circleci/config.yml; \ + echo "Board $$BOARD has been moved to tested status as $$NEW_BOARD"; \ + echo "Please review and update .circleci/config.yml manually if needed" + +board.move_untested_to_unmaintained: + @echo "NEW_BOARD variable will move from UNTESTED_ to UNMAINTAINED_ from $(BOARD)" + @NEW_BOARD=$$(echo $(BOARD) | sed 's/^UNTESTED_/UNMAINTAINED_/g'); \ + echo "Renaming boards/$$BOARD/$$BOARD.config to boards/$$BOARD/$$NEW_BOARD.config"; \ + mkdir -p unmaintained_boards; \ + mv boards/$$BOARD/$$BOARD.config unmaintained_boards/$$BOARD/$$NEW_BOARD.config; \ + echo "Renaming boards/$$BOARD to unmaintainted_boards/$$NEW_BOARD"; \ + rm -rf boards/$$NEW_BOARD; \ + mv boards/$$BOARD unmaintained_boards/$$NEW_BOARD; \ + echo "Replacing $$BOARD with $$NEW_BOARD in .circleci/config.yml. Delete manually entries"; \ sed -i "s/$$BOARD/$$NEW_BOARD/g" .circleci/config.yml board.move_tested_to_untested: @echo "NEW_BOARD variable will add UNTESTED_ prefix to $(BOARD)" @NEW_BOARD=UNTESTED_$(BOARD); \ rm -rf boards/$${NEW_BOARD}; \ + echo "changing $(BOARD) name under boards/$(BOARD)/$(BOARD).config to $${NEW_BOARD}"; \ + sed boards/$(BOARD)/$(BOARD).config 's/$(BOARD)/$${NEW_BOARD}/g'; \ echo "Renaming boards/$(BOARD)/$(BOARD).config to boards/$(BOARD)/$${NEW_BOARD}.config"; \ mv boards/$(BOARD)/$(BOARD).config boards/$(BOARD)/$${NEW_BOARD}.config; \ echo "Renaming boards/$(BOARD) to boards/$${NEW_BOARD}"; \ mv boards/$(BOARD) boards/$${NEW_BOARD}; \ - echo "Replacing $(BOARD) with $${NEW_BOARD} in .circleci/config.yml"; \ + echo "Replacing $(BOARD) with $${NEW_BOARD} in .circleci/config.yml"; \ sed -i "s/$(BOARD)/$${NEW_BOARD}/g" .circleci/config.yml +board.move_tested_to_unmaintained: + @echo "Moving $(BOARD) from tested to unmaintained status" + @NEW_BOARD=UNMAINTAINED_$(BOARD); \ + INCLUDE_BOARD=$$(grep "include \$$(pwd)/boards/" boards/$(BOARD)/$(BOARD).config | sed 's/.*boards\/\(.*\)\/.*/\1/'); \ + NEW_INCLUDE_BOARD=UNMAINTAINED_$${INCLUDE_BOARD}; \ + echo "Updating config file: boards/$(BOARD)/$(BOARD).config"; \ + sed -i 's/$(BOARD)/'$${NEW_BOARD}'/g' boards/$(BOARD)/$(BOARD).config; \ + if [ -n "$$INCLUDE_BOARD" ]; then \ + sed -i 's/'$$INCLUDE_BOARD'/'$$NEW_INCLUDE_BOARD'/g' boards/$(BOARD)/$(BOARD).config; \ + fi; \ + echo "Creating unmaintained_boards directory if it doesn't exist"; \ + mkdir -p unmaintained_boards/$${NEW_BOARD}; \ + echo "Moving and renaming config file to unmaintained_boards/$${NEW_BOARD}/$${NEW_BOARD}.config"; \ + mv boards/$(BOARD)/$(BOARD).config unmaintained_boards/$${NEW_BOARD}/$${NEW_BOARD}.config; \ + echo "Moving board directory contents to unmaintained_boards/$${NEW_BOARD}"; \ + mv boards/$(BOARD)/* unmaintained_boards/$${NEW_BOARD}/; \ + rmdir boards/$(BOARD); \ + echo "Updating .circleci/config.yml"; \ + sed -i "s/$(BOARD)/$${NEW_BOARD}/g" .circleci/config.yml; \ + echo "Operation completed for $(BOARD) -> $${NEW_BOARD}"; \ + echo "Please manually review and remove any unnecessary entries in .circleci/config.yml" + # Inject a GPG key into the image - this is most useful when testing in qemu, # since we can't reflash the firmware in qemu to update the keychain. Instead, # inject the public key ahead of time. Specify the location of the key with @@ -759,13 +979,70 @@ $(board_build)/$(CB_OUTPUT_BASENAME)-gpg-injected.rom: $(board_build)/$(CB_OUTPU ./bin/inject_gpg_key.sh --cbfstool "$(build)/$(coreboot_dir)/cbfstool" \ "$(board_build)/$(CB_OUTPUT_FILE_GPG_INJ)" "$(PUBKEY_ASC)" + + +#Dev cycles helpers: + +# Helper function to overwrite coreboot git repo's .canary file with a bogus commit (.canary checked for matching commit on build) +# TODO: Implement a cleaner solution to ensure files created by patches are properly deleted instead of requiring manual intervention. +define overwrite_canary_if_coreboot_git + @echo "Checking for coreboot directory: build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)" + if [ -d "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)" ] && \ + [ -d "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.git" ]; then \ + echo "INFO: Recreating .canary file for 'build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)' with placeholder." && \ + echo BOGUS_COMMIT_ID > "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.canary" && \ + echo "INFO: .canary file has been recreated." ; \ + else \ + echo "INFO: Coreboot directory or .git not found, skipping .canary overwrite." ; \ + fi +endef + real.clean: + @echo "Cleaning build artifacts and install directories, leaving crossgcc intact." for dir in \ $(module_dirs) \ $(kernel_headers) \ ; do \ if [ ! -z "$$dir" ]; then \ - rm -rf "build/${CONFIG_TARGET_ARCH}/$$dir"; \ - fi; \ + rm -rf "build/${CONFIG_TARGET_ARCH}/$$dir" ; \ + fi ; \ done cd install && rm -rf -- * + $(call overwrite_canary_if_coreboot_git) + +real.gitclean: + @echo "Cleaning the repository using Git ignore file as a base..." + @echo "This will wipe everything not in the Git tree, but keep downloaded coreboot forks (detected as Git repos)." + git clean -fxd + $(call overwrite_canary_if_coreboot_git) + +real.gitclean_keep_packages: + @echo "Cleaning the repository using Git ignore file as a base..." + @echo "This will wipe everything not in the Git tree, but keep the 'packages' directory." + git clean -fxd -e "packages" + $(call overwrite_canary_if_coreboot_git) + +real.remove_canary_files-extract_patch_rebuild_what_changed: + @echo "Removing 'canary' files to force Heads to restart building board configurations..." + @echo "This will check package integrity, extract them, redo patching on files, and rebuild what needs to be rebuilt." + @echo "It will also reinstall the necessary files under './install'." + @echo "Limitations: If a patch creates a file in an extracted package directory, this approach may fail without further manual actions." + @echo "In such cases, Git will inform you about the file that couldn't be created as expected. Simply delete those files and relaunch the build." + @echo "This approach economizes time since most build artifacts do not need to be rebuilt, as the file dates should be the same as when you originally built them." + @echo "Only a minimal time is needed for rebuilding, which is also good for your SSD." + @echo "*** USE THIS APPROACH FIRST ***" + @echo "Removing ./build .canary files..." + @find ./build/ -type f -name ".canary" -print -delete || true + @echo "Removing install/*/* content..." + @find ./install/*/* -print -exec rm -rf {} + 2>/dev/null || true + @echo "Removing coreboot board related artifact directory: $(build)/$(coreboot_dir)" + rm -rf "$(build)/$(coreboot_dir)" + @echo "Removing coreboot board related artifacts directory $(board_build)" + rm -rf "$(board_build)" + $(call overwrite_canary_if_coreboot_git) + +real.gitclean_keep_packages_and_build: + @echo "Cleaning the repository using Git ignore file as a base..." + @echo "This will wipe everything not in the Git tree, but keep the 'packages' and 'build' directories." + git clean -fxd -e "packages" -e "build" + $(call overwrite_canary_if_coreboot_git) diff --git a/README.md b/README.md index a0819f48a..1dece18fa 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Heads booting on an x230](https://user-images.githubusercontent.com/827570/156627927-7239a936-e7b1-4ffb-9329-1c422dc70266.jpeg) Heads: the other side of TAILS -=== +== Heads is a configuration for laptops and servers that tries to bring more security to commodity hardware. Among its goals are: @@ -25,11 +25,147 @@ Documentation === Please refer to [Heads-wiki](https://osresearch.net) for your Heads' documentation needs. +Contributing +=== +We welcome contributions to the Heads project! Before contributing, please read our [Contributing Guidelines](CONTRIBUTING.md) for information on how to get started, submit issues, and propose changes. + + +Building heads with prebuilt and versioned docker images +== + +Heads now builds with Nix built docker images since https://github.com/linuxboot/heads/pull/1661. -Building heads +The short path to build Heads is to do what CircleCI would do (./docker_repro.sh under heads git cloned directory): +- Install _docker-ce_ for your OS of choice (refer to their documentation) +- run `./docker_repro.sh make BOARD=XYZ` + +Using Nix local dev environement / building docker images with Nix +== + +Under QubesOS? === +* Setup nix persistent layer under QubesOS (Thanks @rapenne-s !) + * https://dataswamp.org/~solene/2023-05-15-qubes-os-install-nix.html +* Install docker under QubesOS (imperfect old article of mine. Better somewhere?) + * https://gist.github.com/tlaurion/9113983bbdead492735c8438cd14d6cd + +Build docker from nix develop layer locally +=== + +#### Set up Nix and flakes + +* If you don't already have Nix, install it: + * `[ -d /nix ] || sh <(curl -L https://nixos.org/nix/install) --no-daemon` + * `. /home/user/.nix-profile/etc/profile.d/nix.sh` +* Enable flake support in nix + * `mkdir -p ~/.config/nix` + * `echo 'experimental-features = nix-command flakes' >>~/.config/nix/nix.conf` + + +#### Build image + +* Have docker and Nix installed + +* Build nix developer local environment with flakes locked to specified versions + * `./docker_local_dev.sh` + +On some hardened OSes, you may encounter problems with ptrace. +``` + > proot error: ptrace(TRACEME): Operation not permitted +``` +The most likely reason is that your [kernel.yama.ptrace_scope](https://www.kernel.org/doc/Documentation/security/Yama.txt) variable is too high and doesn't allow docker+nix to run properly. +You'll need to set kernel.yama.ptrace_scope to 1 while you build the heads binary. + +``` +sudo sysctl kernel.yama.ptrace_scope #show you the actual value, probably 2 or 3 +sudo sysctl -w kernel.yama.ptrace_scope=1 #setup the value to let nix+docker run properly +``` +(don't forget to put back the value you had after finishing build head) + +Done! + +Your local docker image "linuxboot/heads:dev-env" is ready to use, reproducible for the specific Heads commit used to build it, and will produce ROMs reproducible for that Heads commit ID. + +Jump into nix develop created docker image for interactive workflow +==== +There is 3 helpers: +- `./docker_local_dev.sh`: for developers wanting to customize docker image built from flake.nix(nix devenv creation) and flake.lock (pinned versions used by flake.nix) +- `./docker_latest.sh`: for Heads developers, wanting to use latest published docker images to develop Heads +- `./docker_repro.sh`: versioned docker image used under CircleCI to produce reproducivle builds, both locally and under CircleCI. **Use this one if in doubt** + +ie: `./docker_repro.sh` will jump into CircleCI used versioned docker image for that Heads commit id to build images reproducibly if git repo is clean (not dirty). + +From there you can use the docker image interactively. + `make BOARD=board_name` where board_name is the name of the board directory under `./boards` directory. + +One such useful example is to build and test qemu board roms and test them through qemu/kvm/swtpm provided in the docker image. +Please refer to [qemu documentation](targets/qemu.md) for more information. + +Eg: +``` +./docker_repro.sh make BOARD=qemu-coreboot-fbwhiptail-tpm2 # Build rom, export public key to emulated usb storage from qemu runtime +./docker_repro.sh make BOARD=qemu-coreboot-fbwhiptail-tpm2 PUBKEY_ASC=~/pubkey.asc inject_gpg # Inject pubkey into rom image +./docker_repro.sh make BOARD=qemu-coreboot-fbwhiptail-tpm2 USB_TOKEN=Nitrokey3NFC PUBKEY_ASC=~/pubkey.asc ROOT_DISK_IMG=~/qemu-disks/debian-9.cow2 INSTALL_IMG=~/Downloads/debian-9.13.0-amd64-xfce-CD-1.iso run # Install +``` + +Alternatively, you can use locally built docker image to build a board ROM image in a single call **but do not expect reproducible builds if not using versioned docker images as per CircleCI as per usage of `./docker_repro.sh`** + +Eg: +`./docker_local_dev.sh make BOARD=nitropad-nv41` + + +Pull docker hub image to prepare reproducible ROMs as CircleCI in one call +==== +``` +./docker_repro.sh make BOARD=x230-hotp-maximized +./docker_repro.sh make BOARD=nitropad-nv41 +``` + +Maintenance notes on docker image +=== +Redo the steps above in case the flake.nix or nix.lock changes. Commit changes. Then publish on docker hub: + +``` +#put relevant things in variables: +docker_version="vx.y.z" && docker_hub_repo="tlaurion/heads-dev-env" +#update pinned packages to latest available ones if needed, modify flake.nix derivatives if needed: +nix flakes update +#modify CircleCI image to use newly pushed docker image +sed "s@\(image: \)\(.*\):\(v[0-9]*\.[0-9]*\.[0-9]*\)@\1\2:$docker_version@" -i .circleci/config.yml +# commit changes +git commit --signoff -m "Bump nix develop based docker image to $docker_hub_repo:$docker_version" +#use commited flake.nix and flake.lock in nix develop +nix --print-build-logs --verbose develop --ignore-environment --command true +#build new docker image from nix develop environement +nix --print-build-logs --verbose build .#dockerImage && docker load < result +#tag produced docker image with new version +docker tag linuxboot/heads:dev-env "$docker_hub_repo:$docker_version" +#push newly created docker image to docker hub +docker push "$docker_hub_repo:$docker_version" +#test with CircleCI in PR. Merge. +git push ... +#make last tested docker image version the latest +docker tag "$docker_hub_repo:$docker_version" "$docker_hub_repo:latest" +docker push "$docker_hub_repo:latest" +``` + +This can be put in reproducible oneliners to ease maintainership. + +Test image in dirty mode: +``` +docker_version="vx.y.z" && docker_hub_repo="tlaurion/heads-dev-env" && sed "s@\(image: \)\(.*\):\(v[0-9]*\.[0-9]*\.[0-9]*\)@\1\2:$docker_version@" -i .circleci/config.yml && nix --print-build-logs --verbose develop --ignore-environment --command true && nix --print-build-logs --verbose build .#dockerImage && docker load < result && docker tag linuxboot/heads:dev-env "$docker_hub_repo:$docker_version" && docker push "$docker_hub_repo:$docker_version" +``` + +Notes: +- Local builds can use ":latest" tag, which will use latest tested successful CircleCI run +- To reproduce CirlceCI results, make sure to use the same versioned tag declared under .circleci/config.yml's "image:" + + + +General notes on reproducible builds +=== In order to build reproducible firmware images, Heads builds a specific version of gcc and uses it to compile the Linux kernel and various tools that go into the initrd. Unfortunately this means the first step is a diff --git a/WP_NOTES.md b/WP_NOTES.md new file mode 100644 index 000000000..5ff46a785 --- /dev/null +++ b/WP_NOTES.md @@ -0,0 +1,22 @@ +Flashrom was passed to flashprog under https://github.com/linuxboot/heads/pull/1769 + +Those are notes for @i-c-o-n and others wanting to move WP forward but track issues and users + +The problem with WP is that it is desired but even if partial write protection regions is present, WP is widely unused. + +Some random notes since support is incomplete (depends on chips, really) +-QDPI is problematic for WP (same IO2 PIN) + - Might be turned on by chipset for ME read https://matrix.to/#/!pAlHOfxQNPXOgFGTmo:matrix.org/$NCNidoPsw1ze6zv3m2jlPuGuNrdlDQmDcU81If-q55A?via=matrix.org&via=nitro.chat&via=tchncs.de +- WP wanted, WP done, WP unused + - WP wanted https://github.com/flashrom/flashrom/issues/185 https://github.com/linuxboot/heads/issues/985 + - WP done: https://github.com/linuxboot/heads/issues/1741 https://github.com/linuxboot/heads/issues/1546 + - Documented https://docs.dasharo.com/variants/asus_kgpe_d16/spi-wp/ + - WP still unused + +Alternative, as suggested by @i-c-o-n is Chipset Platform Locking (PR0) which is enforced at platform's chipset level for a boot +- This is implemented and enforced on <= Haswell from this PR merged : https://github.com/linuxboot/heads/pull/1373 +- Non-upstreamed work has been made from @root-hardenedvault work in vaultboot downstream fork of Heads at https://github.com/hardenedvault/vaultboot/blob/master/patches/coreboot/0001-x11.patch +- Discussion point under flashrom-> flashprog PR under https://github.com/linuxboot/heads/pull/1769/files/f8eb0a27c3dcb17a8c6fcb85dd7f03e8513798ae#r1752395865 tagging @i-c-o-n + + +Not sure what is the way forward here, but lets keep this file in tree to track improvements over time. diff --git a/bin/cpio-clean b/bin/cpio-clean index c7e7ea51b..8eaa81f14 100755 --- a/bin/cpio-clean +++ b/bin/cpio-clean @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl # Clean all non-deterministric fields in a newc cpio file # # Items fixed: diff --git a/bin/fetch_coreboot_crossgcc_archive.sh b/bin/fetch_coreboot_crossgcc_archive.sh index 58ba0c467..f9ff04c49 100755 --- a/bin/fetch_coreboot_crossgcc_archive.sh +++ b/bin/fetch_coreboot_crossgcc_archive.sh @@ -105,7 +105,7 @@ case "$PKG_NAME" in acpica) # Original acpica sources are gone. Most of the older releases # can be found here - PKG_BASEURL="https://distfiles.macports.org/acpica/" + PKG_BASEURL="https://mirror.math.princeton.edu/pub/libreboot/misc/acpica/" # Version 20220331 (currently used by talos_2) isn't there, but # there is an old link from Intel that is still up. This is # specific to this release. diff --git a/bin/fetch_source_archive.sh b/bin/fetch_source_archive.sh index 76cb0e60f..0738395ff 100755 --- a/bin/fetch_source_archive.sh +++ b/bin/fetch_source_archive.sh @@ -4,6 +4,7 @@ set -eo pipefail # Mirror URLs, make sure these end in slashes. BACKUP_MIRRORS=( https://storage.puri.sm/heads-packages/ + https://storage.puri.st/heads-packages/ ) usage() diff --git a/bin/find_undocumented_config.sh b/bin/find_undocumented_config.sh new file mode 100755 index 000000000..d33637189 --- /dev/null +++ b/bin/find_undocumented_config.sh @@ -0,0 +1,47 @@ +#! /usr/bin/env bash + +set -eo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/.." + +# By default, just show the variables. Invoke with --show-files to show where +# each undocumented variable appears (up to 3 occurrences) +SHOW_FILES= +if [ "$1" = --show-files ]; then + SHOW_FILES=y +fi + +# Don't search the entire repo, we only want config variables used by Heads: +# - config and patches contain lots of CONFIG_ variables from other projects, +# ignore them +# - build/crossgcc/packages are all build outputs and will also contain lots of +# other projects, ignore them +# - modules files are mostly relevant (many do define CONFIG_ variables to +# tweak the module), but a few have several variables actually from the +# project being configured, not used by Heads. Exclude specific files only +# +# boards, initrd, Makefile, and modules cover all Heads variables pretty well +# without introducing many false positives. +GREP_VARS=(-EroIh '\bCONFIG_[A-Za-z0-9_]+') +EXCLUDE_MODULES=" +flashrom +flashprog +coreboot +" +ALL_VARS="$(grep "${GREP_VARS[@]}" boards initrd Makefile)" +ALL_VARS+="$(grep --exclude-from=<(echo "${EXCLUDE_MODULES[@]}") "${GREP_VARS[@]}" modules)" + +ALL_VARS="$(echo "$ALL_VARS" | sort | uniq)" + +# Check each variable to see if it's already documented +while IFS= read -r var; do + if ! grep -Eq "\b$var\b" doc/config.md; then + if [ "$SHOW_FILES" = y ]; then + echo + echo "$var" + grep -r "$var" boards initrd Makefile modules | head -3 || true + else + echo "$var" + fi + fi +done < <(echo "$ALL_VARS") diff --git a/bin/prepare_module_config.sh b/bin/prepare_module_config.sh new file mode 100755 index 000000000..ba312ebfc --- /dev/null +++ b/bin/prepare_module_config.sh @@ -0,0 +1,27 @@ +#! /usr/bin/env bash + +TEMPLATE="$1" +RESULT="$2" +BOARD_BUILD="$3" +BRAND_NAME="$4" + +repo="$(realpath "$(dirname "${BASH_SOURCE[0]}")/..")" +# For both coreboot and Linux, the config file is in a board- +# specific build directory, but the build occurs from the +# parent of that directory. +module_dir="$(realpath "$(dirname "$2")/..")" + +# Use relative paths since the config may be part of the ROM +# artifacts, and relative paths won't depend on the workspace +# absolute path. +board_build_rel="$(realpath --relative-to "$module_dir" "$BOARD_BUILD")" +repo_rel="$(realpath --relative-to "$module_dir" "$repo")" + +echo "board_build_rel=$board_build_rel" +echo "repo_rel=$repo_rel" + +sed -e "s!@BOARD_BUILD_DIR@!${board_build_rel}!g" \ + -e "s!@BLOB_DIR@!${repo_rel}/blobs!g" \ + -e "s!@BRAND_DIR@!${repo_rel}/branding/$BRAND_NAME!g" \ + -e "s!@BRAND_NAME@!$BRAND_NAME!g" \ + "$TEMPLATE" > "$RESULT" diff --git a/bin/seed_package_mirror.sh b/bin/seed_package_mirror.sh new file mode 100755 index 000000000..731603cc7 --- /dev/null +++ b/bin/seed_package_mirror.sh @@ -0,0 +1,64 @@ +#! /usr/bin/env bash + +set -eo pipefail + +usage() { +cat >&2 < + +Downloads all current package artifacts needed to build Heads and copies them +to a mirror directory, for seeding a package mirror. + +Parameters: + : Path to a directory where the packages are placed. + Created if it does not already exist. +USAGE_END +} + +ARGS_DONE= +while [[ $# -ge 1 ]] && [ -z "$ARGS_DONE" ]; do + case "$1" in + --) + ARGS_DONE=y + shift + ;; + --help) + usage + exit 0 + ;; + --*) + echo "unknown parameter: $1" >&2 + usage + exit 1 + ;; + *) + ARGS_DONE=y + ;; + esac +done + +if [[ $# -ne 1 ]]; then + usage + exit 1 +fi + +ARG_MIRROR_DIR="$(realpath "$1")" + +cd "$(dirname "${BASH_SOURCE[0]}")/.." + +echo +echo "Cleaning build to download all packages..." +# fetch packages for representative boards +rm -rf build/x86 build/ppc64 +rm -rf packages/x86 packages/ppc64 +echo +echo "Downloading packages..." +make packages BOARD=qemu-coreboot-fbwhiptail-tpm1-hotp +make packages BOARD=UNTESTED_talos-2 # newt, PPC +make packages BOARD=librem_l1um_v2 # TPM2 +make packages BOARD=librem_l1um # coreboot 4.11 +make packages BOARD=x230-maximized # io386 +echo +echo "Copying to mirror directory..." +mkdir -p "$ARG_MIRROR_DIR" +cp packages/x86/* packages/ppc64/* "$ARG_MIRROR_DIR/" diff --git a/bin/verity-sign b/bin/verity-sign index d616a0d37..2074555ee 100755 --- a/bin/verity-sign +++ b/bin/verity-sign @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl # Generate dm-verity hashes and sign the root hash # # Output looks like diff --git a/blobs/haswell/.gitignore b/blobs/haswell/.gitignore new file mode 100644 index 000000000..b3810c18c --- /dev/null +++ b/blobs/haswell/.gitignore @@ -0,0 +1 @@ +mrc.bin diff --git a/blobs/haswell/obtain-mrc b/blobs/haswell/obtain-mrc index 42a6daabd..3e87cab32 100755 --- a/blobs/haswell/obtain-mrc +++ b/blobs/haswell/obtain-mrc @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e diff --git a/blobs/optiplex_9010/README.md b/blobs/optiplex_9010/README.md new file mode 100644 index 000000000..044067848 --- /dev/null +++ b/blobs/optiplex_9010/README.md @@ -0,0 +1,16 @@ +This blobs/optiplex_9010/ifd.bin is a configuration blob, and comes from my optiplex 9010 backup. +It was put in place with: + +python ~/me_cleaner/me_cleaner.py -S -r -t -d -O /tmp/discarded.bin -D ~/heads/blobs/optiplex_9010/ifd.bin -M /tmp/temporary_me.bin optiplex_9010-internal_backup.rom +./build/x86/coreboot-24.02.01/util/ifdtool/ifdtool -n blobs/optiplex_9010/layout.txt blobs/optiplex_9010/ifd.bin -O blobs/optiplex_9010/ifd.bin + +NOTE: We rely on blobs/optiplex_9010/layout.txt which changes the size of the ME region to match Lenovo xx30 blob used in x230 and others. + +---- + +blobs/optiplex_9010/ifd_t16650.bin comes from https://codeberg.org/libreboot/lbmk/src/branch/master/config/ifd/t1650/12_ifd +Libreboot uses xx30 ME (downloaded from Lenovo, extracted+ neutered) as well, and reuses the dell t1650 IFD for their build, which we borrowed here with: + +wget https://codeberg.org/libreboot/lbmk/raw/branch/master/config/ifd/t1650/12_ifd -O ifd.bin + +Doc: https://libreboot.org/docs/install/dell7010.html diff --git a/blobs/optiplex_9010/ifd.bin b/blobs/optiplex_9010/ifd.bin new file mode 100644 index 000000000..89cb62e6d Binary files /dev/null and b/blobs/optiplex_9010/ifd.bin differ diff --git a/blobs/optiplex_9010/ifd_t16650.bin b/blobs/optiplex_9010/ifd_t16650.bin new file mode 100644 index 000000000..623470e94 Binary files /dev/null and b/blobs/optiplex_9010/ifd_t16650.bin differ diff --git a/blobs/optiplex_9010/layout.txt b/blobs/optiplex_9010/layout.txt new file mode 100644 index 000000000..ed873dfd1 --- /dev/null +++ b/blobs/optiplex_9010/layout.txt @@ -0,0 +1,4 @@ +00000000:00000fff fd +00001000:00004fff gbe +00005000:0001cfff me +0001d000:00bfffff bios diff --git a/blobs/p8z77-m_pro/download_BIOS_clean.sh b/blobs/p8z77-m_pro/download_BIOS_clean.sh index 673a617e4..6f604106e 100755 --- a/blobs/p8z77-m_pro/download_BIOS_clean.sh +++ b/blobs/p8z77-m_pro/download_BIOS_clean.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # P7 ASUS function printusage { diff --git a/blobs/t420/extract.sh b/blobs/t420/extract.sh index 422924741..3c8920430 100755 --- a/blobs/t420/extract.sh +++ b/blobs/t420/extract.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash function printusage { echo "Usage: $0 -f -m (optional) -i (optional)" diff --git a/blobs/t440p/.gitignore b/blobs/t440p/.gitignore new file mode 100644 index 000000000..24d49395b --- /dev/null +++ b/blobs/t440p/.gitignore @@ -0,0 +1 @@ +me.bin diff --git a/blobs/t440p/download-clean-me b/blobs/t440p/download-clean-me index 26297d89e..37411a40f 100755 --- a/blobs/t440p/download-clean-me +++ b/blobs/t440p/download-clean-me @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e diff --git a/blobs/t440p/extract b/blobs/t440p/extract index 0307b93b6..88a66bbc7 100755 --- a/blobs/t440p/extract +++ b/blobs/t440p/extract @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e diff --git a/blobs/xx30/me_cleaner.py b/blobs/utils/me_cleaner/me_cleaner.py similarity index 99% rename from blobs/xx30/me_cleaner.py rename to blobs/utils/me_cleaner/me_cleaner.py index c2adf0e80..46f883e30 100755 --- a/blobs/xx30/me_cleaner.py +++ b/blobs/utils/me_cleaner/me_cleaner.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # me_cleaner - Tool for partial deblobbing of Intel ME/TXE firmware images # Copyright (C) 2016-2018 Nicola Corna diff --git a/blobs/w541/.gitignore b/blobs/w541/.gitignore new file mode 100644 index 000000000..24d49395b --- /dev/null +++ b/blobs/w541/.gitignore @@ -0,0 +1 @@ +me.bin diff --git a/blobs/w541/download-clean-me b/blobs/w541/download-clean-me index 26297d89e..37411a40f 100755 --- a/blobs/w541/download-clean-me +++ b/blobs/w541/download-clean-me @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e diff --git a/blobs/w541/extract b/blobs/w541/extract index 0307b93b6..88a66bbc7 100755 --- a/blobs/w541/extract +++ b/blobs/w541/extract @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e diff --git a/blobs/x220/extract.sh b/blobs/x220/extract.sh index 422924741..3c8920430 100755 --- a/blobs/x220/extract.sh +++ b/blobs/x220/extract.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash function printusage { echo "Usage: $0 -f -m (optional) -i (optional)" diff --git a/blobs/xx20/.gitignore b/blobs/xx20/.gitignore new file mode 100644 index 000000000..24d49395b --- /dev/null +++ b/blobs/xx20/.gitignore @@ -0,0 +1 @@ +me.bin diff --git a/blobs/xx20/download_parse_me.sh b/blobs/xx20/download_parse_me.sh index 894a2e069..1289c66aa 100755 --- a/blobs/xx20/download_parse_me.sh +++ b/blobs/xx20/download_parse_me.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash BLOBDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" diff --git a/blobs/xx20/me7_update_parser.py b/blobs/xx20/me7_update_parser.py index 8f201c26d..f862140d9 100644 --- a/blobs/xx20/me7_update_parser.py +++ b/blobs/xx20/me7_update_parser.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python """ME7 Update binary parser.""" diff --git a/blobs/xx30/.gitignore b/blobs/xx30/.gitignore new file mode 100644 index 000000000..b925978a4 --- /dev/null +++ b/blobs/xx30/.gitignore @@ -0,0 +1,4 @@ +me.bin +IVB_BIOSAC_PRODUCTION.bin +SNB_IVB_SINIT_20190708_PW.bin +sch5545_ecfw.bin diff --git a/blobs/xx30/download_clean_me.sh b/blobs/xx30/download_clean_me.sh index a259a6477..994f1cdbc 100755 --- a/blobs/xx30/download_clean_me.sh +++ b/blobs/xx30/download_clean_me.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash function printusage { echo "Usage: $0 -m (optional)" diff --git a/blobs/xx30/download_clean_me_manually.sh b/blobs/xx30/download_clean_me_manually.sh index c2cfc9d36..d7e44d010 100755 --- a/blobs/xx30/download_clean_me_manually.sh +++ b/blobs/xx30/download_clean_me_manually.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash function printusage { echo "Usage: $0 -m (optional)" diff --git a/blobs/xx30/extract.sh b/blobs/xx30/extract.sh index f63c4d31e..3a5ee504a 100755 --- a/blobs/xx30/extract.sh +++ b/blobs/xx30/extract.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash function printusage { echo "Usage: $0 -f -m (optional) -i (optional)" diff --git a/blobs/xx30/optiplex_7010_9010.sh b/blobs/xx30/optiplex_7010_9010.sh new file mode 100755 index 000000000..2b215248c --- /dev/null +++ b/blobs/xx30/optiplex_7010_9010.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +EC_BLOB_HASH=20060eba91367b71a21c7757271ac642fa0376809f8c1b51066510246ac97bdb +ACM_BLOB_HASH=b00d10f6615cf1b28f4fb4adac6631bf6e332db524e45dfafb92e539767d22a0 +SINIT_BLOB_HASH=1e888aebc78d637d119c489adffa95387b53429125dc3ad61f10a5cad0496834 + +output_dir="$(realpath "${1:-./}")" + +if [[ ! -f "${output_dir}/IVB_BIOSAC_PRODUCTION.bin" ]] || [[ ! -f "${output_dir}/sch5545_ecfw.bin" ]] || [[ ! -f "${output_dir}/SNB_IVB_SINIT_20190708_PW.bin" ]] ; then + # Unpack Dell's Windows installer into a temporary directory and + # extract the EC and ACM blobs + + pushd "$(mktemp -d)" || exit + + #Download Dell firmware update package + wget --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" https://dl.dell.com/FOLDER05066036M/1/O7010A29.exe \ + || wget https://web.archive.org/web/20241007124946/https://dl.dell.com/FOLDER05066036M/1/O7010A29.exe + + #Extract binary + binwalk -e O7010A29.exe -C . --run-as=root + + #Extract blobs + #uefi-firmware-parser -e "_O7010A29.exe.extracted/65C10" -O + uefi-firmware-parser -b "_O7010A29.exe.extracted/65C10" -e -o extract + + #EC + cp ./extract/volume-327768/file-d386beb8-4b54-4e69-94f5-06091f67e0d3/section0.raw sch5545_ecfw.bin + + mv sch5545_ecfw.bin "${output_dir}/" + + #ACM + cp ./extract/volume-5242968/file-2d27c618-7dcd-41f5-bb10-21166be7e143/object-0.raw IVB_BIOSAC_PRODUCTION.bin + mv IVB_BIOSAC_PRODUCTION.bin "${output_dir}/" + + #Download sinit + # Original URL got rid of needed file, keeping original URL. Let's use archive.org + #wget https://cdrdv2.intel.com/v1/dl/getContent/630744 -O sinit.zip + wget http://web.archive.org/web/20230712081031/https://cdrdv2.intel.com/v1/dl/getContent/630744 -O sinit.zip + unzip sinit.zip + mv 630744_002/SNB_IVB_SINIT_20190708_PW.bin "${output_dir}/" + + popd || exit +fi + +if ! echo "${EC_BLOB_HASH} ${output_dir}/sch5545_ecfw.bin" | sha256sum --check; then + echo "ERROR: SHA256 checksum for sch5545_ecfw.bin doesn't match. Try again" + rm -f "${output_dir}/sch5545_ecfw.bin" + exit 1 +fi + + +if ! echo "${ACM_BLOB_HASH} ${output_dir}/IVB_BIOSAC_PRODUCTION.bin" | sha256sum --check; then + echo "ERROR: SHA256 checksum for IVB_BIOSAC_PRODUCTION.bin doesn't match. Try again" + rm -f "${output_dir}/IVB_BIOSAC_PRODUCTION.bin" + exit 1 +fi + + +if ! echo "${SINIT_BLOB_HASH} ${output_dir}/SNB_IVB_SINIT_20190708_PW.bin" | sha256sum --check; then + echo "ERROR: SHA256 checksum for SNB_IVB_SINIT_20190708_PW.bin doesn't match. Try again" + rm -f "${output_dir}/SNB_IVB_SINIT_20190708_PW.bin" + exit 1 +fi + diff --git a/blobs/xx30/vbios_t530.sh b/blobs/xx30/vbios_t530.sh index 0669859d1..dae75f3f0 100755 --- a/blobs/xx30/vbios_t530.sh +++ b/blobs/xx30/vbios_t530.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash BLOBDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROMPARSER="94a615302f89b94e70446270197e0f5138d678f3" diff --git a/blobs/xx30/vbios_w530.sh b/blobs/xx30/vbios_w530.sh index b5230e0a6..bbff9c8b5 100755 --- a/blobs/xx30/vbios_w530.sh +++ b/blobs/xx30/vbios_w530.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash BLOBDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROMPARSER="94a615302f89b94e70446270197e0f5138d678f3" diff --git a/blobs/xx80/.gitignore b/blobs/xx80/.gitignore new file mode 100644 index 000000000..326bba658 --- /dev/null +++ b/blobs/xx80/.gitignore @@ -0,0 +1,2 @@ +me.bin +tb.bin diff --git a/blobs/xx80/README.md b/blobs/xx80/README.md new file mode 100644 index 000000000..e081c276b --- /dev/null +++ b/blobs/xx80/README.md @@ -0,0 +1,53 @@ +# T480 Blobs + +The following blobs are needed: + +* `ifd.bin` +* `gbe.bin` +* `me.bin` +* `tb.bin` (optional but recommended flashing this blob to the separate Thunderbolt SPI chip to fix a bug in the original firmware) + +## me.bin: automatically extract, neuter and deguard + +download_clean_me.sh : Download vulnerable ME from Dell, verify checksum, extract ME, neuter ME and trim it, then apply the deguard patch and place it into me.bin + +The ME blob dumped in this directory comes from the following link: https://dl.dell.com/FOLDER04573471M/1/Inspiron_5468_1.3.0.exe + +This provides ME version 11.6.0.1126. In this version CVE-2017-5705 has not yet been fixed. +See https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00086.html +Therefore, Bootguard can be disabled by deguard with a patched ME. + +As specified in the first link, this ME can be deployed to: + +* T480 +* T480s + +## ifd.bin and gbe.bin + +Both blobs were taken from libreboot: https://codeberg.org/libreboot/lbmk/src/commit/68ebde2f033ce662813dbf8f5ab21f160014029f/config/ifd/t480 + +The GBE MAC address was forged to: `00:DE:AD:C0:FF:EE MAC` + +## tb.bin + +This blob was extracted from https://download.lenovo.com/pccbbs/mobiles/n24th13w.exe +It is zero-padded to 1MB and should be flashed to the Thunderbolt SPI chip, which is not the same as the 16MB chip to which the heads rom is flashed. External flashing is recommended as the only way to reliably fix a bug in the original Thunderbolt software on the SPI chip. You can find a guide here: https://osresearch.net/T430-maximized-flashing/ + +## Integrity + +Sha256sums: `blobs/xx80/hashes.txt` + +# CAVEATS for the board: + +See the board configs `boards/t480-[hotp-]maximized/t480-[hotp-]maximized.config`: + +> This board is vulnerable to a TPM reset attack, i.e. the PCRs are reset while the system is running. +> This attack can be used to bypass measured boot when an attacker succeeds at modifying the SPI flash. +> Also it can be used to extract FDE keys from a TPM. +> The related coreboot issue contains more information: https://ticket.coreboot.org/issues/576 +> Make sure you understand the implications of the attack for your threat model before using this board. + +# Documentation + +A guide on how to flash this board (both the Heads rom and the Thunderbolt `tb.bin` blob) can be found here: +https://osresearch.net/T430-maximized-flashing/ \ No newline at end of file diff --git a/blobs/xx80/download_clean_deguard_me_pad_tb.sh b/blobs/xx80/download_clean_deguard_me_pad_tb.sh new file mode 100755 index 000000000..290ca416b --- /dev/null +++ b/blobs/xx80/download_clean_deguard_me_pad_tb.sh @@ -0,0 +1,199 @@ +#!/usr/bin/env bash + +# These variables are all for the deguard tool. +# They would need to be changed if using the tool for other devices like the T480s or with a different ME version... +ME_delta="thinkpad_t480" +ME_version="11.6.0.1126" +ME_sku="2M" +ME_pch="LP" + +# Thunderbolt firmware offset in bytes to pad to 1M +TBFW_SIZE=1048575 + +# Integrity checks for the vendor provided ME blob... +ME_DOWNLOAD_HASH="ddfbc51430699e0dfcb24a60bcb5b6e5481b325ebecf1ac177e069013189e4b0" +# ...and the cleaned and deguarded version from that blob. +DEGUARDED_ME_BIN_HASH="1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b" +# Integrity checks for the vendor provided Thunderbolt blob... +TB_DOWNLOAD_HASH="a500a93fe6a3728aa6676c70f98cf46785ef15da7c5b1ccd7d3a478d190a28a8" +# ...and the padded and flashable version from that blob. +TB_BIN_HASH="fc9c47ff4b16f036a7f49900f9da1983a5db44ca46156238b7b42e636d317388" + +function usage() { + echo -n \ + "Usage: $(basename "$0") -m (optional) path_to_output_directory +Download Intel ME firmware from Dell, neutralize and shrink keeping the MFS. +Download Thunderbolt firmware from Lenovo and pad it for flashing externally. +" +} + +function chk_sha256sum() { + sha256_hash="$1" + filename="$2" + echo "$sha256_hash" "$filename" "$(pwd)" + sha256sum "$filename" + if ! echo "${sha256_hash} ${filename}" | sha256sum --check; then + echo "ERROR: SHA256 checksum for ${filename} doesn't match." + exit 1 + fi +} + +function chk_exists_and_matches() { + if [[ -f "$1" ]]; then + if echo "${2} ${1}" | sha256sum --check; then + echo "SKIPPING: SHA256 checksum for $1 matches." + [[ "$3" = ME ]] && me_exists="y" + [[ "$3" = TB ]] && tb_exists="y" + fi + echo "$1 exists but checksum doesn't match. Continuing..." + fi +} + +function download_and_clean() { + me_cleaner="$(realpath "${1}")" + me_output="$(realpath "${2}")" + + # Download and unpack the Dell installer into a temporary directory and + # extract the deguardable Intel ME blob. + pushd "$(mktemp -d)" || exit + + # Download the installer that contains the ME blob + me_installer_filename="Inspiron_5468_1.3.0.exe" + user_agent="Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" + curl -A "$user_agent" -s -O "https://dl.dell.com/FOLDER04573471M/1/${me_installer_filename}" + chk_sha256sum "$ME_DOWNLOAD_HASH" "$me_installer_filename" + + # Download the tool to unpack Dell's installer and unpack the ME blob. + git clone https://github.com/platomav/BIOSUtilities + git -C BIOSUtilities checkout ef50b75ae115ae8162fa8b0a7b8c42b1d2db894b + + python "BIOSUtilities/Dell_PFS_Extract.py" "${me_installer_filename}" -e || exit + + extracted_me_filename="1 Inspiron_5468_1.3.0 -- 3 Intel Management Engine (Non-VPro) Update v${ME_version}.bin" + + # Neutralize and shrink Intel ME. Note that this doesn't include + # --soft-disable to set the "ME Disable" or "ME Disable B" (e.g., + # High Assurance Program) bits, as they are defined within the Flash + # Descriptor. + # However, the HAP bit must be enabled to make the deguarded ME work. We only clean the ME in this function. + # https://github.com/corna/me_cleaner/wiki/External-flashing#neutralize-and-shrink-intel-me-useful-only-for-coreboot + + # MFS is needed for deguard so we whitelist it here and also do not relocate the FTPR partition + python "$me_cleaner" --whitelist MFS -t -O "$me_output" "${me_installer_filename}_extracted/Firmware/${extracted_me_filename}" + rm -rf ./* + popd || exit +} + +function deguard() { + me_input="$(realpath "${1}")" + me_output="$(realpath "${2}")" + + # Download the deguard tool into a temporary directory and apply the patch to the cleaned ME blob. + pushd "$(mktemp -d)" || exit + git clone https://github.com/coreboot/deguard + pushd deguard || exit + git checkout 0ed3e4ff824fc42f71ee22907d0594ded38ba7b2 + + python ./finalimage.py \ + --delta "data/delta/$ME_delta" \ + --version "$ME_version" \ + --pch "$ME_pch" \ + --sku "$ME_sku" \ + --fake-fpfs data/fpfs/zero \ + --input "$me_input" \ + --output "$me_output" + + popd || exit + #Cleanup + rm -rf ./* + popd || exit +} + +function download_and_pad_tb() { + tb_output="$(realpath "${1}")" + + # Download and unpack the Lenovo installer into a temporary directory and + # extract the TB blob. + pushd "$(mktemp -d)" || exit + + # Download the installer that contains the TB blob + tb_installer_filename=""n24th13w.exe"" + user_agent="Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" + curl -A "$user_agent" -s -O "https://download.lenovo.com/pccbbs/mobiles/${tb_installer_filename}" + chk_sha256sum "$TB_DOWNLOAD_HASH" "$tb_installer_filename" + + # https://www.reddit.com/r/thinkpad/comments/9rnimi/ladies_and_gentlemen_i_present_to_you_the/ + innoextract n24th13w.exe -d . + mv ./code\$GetExtractPath\$/TBT.bin tb.bin + # pad with zeros + dd if=/dev/zero of=tb.bin bs=1 seek="$TBFW_SIZE" count=1 + mv "tb.bin" "$tb_output" + + rm -rf ./* + popd || exit +} + +function usage_err() { + echo "$1" + usage + exit 1 +} + +function parse_params() { + while getopts ":m:" opt; do + case $opt in + m) + if [[ -x "$OPTARG" ]]; then + me_cleaner="$OPTARG" + fi + ;; + ?) + usage_err "Invalid Option: -$OPTARG" + ;; + esac + done + + if [[ -z "${me_cleaner}" ]]; then + if [[ -z "${COREBOOT_DIR}" ]]; then + usage_err "ERROR: me_cleaner.py not found. Set path with -m parameter or define the COREBOOT_DIR variable." + else + me_cleaner="${COREBOOT_DIR}/util/me_cleaner/me_cleaner.py" + fi + fi + echo "Using me_cleaner from ${me_cleaner}" + + shift $(($OPTIND - 1)) + output_dir="$(realpath "${1:-./}")" + if [[ ! -d "${output_dir}" ]]; then + usage_err "No valid output dir found" + fi + me_cleaned="${output_dir}/me_cleaned.bin" + me_deguarded="${output_dir}/me.bin" + tb_flashable="${output_dir}/tb.bin" + echo "Writing cleaned and deguarded ME to ${me_deguarded}" + echo "Writing flashable TB to ${tb_flashable}" +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + if [[ "${1:-}" == "--help" ]]; then + usage + exit 0 + fi + + parse_params "$@" + chk_exists_and_matches "$me_deguarded" "$DEGUARDED_ME_BIN_HASH" ME + chk_exists_and_matches "$tb_flashable" "$TB_BIN_HASH" TB + + if [[ -z "$me_exists" ]]; then + download_and_clean "$me_cleaner" "$me_cleaned" + deguard "$me_cleaned" "$me_deguarded" + rm -f "$me_cleaned" + fi + + if [[ -z "$tb_exists" ]]; then + download_and_pad_tb "$tb_flashable" + fi + + chk_sha256sum "$DEGUARDED_ME_BIN_HASH" "$me_deguarded" + chk_sha256sum "$TB_BIN_HASH" "$tb_flashable" +fi diff --git a/blobs/xx80/gbe.bin b/blobs/xx80/gbe.bin new file mode 100644 index 000000000..5438dd420 Binary files /dev/null and b/blobs/xx80/gbe.bin differ diff --git a/blobs/xx80/hashes.txt b/blobs/xx80/hashes.txt new file mode 100644 index 000000000..1b4a87e5c --- /dev/null +++ b/blobs/xx80/hashes.txt @@ -0,0 +1,4 @@ +d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin +f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin +1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin +fc9c47ff4b16f036a7f49900f9da1983a5db44ca46156238b7b42e636d317388 tb.bin diff --git a/blobs/xx80/ifd.bin b/blobs/xx80/ifd.bin new file mode 100644 index 000000000..cdeaee4a4 Binary files /dev/null and b/blobs/xx80/ifd.bin differ diff --git a/blobs/z220/.gitignore b/blobs/z220/.gitignore new file mode 100644 index 000000000..0aa573338 --- /dev/null +++ b/blobs/z220/.gitignore @@ -0,0 +1,2 @@ +ifd.bin +me.bin diff --git a/blobs/z220/download_BIOS_clean.sh b/blobs/z220/download_BIOS_clean.sh index 870574c78..b21ae3b2e 100755 --- a/blobs/z220/download_BIOS_clean.sh +++ b/blobs/z220/download_BIOS_clean.sh @@ -1,4 +1,5 @@ -#!/bin/bash +#!/usr/bin/env bash + # Z220 CMT HP function printusage { @@ -65,4 +66,4 @@ echo "$FINAL_ME_SHA256SUM" | sha256sum --check || { echo "Failed sha256sum verif echo "###Cleaning up..." cd - -rm -r "$extractdir" \ No newline at end of file +rm -r "$extractdir" diff --git a/boards/UNTESTED_kgpe-d16_server-whiptail/UNTESTED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config similarity index 85% rename from boards/UNTESTED_kgpe-d16_server-whiptail/UNTESTED_kgpe-d16_server-whiptail.config rename to boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 045ccf01e..27dccb6bf 100644 --- a/boards/UNTESTED_kgpe-d16_server-whiptail/UNTESTED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -19,13 +19,13 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_server-whiptail.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_server-whiptail.config -CONFIG_CRYPTSETUP=y -CONFIG_FLASHROM=y +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -51,6 +51,13 @@ export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOTSCRIPT=/bin/gui-init #export CONFIG_BOOTSCRIPT_NETWORK=/bin/network-init-recovery @@ -70,8 +77,7 @@ export CONFIG_BOOT_STATIC_IP=192.168.2.3 export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="KGPE-D16 Server-whiptail" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASHROM_OPTIONS="--force --noverify -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNTESTED_kgpe-d16_server/UNTESTED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config similarity index 81% rename from boards/UNTESTED_kgpe-d16_server/UNTESTED_kgpe-d16_server.config rename to boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 26a261ec9..8ed475d76 100644 --- a/boards/UNTESTED_kgpe-d16_server/UNTESTED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -17,13 +17,15 @@ # - Please support https://github.com/osresearch/heads/issues/719 export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_server.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_server.config -CONFIG_CRYPTSETUP=y -CONFIG_FLASHROM=y +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +#flashprog to support internal flashing of BMC +CONFIG_FLASHPROG_AST1100=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -41,6 +43,13 @@ CONFIG_LINUX_E1000E=y export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y #BOOT SCRIPT SELECTION export CONFIG_BOOTSCRIPT=/bin/generic-init #export CONFIG_BOOTSCRIPT_NETWORK=/bin/network-init-recovery @@ -56,9 +65,8 @@ export CONFIG_BOOT_STATIC_IP=192.168.2.3 export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="KGPE-D16 Server" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASHROM_OPTIONS="--force --noverify -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config similarity index 82% rename from boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config rename to boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index 78b56ff42..f5c4bfb85 100644 --- a/boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -13,13 +13,13 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_workstation-usb_keyboard.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_workstation.config -CONFIG_CRYPTSETUP=y -CONFIG_FLASHROM=y +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -44,11 +44,18 @@ CONFIG_LINUX_E1000E=y export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y #Enable USB Keyboard support -export CONFIG_USB_KEYBOARD=y +export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init #export CONFIG_BOOTSCRIPT_NETWORK=/bin/network-init-recovery @@ -65,7 +72,6 @@ export CONFIG_BOOT_KERNEL_ADD="nohz=on nouveau.config=NvForcePost=1" export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="KGPE-D16 Workstation-USB-Keyboard" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASHROM_OPTIONS="--force --noverify -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" diff --git a/boards/UNTESTED_kgpe-d16_workstation/UNTESTED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config similarity index 84% rename from boards/UNTESTED_kgpe-d16_workstation/UNTESTED_kgpe-d16_workstation.config rename to boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index 6cee65ca1..0615434b7 100644 --- a/boards/UNTESTED_kgpe-d16_workstation/UNTESTED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -17,13 +17,13 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_workstation.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_workstation.config -CONFIG_CRYPTSETUP=y -CONFIG_FLASHROM=y +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -50,6 +50,13 @@ export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init #export CONFIG_BOOTSCRIPT_NETWORK=/bin/network-init-recovery @@ -66,7 +73,6 @@ export CONFIG_BOOT_KERNEL_ADD="nohz=on nouveau.config=NvForcePost=1" export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="KGPE-D16 Workstation" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASHROM_OPTIONS="--force --noverify -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" diff --git a/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config b/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config new file mode 100644 index 000000000..c8c2e4a57 --- /dev/null +++ b/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config @@ -0,0 +1,81 @@ +# Nitrokey Nitropad NS51 board configuration +# Note: for reference, other GOP enabled FB board is librem_11 +# +# Docs: +# Dissassembly and Recovery: https://docs.dasharo.com/unified/novacustom/recovery/#ns5x7x-12th-gen + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=dasharo +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-ns50.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#TODO: readd when tested +#platform locking finalization (PR0) +#CONFIG_IO386=y +#export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="Nitropad NS50" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" diff --git a/boards/t440p-hotp-maximized/t440p-hotp-maximized.config b/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config similarity index 66% rename from boards/t440p-hotp-maximized/t440p-hotp-maximized.config rename to boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config index da0cd5101..a787f1315 100644 --- a/boards/t440p-hotp-maximized/t440p-hotp-maximized.config +++ b/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config @@ -1,5 +1,5 @@ # Inherit the rest from the base T440p config. -include $(pwd)/boards/t440p-maximized/t440p-maximized.config +include $(pwd)/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config CONFIG_HOTPKEY=y export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config similarity index 72% rename from boards/t440p-maximized/t440p-maximized.config rename to boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config index 4df8061d5..9f376d61c 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config @@ -4,11 +4,11 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-t440p.config CONFIG_LINUX_CONFIG=config/linux-t440p.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -22,7 +22,7 @@ CONFIG_TPMTOTP=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y # Dependencies for a graphical menu. Enable CONFIG_SLANG and CONFIG_NEWT instead @@ -31,14 +31,21 @@ CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad T440p-maximized" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config b/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config index 2a4cb5a46..d62731b7c 100644 --- a/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config +++ b/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a t530 without a dGPU. It will work just fine for a board with a dGPU, except you will not be able to use an external monitor via the mini-displayport or the dock's displayport, though external monitors will work via VGA ports. To initialize the dGPU please use one of the dgpu boards. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -30,7 +31,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -59,14 +60,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T530-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config b/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config index 42eab8f3b..f7a5f4904 100644 --- a/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config +++ b/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a t530 without a dGPU. It will work just fine for a board with a dGPU, except you will not be able to use an external monitor via the mini-displayport or the dock's displayport, though external monitors will work via VGA ports. To initialize the dGPU please use one of the dgpu boards. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -30,7 +31,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -58,14 +59,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T530-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/talos-2/talos-2.config b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config similarity index 67% rename from boards/talos-2/talos-2.config rename to boards/UNTESTED_talos-2/UNTESTED_talos-2.config index d4e98a253..8433881ca 100644 --- a/boards/talos-2/talos-2.config +++ b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config @@ -4,7 +4,10 @@ CONFIG_TARGET_ARCH=ppc64 export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=talos_2 -export CONFIG_LINUX_VERSION=5.5-openpower +export CONFIG_LINUX_VERSION=6.6.16-openpower + +#EXPLICITELY DEACTIVATE KBD + loadkeys + keymap support since doesn't build for now and nobody known to use talos-2 +CONFIG_KBD=n CONFIG_COREBOOT_CONFIG=config/coreboot-talos-2.config CONFIG_COREBOOT_ROM=coreboot.rom.signed.ecc @@ -21,7 +24,7 @@ CONFIG_QRENCODE=y CONFIG_TPMTOTP=y CONFIG_GPG2=y CONFIG_PCIUTILS=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_POWERPC_UTILS=y @@ -37,17 +40,23 @@ CONFIG_DROPBEAR=y # for OpenBMC VGA console export CONFIG_USE_AGETTY=y -export CONFIG_USB_KEYBOARD=y +export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_BOOT_EXTRA_TTYS="tty0" export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/talos-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_REMOVE="quiet" export CONFIG_BOOT_KERNEL_ADD="console=tty0 console=hvc0 rootdelay=3 rootwait panic=10" -export CONFIG_BOOT_DEV="/dev/nvme0n1p2" export CONFIG_BOARD_NAME="Talos 2" -export CONFIG_FLASHROM_OPTIONS="--noverify-all -p linux_mtd" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer linux_mtd" BOARD_TARGETS := ppc_tgz diff --git a/boards/w541-hotp-maximized/w541-hotp-maximized.config b/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config similarity index 66% rename from boards/w541-hotp-maximized/w541-hotp-maximized.config rename to boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config index 204f12525..585ecd73b 100644 --- a/boards/w541-hotp-maximized/w541-hotp-maximized.config +++ b/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config @@ -1,5 +1,5 @@ # Inherit the rest from the base W541 config. -include $(pwd)/boards/w541-maximized/w541-maximized.config +include $(pwd)/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config CONFIG_HOTPKEY=y export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/w541-maximized/w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config similarity index 72% rename from boards/w541-maximized/w541-maximized.config rename to boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config index 60006edda..70fa7f838 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config @@ -4,11 +4,11 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-w541.config CONFIG_LINUX_CONFIG=config/linux-w541.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -22,7 +22,7 @@ CONFIG_TPMTOTP=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y # Dependencies for a graphical menu. Enable CONFIG_SLANG and CONFIG_NEWT instead @@ -31,14 +31,21 @@ CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad W541-maximized" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/boards/z220-cmt-hotp-maximized/z220-cmt-hotp-maximized.config b/boards/UNTESTED_z220-cmt-hotp-maximized/UNTESTED_z220-cmt-hotp-maximized.config similarity index 63% rename from boards/z220-cmt-hotp-maximized/z220-cmt-hotp-maximized.config rename to boards/UNTESTED_z220-cmt-hotp-maximized/UNTESTED_z220-cmt-hotp-maximized.config index 6155c83d2..84f67066a 100644 --- a/boards/z220-cmt-hotp-maximized/z220-cmt-hotp-maximized.config +++ b/boards/UNTESTED_z220-cmt-hotp-maximized/UNTESTED_z220-cmt-hotp-maximized.config @@ -1,7 +1,7 @@ # Inherit the rest from the base Z220 CMT config. -include $(pwd)/boards/z220-cmt-maximized/z220-cmt-maximized.config +include $(pwd)/boards/UNTESTED_z220-cmt-maximized/UNTESTED_z220-cmt-maximized.config CONFIG_HOTPKEY=y export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_BOARD_NAME="Hewlett-Packard Z220 Convertible Minitower (HOTP)" \ No newline at end of file +export CONFIG_BOARD_NAME="Hewlett-Packard Z220 Convertible Minitower (HOTP)" diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/UNTESTED_z220-cmt-maximized/UNTESTED_z220-cmt-maximized.config similarity index 83% rename from boards/z220-cmt-maximized/z220-cmt-maximized.config rename to boards/UNTESTED_z220-cmt-maximized/UNTESTED_z220-cmt-maximized.config index 6a62f851a..dba9a8da6 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/UNTESTED_z220-cmt-maximized/UNTESTED_z220-cmt-maximized.config @@ -25,11 +25,11 @@ CONFIG_LINUX_CONFIG=config/linux-c216.config CONFIG_COREBOOT_CONFIG=config/coreboot-z220-cmt.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -43,7 +43,7 @@ CONFIG_TPMTOTP=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y # Dependencies for a graphical menu. Enable CONFIG_SLANG and CONFIG_NEWT instead # for a console-based menu. @@ -51,16 +51,23 @@ CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Hewlett-Packard Z220 Convertible Minitower" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ @@ -72,4 +79,4 @@ $(pwd)/blobs/z220/me.bin: $(pwd)/blobs/z220/ifd.bin: COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ - $(pwd)/blobs/z220/download_BIOS_clean.sh \ No newline at end of file + $(pwd)/blobs/z220/download_BIOS_clean.sh diff --git a/boards/librem_11/initrd/bin/board-init.sh b/boards/librem_11/initrd/bin/board-init.sh deleted file mode 100755 index 0e999e098..000000000 --- a/boards/librem_11/initrd/bin/board-init.sh +++ /dev/null @@ -1,3 +0,0 @@ -#! /bin/bash -set -e -o pipefail -loadkeys /etc/librem_11.map diff --git a/boards/librem_11/initrd/etc/librem_11.map b/boards/librem_11/initrd/etc/board_keys.map similarity index 100% rename from boards/librem_11/initrd/etc/librem_11.map rename to boards/librem_11/initrd/etc/board_keys.map diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 07c8b8e42..79cca98cf 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -26,18 +26,25 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=n +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem 11" -export CONFIG_FLASHROM_OPTIONS="-p internal" -export CONFIG_USB_KEYBOARD=y +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" +export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index ad5365eda..706a6dadb 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -26,16 +26,23 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem 13 v2/v3" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index ea7cff2c6..643375ff0 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -26,16 +26,23 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem 13 v4" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index 609f6c09f..4d9189059 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -24,17 +24,24 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem 14" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index 5897323a8..7de9fdc37 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -26,16 +26,23 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem 15 v3" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index 6b5889dce..3f2bf5e8b 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KBD=y @@ -27,16 +27,23 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem 15 v4" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index 0a670fef1..4ab33819a 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -4,11 +4,11 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-librem_l1um.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 export CONFIG_PURISM_BLOBS=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -25,19 +25,26 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="intel_iommu=on" export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem Server L1UM" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASHROM_OPTIONS="-p internal" -export CONFIG_USB_KEYBOARD=y +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" +export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" export CONFIG_ROOT_CHECK_AT_BOOT="n" diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index a02c69b57..fde0be749 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -24,6 +24,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y export CONFIG_TPM2_TOOLS=y @@ -31,17 +32,23 @@ CONFIG_TPM2_TSS=y CONFIG_OPENSSL=y CONFIG_PRIMARY_KEY_TYPE=ecc +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem Server L1UM v2" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASHROM_OPTIONS="-p internal" -export CONFIG_USB_KEYBOARD=y +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" +export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" export CONFIG_ROOT_CHECK_AT_BOOT="n" diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index 11f1b145e..3ca17433d 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_IOPORT=y @@ -26,18 +26,25 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=n +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem Mini" -export CONFIG_FLASHROM_OPTIONS="-p internal" -export CONFIG_USB_KEYBOARD=y +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" +export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index 39fa1ff37..dba61447f 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT_VERSION=purism export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_IOPORT=y @@ -26,18 +26,25 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=n +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" export CONFIG_BOARD_NAME="Librem Mini v2" -export CONFIG_FLASHROM_OPTIONS="-p internal" -export CONFIG_USB_KEYBOARD=y +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" +export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config deleted file mode 100644 index 9ebfc9cb1..000000000 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ /dev/null @@ -1,54 +0,0 @@ -# Nitrokey Nitropad NS51 board configuration - -export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=nitrokey -export CONFIG_LINUX_VERSION=6.1.8 - -CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-ns50.config -CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config - -CONFIG_NITROKEY_BLOBS=y - -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y -CONFIG_CRYPTSETUP2=y -CONFIG_GPG2=y -CONFIG_LVM2=y -CONFIG_MBEDTLS=y - -CONFIG_IOTOOLS=y - -CONFIG_DROPBEAR=y - -CONFIG_MSRTOOLS=y -CONFIG_HOTPKEY=y - -CONFIG_CAIRO=y -CONFIG_FBWHIPTAIL=y - -CONFIG_LINUX_USB=y - -CONFIG_LINUX_E1000=y - -export CONFIG_BOOTSCRIPT=/bin/gui-init - -export CONFIG_BOOT_KERNEL_ADD="" -export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" - -# TPM2 requirements -export CONFIG_TPM2_TOOLS=y -export CONFIG_PRIMARY_KEY_TYPE=ecc -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y - - -export CONFIG_BOOT_DEV="/dev/nvme0n1" -export CONFIG_BOARD_NAME="Nitropad NS50" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" - diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config deleted file mode 100644 index 7547ba62f..000000000 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ /dev/null @@ -1,54 +0,0 @@ -# Nitrokey Nitropad NV41 board configuration - -export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=nitrokey -export CONFIG_LINUX_VERSION=6.1.8 - -CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-nv41.config -CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config - -CONFIG_NITROKEY_BLOBS=y - -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y -CONFIG_CRYPTSETUP2=y -CONFIG_GPG2=y -CONFIG_LVM2=y -CONFIG_MBEDTLS=y - -CONFIG_IOTOOLS=y - -CONFIG_DROPBEAR=y - -CONFIG_MSRTOOLS=y -CONFIG_HOTPKEY=y - -CONFIG_CAIRO=y -CONFIG_FBWHIPTAIL=y - -CONFIG_LINUX_USB=y - -CONFIG_LINUX_E1000=y - -export CONFIG_BOOTSCRIPT=/bin/gui-init - -export CONFIG_BOOT_KERNEL_ADD="" -export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" - -# TPM2 requirements -export CONFIG_TPM2_TOOLS=y -export CONFIG_PRIMARY_KEY_TYPE=ecc -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y - - -export CONFIG_BOOT_DEV="/dev/nvme0n1" -export CONFIG_BOARD_NAME="Nitropad NV41" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" - diff --git a/boards/novacustom-nv4x_adl/novacustom-nv4x_adl.config b/boards/novacustom-nv4x_adl/novacustom-nv4x_adl.config new file mode 100644 index 000000000..8fb8f0194 --- /dev/null +++ b/boards/novacustom-nv4x_adl/novacustom-nv4x_adl.config @@ -0,0 +1,80 @@ +# NovaCustom NV4x 12th Gen (nv40pz: Alder Lake) board configuration +# Note: for reference, other GOP enabled FB board is librem_11 +# +# Docs: +# Dissassembly and Recovery: https://docs.dasharo.com/unified/novacustom/recovery/#12th-gen + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=dasharo +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-nv4x_adl.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="NovaCustom NV4x 12th Gen" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config new file mode 100644 index 000000000..7076b2c66 --- /dev/null +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -0,0 +1,89 @@ +# NovaCustom V54 MTL (integrated graphics) board configuration +# Note the FLASH_OPTIONS: '--ifd -i bios -i me -i fd' +# This excludes gbe from internal flashing, otherwise mac address would revert to '88:88:88:88:87:88' see https://github.com/linuxboot/heads/pull/1871#discussion_r1870134788 +# Same options should be used when externally flashing the first time, otherwise Intel GBE region (Ethernet config blob) will be overwitten and MAC reverted to '88:88:88:88:87:88' +# +# Docs: +# Dissassembly and Recovery: https://docs.dasharo.com/unified/novacustom/recovery/#14th-gen +# +# WARNING: The first boot after updating firmware may take a longer time than usual, due to DDR5 memory being re-trained. +# Generally, first boot time increases according to the amount of installed RAM in the system. A system with 64 GB of RAM may take over 2 minutes to boot. +# After first boot, memory training settings are cached, and subsequent boot times should be much lower. +# +# DISCLAIMER: Meteor Lake (Intel Gen 14) is not supposed to support s3 but coincidently does. In case s3 is broken, user must configure settings to not suspend or otherwise enable +# ME/CSME for s0ix to work (unsupported by QubesOS when writing those lines) or use Hibernate (Not supported by QubesOS either) + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=dasharo +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v540tu.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="NovaCustom V540TU" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd -i bios -i me -i fd" diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config new file mode 100644 index 000000000..2451b1bda --- /dev/null +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -0,0 +1,89 @@ +# NovaCustom V54 MTL (integrated graphics) board configuration +# Note the FLASH_OPTIONS: '--ifd -i bios -i me -i fd' +# This excludes gbe from internal flashing, otherwise mac address would revert to '88:88:88:88:87:88' see https://github.com/linuxboot/heads/pull/1871#discussion_r1870134788 +# Same options should be used when externally flashing the first time, otherwise Intel GBE region (Ethernet config blob) will be overwitten and MAC reverted to '88:88:88:88:87:88' +# +# Docs: +# Dissassembly and Recovery: https://docs.dasharo.com/unified/novacustom/recovery/#14th-gen +# +# WARNING: The first boot after updating firmware may take a longer time than usual, due to DDR5 memory being re-trained. +# Generally, first boot time increases according to the amount of installed RAM in the system. A system with 64 GB of RAM may take over 2 minutes to boot. +# After first boot, memory training settings are cached, and subsequent boot times should be much lower. +# +# DISCLAIMER: Meteor Lake (Intel Gen 14) is not supposed to support s3 but coincidently does. In case s3 is broken, user must configure settings to not suspend or otherwise enable +# ME/CSME for s0ix to work (unsupported by QubesOS when writing those lines) or use Hibernate (Not supported by QubesOS either) + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=dasharo +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v560tu.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="NovaCustom V560TU" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd -i bios -i me -i fd" diff --git a/boards/optiplex-7010_9010-hotp-maximized/optiplex-7010_9010-hotp-maximized.config b/boards/optiplex-7010_9010-hotp-maximized/optiplex-7010_9010-hotp-maximized.config new file mode 100644 index 000000000..5d42c7395 --- /dev/null +++ b/boards/optiplex-7010_9010-hotp-maximized/optiplex-7010_9010-hotp-maximized.config @@ -0,0 +1,96 @@ +# Configuration for a Optiplex 7010/9010 SFF running Qubes 4.1 and other Linux Based OSes (through kexec) +# +# Includes +# - Deactivated+neutered ME and expanded consequent IFD BIOS regions +# - Forged 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx30/extract.sh) +# - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set +# +# - Includes: Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-maximized.config +CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config + +#Additional hardware support +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y + + +#platform locking finalization (PR0) +# This prevents SPI from being writeable outside of Heads +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y + +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOOT_DEV="/dev/sda1" +export CONFIG_BOARD_NAME="Dell Optiplex 7010/9010 HOTP maximized" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx30_me_blobs + +#Include bits related to Optiplex blobs (not enabling TXT in coreboot config) +BOARD_TARGETS += optiplex_blobs + +# Generate split 4MB top / 8MB bottom ROMs +BOARD_TARGETS += split_8mb4mb diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config new file mode 100644 index 000000000..459666098 --- /dev/null +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -0,0 +1,96 @@ +# Configuration for a Optiplex 7010/9010 SFF running Qubes 4.1 and other Linux Based OSes (through kexec) +# +# Includes +# - Deactivated+neutered ME and expanded consequent IFD BIOS regions +# - Forged 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx30/extract.sh) +# - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set +# +# - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-maximized.config +CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config + +#Additional hardware support +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y + + +#platform locking finalization (PR0) +# This prevents SPI from being writeable outside of Heads +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y + +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOOT_DEV="/dev/sda1" +export CONFIG_BOARD_NAME="Dell Optiplex 7010/9010 maximized" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx30_me_blobs + +#Include bits related to Optiplex blobs (not enabling TXT in coreboot config) +BOARD_TARGETS += optiplex_blobs + +# Generate split 4MB top / 8MB bottom ROMs +BOARD_TARGETS += split_8mb4mb diff --git a/boards/optiplex-7010_9010_TXT-hotp-maximized/optiplex-7010_9010_TXT-hotp-maximized.config b/boards/optiplex-7010_9010_TXT-hotp-maximized/optiplex-7010_9010_TXT-hotp-maximized.config new file mode 100644 index 000000000..7a9051010 --- /dev/null +++ b/boards/optiplex-7010_9010_TXT-hotp-maximized/optiplex-7010_9010_TXT-hotp-maximized.config @@ -0,0 +1,96 @@ +# Configuration for a Optiplex 7010/9010 SFF running Qubes 4.1 and other Linux Based OSes (through kexec) +# +# Includes +# - Deactivated+neutered ME and expanded consequent IFD BIOS regions +# - Forged 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx30/extract.sh) +# - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set +# +# - Includes: Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-maximized.config +CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config + +#Additional hardware support +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y + + +#platform locking finalization (PR0) +# This prevents SPI from being writeable outside of Heads +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y + +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOOT_DEV="/dev/sda1" +export CONFIG_BOARD_NAME="Dell Optiplex 7010/9010 HOTP maximized (TXT enabled)" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx30_me_blobs + +#Include bits related to Optiplex blobs (enabling TXT in coreboot config) +BOARD_TARGETS += optiplex_blobs + +# Generate split 4MB top / 8MB bottom ROMs +BOARD_TARGETS += split_8mb4mb diff --git a/boards/optiplex-7010_9010_TXT-maximized/optiplex-7010_9010_TXT-maximized.config b/boards/optiplex-7010_9010_TXT-maximized/optiplex-7010_9010_TXT-maximized.config new file mode 100644 index 000000000..8ae897d3b --- /dev/null +++ b/boards/optiplex-7010_9010_TXT-maximized/optiplex-7010_9010_TXT-maximized.config @@ -0,0 +1,96 @@ +# Configuration for a Optiplex 7010/9010 SFF running Qubes 4.1 and other Linux Based OSes (through kexec) +# +# Includes +# - Deactivated+neutered ME and expanded consequent IFD BIOS regions +# - Forged 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx30/extract.sh) +# - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set +# +# - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-maximized.config +CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config + +#Additional hardware support +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y + + +#platform locking finalization (PR0) +# This prevents SPI from being writeable outside of Heads +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y + +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOOT_DEV="/dev/sda1" +export CONFIG_BOARD_NAME="Dell Optiplex 7010/9010 maximized (TXT enabled)" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx30_me_blobs + +#Include bits related to Optiplex blobs (enabling TXT in coreboot config) +BOARD_TARGETS += optiplex_blobs + +# Generate split 4MB top / 8MB bottom ROMs +BOARD_TARGETS += split_8mb4mb diff --git a/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod/qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod/qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config new file mode 100644 index 000000000..23ea2052a --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod/qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config @@ -0,0 +1,99 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in console mode thanks to Whiptail +# +# TPM can be used with a qemu software TPM (TIS, 1.2). A Librem Key or +# Nitrokey Pro can also be used by forwarding the USB device from the host to +# the VM. +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet.config b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet.config new file mode 100644 index 000000000..d9810e76e --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet.config @@ -0,0 +1,99 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in console mode thanks to Whiptail +# +# TPM can be used with a qemu software TPM (TIS, 1.2). A Librem Key or +# Nitrokey Pro can also be used by forwarding the USB device from the host to +# the VM. +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm1-hotp/qemu-coreboot-fbwhiptail-tpm1-hotp.config b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp/qemu-coreboot-fbwhiptail-tpm1-hotp.config index 10bf16daf..09e33dff2 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1-hotp/qemu-coreboot-fbwhiptail-tpm1-hotp.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp/qemu-coreboot-fbwhiptail-tpm1-hotp.config @@ -5,59 +5,85 @@ # Nitrokey Pro can also be used by forwarding the USB device from the host to # the VM. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y #export CONFIG_BASIC=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y -CONFIG_MSRTOOLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support CONFIG_HOTPKEY=y -export CONFIG_AUTO_BOOT_TIMEOUT=5 - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -#CONFIG_NEWT=y -#CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +#export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,10 +91,9 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -export CONFIG_TPM=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm1-prod/qemu-coreboot-fbwhiptail-tpm1-prod.config b/boards/qemu-coreboot-fbwhiptail-tpm1-prod/qemu-coreboot-fbwhiptail-tpm1-prod.config new file mode 100644 index 000000000..027b0fb22 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm1-prod/qemu-coreboot-fbwhiptail-tpm1-prod.config @@ -0,0 +1,97 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in console mode thanks to Whiptail +# +# TPM can be used with a qemu software TPM (TIS, 1.2). +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config index 442f06dc4..e276e979f 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -3,8 +3,11 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y @@ -13,51 +16,72 @@ export CONFIG_LINUX_VERSION=5.10.5 #Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) #export CONFIG_HAVE_GPG_KEY_BACKUP=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support #CONFIG_HOTPKEY=y - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -#CONFIG_NEWT=y -#CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +#export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,10 +89,9 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -export CONFIG_TPM=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod/qemu-coreboot-fbwhiptail-tpm2-hotp-prod.config b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod/qemu-coreboot-fbwhiptail-tpm2-hotp-prod.config new file mode 100644 index 000000000..d13065e18 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod/qemu-coreboot-fbwhiptail-tpm2-hotp-prod.config @@ -0,0 +1,98 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in graphical mode thanks to FBWhiptail +# This version requires a supported HOTP Security dongle (Nitrokey Pro/Storage or Librem Key) +# +# TPM can be used with a qemu software TPM (TIS, 2.0). +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet.config b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet.config new file mode 100644 index 000000000..79eeb57f8 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet.config @@ -0,0 +1,98 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in graphical mode thanks to FBWhiptail +# This version requires a supported HOTP Security dongle (Nitrokey Pro/Storage or Librem Key) +# +# TPM can be used with a qemu software TPM (TIS, 2.0). +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm2-hotp/qemu-coreboot-fbwhiptail-tpm2-hotp.config b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp/qemu-coreboot-fbwhiptail-tpm2-hotp.config index 1a91a32b3..596027dca 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2-hotp/qemu-coreboot-fbwhiptail-tpm2-hotp.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp/qemu-coreboot-fbwhiptail-tpm2-hotp.config @@ -4,61 +4,86 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y #export CONFIG_BASIC=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y -#Enable TPM2 pcap output under /tmp -export CONFIG_TPM2_CAPTURE_PCAP=y +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support CONFIG_HOTPKEY=y -export CONFIG_AUTO_BOOT_TIMEOUT=5 - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -#CONFIG_NEWT=y -#CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=y +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -66,14 +91,9 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -#TPM2 requirements -export CONFIG_TPM2_TOOLS=y -export CONFIG_PRIMARY_KEY_TYPE=ecc -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm2-prod/qemu-coreboot-fbwhiptail-tpm2-prod.config b/boards/qemu-coreboot-fbwhiptail-tpm2-prod/qemu-coreboot-fbwhiptail-tpm2-prod.config new file mode 100644 index 000000000..8b391bbe9 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm2-prod/qemu-coreboot-fbwhiptail-tpm2-prod.config @@ -0,0 +1,97 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in graphical mode thanks to FBWhiptail +# +# TPM can be used with a qemu software TPM (TIS, 2.0). +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config index fce10e7c6..4f3ef49e3 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -3,8 +3,11 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y @@ -13,53 +16,73 @@ export CONFIG_LINUX_VERSION=5.10.5 #Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) #export CONFIG_HAVE_GPG_KEY_BACKUP=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y -#Enable TPM2 pcap output under /tmp -export CONFIG_TPM2_CAPTURE_PCAP=y -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y -CONFIG_HOTPKEY=n - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -#CONFIG_NEWT=y -#CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=y +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -67,14 +90,9 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -#TPM2 requirements -export CONFIG_TPM2_TOOLS=y -export CONFIG_PRIMARY_KEY_TYPE=ecc -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm1-hotp-prod/qemu-coreboot-whiptail-tpm1-hotp-prod.config b/boards/qemu-coreboot-whiptail-tpm1-hotp-prod/qemu-coreboot-whiptail-tpm1-hotp-prod.config new file mode 100644 index 000000000..cd1a29767 --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm1-hotp-prod/qemu-coreboot-whiptail-tpm1-hotp-prod.config @@ -0,0 +1,99 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in console mode thanks to Whiptail +# +# TPM can be used with a qemu software TPM (TIS, 1.2). A Librem Key or +# Nitrokey Pro can also be used by forwarding the USB device from the host to +# the VM. +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): +#CONFIG_CAIRO=y +#CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm1-hotp/qemu-coreboot-whiptail-tpm1-hotp.config b/boards/qemu-coreboot-whiptail-tpm1-hotp/qemu-coreboot-whiptail-tpm1-hotp.config index 8518aad88..bdfdd2469 100644 --- a/boards/qemu-coreboot-whiptail-tpm1-hotp/qemu-coreboot-whiptail-tpm1-hotp.config +++ b/boards/qemu-coreboot-whiptail-tpm1-hotp/qemu-coreboot-whiptail-tpm1-hotp.config @@ -5,59 +5,85 @@ # Nitrokey Pro can also be used by forwarding the USB device from the host to # the VM. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y #export CONFIG_BASIC=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support CONFIG_HOTPKEY=y -export CONFIG_AUTO_BOOT_TIMEOUT=5 - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): #CONFIG_CAIRO=y #CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -CONFIG_NEWT=y -CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +#export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,10 +91,9 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -export CONFIG_TPM=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm1-prod/qemu-coreboot-whiptail-tpm1-prod.config b/boards/qemu-coreboot-whiptail-tpm1-prod/qemu-coreboot-whiptail-tpm1-prod.config new file mode 100644 index 000000000..6964ff073 --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm1-prod/qemu-coreboot-whiptail-tpm1-prod.config @@ -0,0 +1,97 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in console mode thanks to Whiptail +# +# TPM can be used with a qemu software TPM (TIS, 1.2). +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): +#CONFIG_CAIRO=y +#CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config index 4cdd6eb8b..7e2445331 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -3,61 +3,85 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 -#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing)) +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y #export CONFIG_BASIC=y #Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) #export CONFIG_HAVE_GPG_KEY_BACKUP=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support #CONFIG_HOTPKEY=y - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): #CONFIG_CAIRO=y #CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -CONFIG_NEWT=y -CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +#export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,10 +89,9 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -export CONFIG_TPM=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm2-hotp-prod/qemu-coreboot-whiptail-tpm2-hotp-prod.config b/boards/qemu-coreboot-whiptail-tpm2-hotp-prod/qemu-coreboot-whiptail-tpm2-hotp-prod.config new file mode 100644 index 000000000..3a01257b4 --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm2-hotp-prod/qemu-coreboot-whiptail-tpm2-hotp-prod.config @@ -0,0 +1,98 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in console mode thanks to Whiptail +# This version requires a supported HOTP Security dongle (Nitrokey Pro/Storage or Librem Key) +# +# TPM can be used with a qemu software TPM (TIS, 2.0). +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): +#CONFIG_CAIRO=y +#CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm2-hotp/qemu-coreboot-whiptail-tpm2-hotp.config b/boards/qemu-coreboot-whiptail-tpm2-hotp/qemu-coreboot-whiptail-tpm2-hotp.config index 761240933..2d5a23708 100644 --- a/boards/qemu-coreboot-whiptail-tpm2-hotp/qemu-coreboot-whiptail-tpm2-hotp.config +++ b/boards/qemu-coreboot-whiptail-tpm2-hotp/qemu-coreboot-whiptail-tpm2-hotp.config @@ -4,61 +4,86 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y #export CONFIG_BASIC=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y -#Enable TPM2 pcap output under /tmp -export CONFIG_TPM2_CAPTURE_PCAP=y +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y -CONFIG_MSRTOOLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support CONFIG_HOTPKEY=y -export CONFIG_AUTO_BOOT_TIMEOUT=5 - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): #CONFIG_CAIRO=y #CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -CONFIG_NEWT=y -CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=y +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -66,14 +91,9 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -#TPM2 requirements -export CONFIG_TPM2_TOOLS=y -export CONFIG_PRIMARY_KEY_TYPE=ecc -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2-hotp" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm2-prod/qemu-coreboot-whiptail-tpm2-prod.config b/boards/qemu-coreboot-whiptail-tpm2-prod/qemu-coreboot-whiptail-tpm2-prod.config new file mode 100644 index 000000000..8325b46ac --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm2-prod/qemu-coreboot-whiptail-tpm2-prod.config @@ -0,0 +1,97 @@ +# Configuration for building a coreboot ROM that works in +# the qemu emulator in console mode thanks to Whiptail +# +# TPM can be used with a qemu software TPM (TIS, 2.0). +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config + +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio +ifeq "$(CONFIG_UROOT)" "y" +CONFIG_BUSYBOX=n +else +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): +#CONFIG_CAIRO=y +#CONFIG_FBWHIPTAIL=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y +endif + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" +export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" +export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" +export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" + +BOARD_TARGETS := qemu diff --git a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config index 82349b271..faf19d40b 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -3,8 +3,11 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +CONFIG_LINUX_CONFIG=config/linux-qemu.config #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) #export CONFIG_RESTRICTED_BOOT=y @@ -13,53 +16,73 @@ export CONFIG_LINUX_VERSION=5.10.5 #Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) #export CONFIG_HAVE_GPG_KEY_BACKUP=y -#Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y -#Enable TPM2 pcap output under /tmp -export CONFIG_TPM2_CAPTURE_PCAP=y -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config -CONFIG_LINUX_CONFIG=config/linux-qemu.config +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + +#Modules packed into tools.cpio ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else -CONFIG_KEXEC=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y -CONFIG_POPT=y -CONFIG_FLASHTOOLS=y -CONFIG_FLASHROM=y -CONFIG_PCIUTILS=y -CONFIG_UTIL_LINUX=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y -CONFIG_DROPBEAR=y -CONFIG_MSRTOOLS=y +CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support #CONFIG_HOTPKEY=y - -#Uncomment only one of the following block -#Required for graphical gui-init (FBWhiptail) +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): #CONFIG_CAIRO=y #CONFIG_FBWHIPTAIL=y -# -#text-based init (generic-init and gui-init) -CONFIG_NEWT=y -CONFIG_SLANG=y - +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y endif -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y -CONFIG_LINUX_USB=y -CONFIG_LINUX_E1000=y - -#Uncomment only one BOOTSCRIPT: -#Whiptail-based init (text-based or FBWhiptail) +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=y +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -67,14 +90,10 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" - -#TPM2 requirements -export CONFIG_TPM2_TOOLS=y -export CONFIG_PRIMARY_KEY_TYPE=ecc -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y - -export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" +#export CONFIG_AUTO_BOOT_TIMEOUT=5 + +export CONFIG_KEYBOARD_KEYMAP="/usr/lib/kbd/keymaps/i386/qwerty/us.map" BOARD_TARGETS := qemu diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index d248c8c3b..c7bc40700 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -9,18 +9,22 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config +#EXPLICITELY DEACTIVATE KBD + loadkeys + keymap support since sandy bridge based laptops with 8Mb SPI is not big enough +CONFIG_KBD=n + #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -31,7 +35,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support #TPM based requirements @@ -59,14 +63,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=n +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad T420-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 431079d4c..ed317013c 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -8,18 +8,22 @@ # Doesn't include (to fit in 7mb image) # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config +#EXPLICITELY DEACTIVATE KBD + loadkeys + keymap support since sandy bridge based laptops with 8Mb SPI is not big enough +CONFIG_KBD=n + #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -30,7 +34,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support #TPM based requirements @@ -57,14 +61,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=n +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad T420-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 0a09feb11..2f4a20548 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -7,8 +7,8 @@ # # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -16,9 +16,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -29,7 +30,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support #TPM based requirements @@ -57,14 +58,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T430-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 8c2a5e132..a4077491d 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -7,8 +7,8 @@ # # - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -16,9 +16,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -29,7 +30,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -57,14 +58,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T430-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config new file mode 100644 index 000000000..42506658a --- /dev/null +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -0,0 +1,99 @@ +# Configuration for a T480 running Qubes 4.2.3 and other Linux Based OSes (through kexec) +# +# CAVEATS: +# This board is vulnerable to a TPM reset attack, i.e. the PCRs are reset while the system is running. +# This attack can be used to bypass measured boot when an attacker succeeds at modifying the SPI flash. +# Also it can be used to extract FDE keys from a TPM. +# The related coreboot issue contains more information: https://ticket.coreboot.org/issues/576 +# Make sure you understand the implications of the attack for your threat model before using this board. +# +# Includes +# - Deactivated+neutered+deguarded ME and expanded consequent IFD BIOS regions +# - Forged GBE MAC address to 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx80/extract.sh) +# - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set +# - Flashable Thunderbolt tb.bin blob extracted from https://download.lenovo.com/pccbbs/mobiles/n24th13w.exe +# - It is zero-padded to 1MB and should be flashed to the Thunderbolt SPI chip, +# which is not the same as the 16MB chip to which the heads rom is flashed. +# External flashing is recommended as the only way to reliably fix a bug in the original Thunderbolt software on the SPI chip. +# You can find a guide here: https://osresearch.net/T430-maximized-flashing/ +# +# - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config +CONFIG_LINUX_CONFIG=config/linux-t480.config + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y + +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="Thinkpad T480-hotp-maximized" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx80_me_blobs diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config new file mode 100644 index 000000000..92fcacd87 --- /dev/null +++ b/boards/t480-maximized/t480-maximized.config @@ -0,0 +1,99 @@ +# Configuration for a T480 running Qubes 4.2.3 and other Linux Based OSes (through kexec) +# +# CAVEATS: +# This board is vulnerable to a TPM reset attack, i.e. the PCRs are reset while the system is running. +# This attack can be used to bypass measured boot when an attacker succeeds at modifying the SPI flash. +# Also it can be used to extract FDE keys from a TPM. +# The related coreboot issue contains more information: https://ticket.coreboot.org/issues/576 +# Make sure you understand the implications of the attack for your threat model before using this board. +# +# Includes +# - Deactivated+neutered+deguarded ME and expanded consequent IFD BIOS regions +# - Forged GBE MAC address to 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx80/extract.sh) +# - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set +# - Flashable Thunderbolt tb.bin blob extracted from https://download.lenovo.com/pccbbs/mobiles/n24th13w.exe +# - It is zero-padded to 1MB and should be flashed to the Thunderbolt SPI chip, +# which is not the same as the 16MB chip to which the heads rom is flashed. +# External flashing is recommended as the only way to reliably fix a bug in the original Thunderbolt software on the SPI chip. +# You can find a guide here: https://osresearch.net/T430-maximized-flashing/ +# +# - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config +CONFIG_LINUX_CONFIG=config/linux-t480.config + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +#CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y + +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y + +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="Thinkpad T480-maximized" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx80_me_blobs diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 76a6691a6..99e01ead5 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board ignores the in-built dGPU that comes with all w530's. In doing so the dGPU will not be initialized. This has some benefits in terms of reduced complexity in working with OS's with poor support for NVIDIA, better battery life and lower heat (making use of the thicker heatsink from a dGPU). Conversely, if you do not initialize the dGPU you will be unable to use an external monitor. To initialize the dGPU please use the dGPU boards that corresponds with the model of dGPU included with your device. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -30,7 +31,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -59,14 +60,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad W530-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index f210e638e..54133657d 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board ignores the in-built dGPU that comes with all w530's. In doing so the dGPU will not be initialized. This has some benefits in terms of reduced complexity in working with OS's with poor support for NVIDIA, better battery life and lower heat (making use of the thicker heatsink from a dGPU). Conversely, if you do not initialize the dGPU you will be unable to use an external monitor. To initialize the dGPU please use the dGPU boards that corresponds with the model of dGPU included with your device. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -30,7 +31,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -58,14 +59,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad W530-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 905da3c27..d17cdc241 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -9,18 +9,22 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config +#EXPLICITELY DEACTIVATE KBD + loadkeys + keymap support since sandy bridge based laptops with 8Mb SPI is not big enough +CONFIG_KBD=n + #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -31,7 +35,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support #TPM based requirements @@ -59,14 +63,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=n +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad X220-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index abbfd0c8f..887abce00 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -9,18 +9,22 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config +#EXPLICITELY DEACTIVATE KBD + loadkeys + keymap support since sandy bridge based laptops with 8Mb SPI is not big enough +CONFIG_KBD=n + #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -31,7 +35,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support #TPM based requirements @@ -58,14 +62,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=n +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad X220-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS += xx20_me_blobs diff --git a/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config b/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config index 2f68545fd..8e5db63c0 100644 --- a/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config +++ b/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config @@ -19,8 +19,8 @@ # # - Includes: Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -28,9 +28,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KBD=y @@ -42,7 +43,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -71,14 +72,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad X230-hotp-maximized-eDP" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 040d99905..1c64b813c 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -7,22 +7,20 @@ # # - Includes: Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config -#Enable DEBUG output -#export CONFIG_DEBUG_OUTPUT=y -#export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y - -#Additional hardware support +#On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -30,25 +28,27 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y - -#platform locking finalization (PR0) -CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y - - +#Runtime tools to write to MSR +#CONFIG_MSRTOOLS=y #Remote attestation support -#TPM based requirements -export CONFIG_TPM=y +# TPM2 requirements +#CONFIG_TPM2_TSS=y +#CONFIG_OPENSSL=y CONFIG_POPT=y CONFIG_QRENCODE=y CONFIG_TPMTOTP=y #HOTP based remote attestation for supported USB Security dongle #With/Without TPM support CONFIG_HOTPKEY=y -export CONFIG_AUTO_BOOT_TIMEOUT=5 -#Nitrokey Storage admin tool -CONFIG_NKSTORECLI=n + +#platform locking finalization (PR0) +# This prevents SPI from being writeable outside of Heads +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n #GUI Support #Console based Whiptail support(Console based, no FB): @@ -58,18 +58,32 @@ CONFIG_NKSTORECLI=n CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y -#Additional tools: +#Additional tools (tools.cpio): #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +#export CONFIG_TPM2_TOOLS=y +#export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +export CONFIG_TPM=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad X230-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/x230-hotp-maximized_usb-kb/x230-hotp-maximized_usb-kb.config b/boards/x230-hotp-maximized_usb-kb/x230-hotp-maximized_usb-kb.config index 167fb4314..2f020057c 100644 --- a/boards/x230-hotp-maximized_usb-kb/x230-hotp-maximized_usb-kb.config +++ b/boards/x230-hotp-maximized_usb-kb/x230-hotp-maximized_usb-kb.config @@ -9,8 +9,8 @@ # Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # USB Keyboard support export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -18,10 +18,13 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y -export CONFIG_USB_KEYBOARD=y +CONFIG_MOBILE_TETHERING=y + +#Additional features +export CONFIG_USB_KEYBOARD_REQUIRED=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -32,7 +35,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -61,14 +64,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad X230-hotp-maximized_usb-kb" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config index 938e96c7e..99cec7f40 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -19,8 +19,8 @@ # # - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -28,9 +28,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KBD=y @@ -42,7 +43,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -70,14 +71,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad X230-maximized-eDP" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 58a81476d..fb11f4a6b 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -7,22 +7,19 @@ # # - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=24.12 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config -#Enable DEBUG output -#export CONFIG_DEBUG_OUTPUT=y -#export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y - #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -33,7 +30,7 @@ CONFIG_PCIUTILS=y #platform locking finalization (PR0) CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support @@ -61,14 +58,20 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#Enable DEBUG output +export CONFIG_DEBUG_OUTPUT=n +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +#Enable TPM2 pcap output under /tmp +export CONFIG_TPM2_CAPTURE_PCAP=n +#Enable quiet mode: technical information logged under /tmp/debug.log +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad X230-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/branding/Dasharo/bootsplash.jpg b/branding/Dasharo/bootsplash.jpg new file mode 100644 index 000000000..77a644064 Binary files /dev/null and b/branding/Dasharo/bootsplash.jpg differ diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 009414bf2..b4adf6542 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -19,7 +19,8 @@ CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y -# CONFIG_COLLECT_TIMESTAMPS is not set +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set # CONFIG_USE_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set @@ -157,7 +158,7 @@ CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 # CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" @@ -408,6 +409,8 @@ CONFIG_BOOTBLOCK_SIMPLE=y # CONFIG_BOOTBLOCK_NORMAL is not set CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c" CONFIG_ACPI_HAVE_PCAT_8259=y +# CONFIG_COLLECT_TIMESTAMPS_NO_TSC is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y # CONFIG_PAGING_IN_CACHE_AS_RAM is not set # CONFIG_IDT_IN_EVERY_STAGE is not set # CONFIG_PIRQ_ROUTE is not set @@ -590,8 +593,8 @@ CONFIG_TTYS0_BAUD=115200 CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 # CONFIG_CONSOLE_SPI_FLASH is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set diff --git a/config/coreboot-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index d7ef7c27b..32bf907c9 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -19,7 +19,8 @@ CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y -# CONFIG_COLLECT_TIMESTAMPS is not set +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set # CONFIG_USE_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set @@ -157,7 +158,7 @@ CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 # CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" @@ -408,6 +409,8 @@ CONFIG_BOOTBLOCK_SIMPLE=y # CONFIG_BOOTBLOCK_NORMAL is not set CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c" CONFIG_ACPI_HAVE_PCAT_8259=y +# CONFIG_COLLECT_TIMESTAMPS_NO_TSC is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y # CONFIG_PAGING_IN_CACHE_AS_RAM is not set # CONFIG_IDT_IN_EVERY_STAGE is not set # CONFIG_PIRQ_ROUTE is not set @@ -590,8 +593,8 @@ CONFIG_TTYS0_BAUD=115200 CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 # CONFIG_CONSOLE_SPI_FLASH is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set diff --git a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 009414bf2..b4adf6542 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -19,7 +19,8 @@ CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y -# CONFIG_COLLECT_TIMESTAMPS is not set +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set # CONFIG_USE_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set @@ -157,7 +158,7 @@ CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 # CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" @@ -408,6 +409,8 @@ CONFIG_BOOTBLOCK_SIMPLE=y # CONFIG_BOOTBLOCK_NORMAL is not set CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c" CONFIG_ACPI_HAVE_PCAT_8259=y +# CONFIG_COLLECT_TIMESTAMPS_NO_TSC is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y # CONFIG_PAGING_IN_CACHE_AS_RAM is not set # CONFIG_IDT_IN_EVERY_STAGE is not set # CONFIG_PIRQ_ROUTE is not set @@ -590,8 +593,8 @@ CONFIG_TTYS0_BAUD=115200 CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 # CONFIG_CONSOLE_SPI_FLASH is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set diff --git a/config/coreboot-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 009414bf2..b4adf6542 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -19,7 +19,8 @@ CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y -# CONFIG_COLLECT_TIMESTAMPS is not set +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set # CONFIG_USE_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set @@ -157,7 +158,7 @@ CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 # CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" @@ -408,6 +409,8 @@ CONFIG_BOOTBLOCK_SIMPLE=y # CONFIG_BOOTBLOCK_NORMAL is not set CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c" CONFIG_ACPI_HAVE_PCAT_8259=y +# CONFIG_COLLECT_TIMESTAMPS_NO_TSC is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y # CONFIG_PAGING_IN_CACHE_AS_RAM is not set # CONFIG_IDT_IN_EVERY_STAGE is not set # CONFIG_PIRQ_ROUTE is not set @@ -590,8 +593,8 @@ CONFIG_TTYS0_BAUD=115200 CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 # CONFIG_CONSOLE_SPI_FLASH is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 357f22ca5..a1e0af90c 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -20,6 +20,7 @@ CONFIG_ARCH_SUPPORTS_CLANG=y CONFIG_OPTION_BACKEND_NONE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -143,7 +144,6 @@ CONFIG_DRIVERS_INTEL_WIFI=y CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_jsl/librem_11/flashdescriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_jsl/librem_11/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=9 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y CONFIG_USE_LEGACY_8254_TIMER=y @@ -174,9 +174,8 @@ CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_JSL=y # CONFIG_ENABLE_UART2 is not set CONFIG_FSP_TEMP_RAM_SIZE=0x28000 -CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 -CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" +CONFIG_LINUX_COMMAND_LINE="intel_iommu=igfx_off quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set # CONFIG_COREBOOT_ROMSIZE_KB_512 is not set @@ -189,6 +188,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -221,6 +221,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=133 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="jsl" @@ -252,6 +254,7 @@ CONFIG_SOC_INTEL_JASPERLAKE_DEBUG_CONSENT=0 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_CBFS_CACHE_ALIGN=8 @@ -297,7 +300,9 @@ CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_13=y CONFIG_ME_SPEC=13 +CONFIG_CSE_RESET_CLEAR_EC_AP_IDLE_FLAG=y CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y @@ -335,7 +340,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y CONFIG_SOC_INTEL_COMMON_BLOCK_UART=y CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y @@ -440,7 +444,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y @@ -476,7 +483,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -485,8 +492,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -546,6 +551,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set # CONFIG_DRIVERS_PS2_KEYBOARD is not set CONFIG_DRIVERS_MC146818=y @@ -554,6 +563,7 @@ CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V1=y # end of Generic Drivers @@ -580,6 +590,7 @@ CONFIG_NO_TPM=y CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -611,6 +622,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -671,6 +683,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -694,6 +707,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 5de06ebcb..31494c992 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -20,6 +20,7 @@ CONFIG_ARCH_SUPPORTS_CLANG=y CONFIG_OPTION_BACKEND_NONE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -145,12 +146,11 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_skl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_skl/me.bin" CONFIG_MAINBOARD_SUPPORTS_SKYLAKE_CPU=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set @@ -182,7 +182,6 @@ CONFIG_BOARD_PURISM_LIBREM13_V2=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_HEAP_SIZE=0x80000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -198,6 +197,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -230,6 +230,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=120 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -259,6 +261,7 @@ CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=10 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_SKYLAKE_BASE=y CONFIG_SOC_INTEL_SKYLAKE=y CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y @@ -284,7 +287,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -353,7 +355,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SA_ENABLE_DPR=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y @@ -465,7 +466,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y @@ -502,7 +506,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -511,8 +515,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -572,6 +574,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -587,7 +593,7 @@ CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -622,6 +628,7 @@ CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -654,6 +661,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -715,6 +723,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -738,6 +747,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index 804cb751b..1aaba3d47 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -20,6 +20,7 @@ CONFIG_ARCH_SUPPORTS_CLANG=y CONFIG_OPTION_BACKEND_NONE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -145,12 +146,11 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_kbl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_kbl/me.bin" CONFIG_MAINBOARD_SUPPORTS_SKYLAKE_CPU=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set @@ -182,7 +182,6 @@ CONFIG_BOARD_PURISM_LIBREM13_V4=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_HEAP_SIZE=0x80000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -198,6 +197,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -230,6 +230,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=120 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -259,6 +261,7 @@ CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=10 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_SKYLAKE_BASE=y CONFIG_SOC_INTEL_KABYLAKE=y CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y @@ -284,7 +287,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -353,7 +355,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SA_ENABLE_DPR=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y @@ -465,7 +466,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y @@ -502,7 +506,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -511,8 +515,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -572,6 +574,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -587,7 +593,7 @@ CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -622,6 +628,7 @@ CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -654,6 +661,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -715,6 +723,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -738,6 +747,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index b15087466..6333e19d9 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -20,6 +20,7 @@ CONFIG_ARCH_SUPPORTS_CLANG=y CONFIG_OPTION_BACKEND_NONE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -144,14 +145,13 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x20400 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/librem_14/flashdescriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/librem_14/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y -CONFIG_USE_LEGACY_8254_TIMER=y +# CONFIG_USE_LEGACY_8254_TIMER is not set # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 14" CONFIG_HAVE_IFD_BIN=y @@ -180,7 +180,6 @@ CONFIG_BOARD_PURISM_LIBREM_14=y CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_CNL=y CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_FSP_TEMP_RAM_SIZE=0x10000 -CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -196,6 +195,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -217,7 +217,7 @@ CONFIG_SYSTEM_TYPE_LAPTOP=y # # SoC # -CONFIG_CHIPSET_DEVICETREE="" +CONFIG_CHIPSET_DEVICETREE="soc/intel/cannonlake/chipset.cb" CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 @@ -228,6 +228,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=216 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -242,7 +244,7 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=3 CONFIG_SOC_INTEL_I2C_DEV_MAX=6 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x30 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0xc35 -CONFIG_FSP_HEADER_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Include/" +CONFIG_FSP_HEADER_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake2/Include/" CONFIG_FSP_FD_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Fsp.fd" CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 CONFIG_INTEL_GMA_BCLV_WIDTH=32 @@ -254,13 +256,15 @@ CONFIG_HAVE_PAM0_REGISTER=y CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_SOC_INTEL_CANNONLAKE_BASE=y CONFIG_SOC_INTEL_COMETLAKE=y -CONFIG_SOC_INTEL_COMETLAKE_1=y +CONFIG_SOC_INTEL_COMETLAKE_1_2=y +CONFIG_FSP_FD_PATH_2="3rdparty/fsp/CometLakeFspBinPkg/CometLake2/Fsp.fd" CONFIG_SOC_INTEL_CANNONLAKE_DEBUG_CONSENT=0 CONFIG_INTEL_TXT_BIOSACM_ALIGNMENT=0x40000 CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_CBFS_CACHE_ALIGN=8 @@ -285,7 +289,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -308,6 +311,7 @@ CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_12=y CONFIG_ME_SPEC=12 CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y @@ -346,7 +350,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y @@ -457,7 +460,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y @@ -497,7 +503,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -506,8 +512,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -554,10 +558,15 @@ CONFIG_PLATFORM_USES_FSP2_0=y CONFIG_PLATFORM_USES_FSP2_X86_32=y CONFIG_HAVE_INTEL_FSP_REPO=y CONFIG_ADD_FSP_BINARIES=y +CONFIG_PLATFORM_USES_SECOND_FSP=y CONFIG_FSP_T_LOCATION=0xfffe0000 CONFIG_FSP_S_CBFS="fsps.bin" CONFIG_FSP_M_CBFS="fspm.bin" CONFIG_FSP_FULL_FD=y +CONFIG_FSP_S_CBFS_2="fsps_2.bin" +CONFIG_FSP_M_CBFS_2="fspm_2.bin" +CONFIG_FSP_M_FILE_2="$(obj)/Fsp_2_M.fd" +CONFIG_FSP_S_FILE_2="$(obj)/Fsp_2_S.fd" CONFIG_FSP_T_RESERVED_SIZE=0x0 CONFIG_FSP_M_XIP=y CONFIG_FSP_USES_CB_STACK=y @@ -571,6 +580,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Skylake" @@ -586,7 +599,7 @@ CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -621,6 +634,7 @@ CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -653,6 +667,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -714,6 +729,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -737,6 +753,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index 03d27de94..d85654155 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -20,6 +20,7 @@ CONFIG_ARCH_SUPPORTS_CLANG=y CONFIG_OPTION_BACKEND_NONE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -145,12 +146,11 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_skl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_skl/me.bin" CONFIG_MAINBOARD_SUPPORTS_SKYLAKE_CPU=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set @@ -182,7 +182,6 @@ CONFIG_BOARD_PURISM_LIBREM15_V3=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_HEAP_SIZE=0x80000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -198,6 +197,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -230,6 +230,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=120 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -259,6 +261,7 @@ CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=10 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_SKYLAKE_BASE=y CONFIG_SOC_INTEL_SKYLAKE=y CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y @@ -284,7 +287,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -353,7 +355,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SA_ENABLE_DPR=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y @@ -465,7 +466,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y @@ -502,7 +506,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -511,8 +515,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -572,6 +574,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -587,7 +593,7 @@ CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -622,6 +628,7 @@ CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -654,6 +661,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -715,6 +723,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -738,6 +747,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index 80a80bf72..f277f7c56 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -20,6 +20,7 @@ CONFIG_ARCH_SUPPORTS_CLANG=y CONFIG_OPTION_BACKEND_NONE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -145,12 +146,11 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_kbl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_kbl/me.bin" CONFIG_MAINBOARD_SUPPORTS_SKYLAKE_CPU=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set @@ -182,7 +182,6 @@ CONFIG_BOARD_PURISM_LIBREM15_V4=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_HEAP_SIZE=0x80000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -198,6 +197,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -230,6 +230,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=120 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -259,6 +261,7 @@ CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=10 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_SKYLAKE_BASE=y CONFIG_SOC_INTEL_KABYLAKE=y CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y @@ -284,7 +287,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -353,7 +355,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SA_ENABLE_DPR=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y @@ -465,7 +466,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y @@ -502,7 +506,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -511,8 +515,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -572,6 +574,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -587,7 +593,7 @@ CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -622,6 +628,7 @@ CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -654,6 +661,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -715,6 +723,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -738,6 +747,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_l1um.config b/config/coreboot-librem_l1um.config index 97a68a3f6..c1175b229 100644 --- a/config/coreboot-librem_l1um.config +++ b/config/coreboot-librem_l1um.config @@ -1,26 +1,699 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_COMPRESS_RAMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +# CONFIG_NO_RELOCATABLE_RAMSTAGE is not set +CONFIG_RELOCATABLE_RAMSTAGE=y +# CONFIG_UPDATE_IMAGE is not set +# CONFIG_BOOTSPLASH_IMAGE is not set CONFIG_MEASURED_BOOT=y + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_ADI is not set +# CONFIG_VENDOR_ADLINK is not set +# CONFIG_VENDOR_ADVANSUS is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_AVALUE is not set +# CONFIG_VENDOR_BAP is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_ELMEX is not set +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ESD is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GIZMOSPHERE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IEI is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_JETWAY is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIPPERT is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PORTWELL is not set CONFIG_VENDOR_PURISM=y +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SCALEWAY is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TYAN is not set +# CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set +CONFIG_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_DIR="purism/librem_l1um" +CONFIG_MAINBOARD_PART_NUMBER="LIBREM_L1UM" +CONFIG_MAX_CPUS=32 +CONFIG_FSP_FILE="3rdparty/fsp/BroadwellDEFspBinPkg/FspBin/BROADWELLDE_FSP.bin" CONFIG_CBFS_SIZE=0xC00000 +CONFIG_ENABLE_FSP_FAST_BOOT=y +CONFIG_VIRTUAL_ROM_SIZE=0x1000000 +CONFIG_MAINBOARD_VENDOR="Purism" +CONFIG_IRQ_SLOT_COUNT=18 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DIMM_SPD_SIZE=512 +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +CONFIG_DEVICETREE="devicetree.cb" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_DCACHE_RAM_BASE=0xfe100000 +CONFIG_DCACHE_RAM_SIZE=0x8000 +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_FMDFILE="" +# CONFIG_VBOOT is not set +CONFIG_MMCONF_BASE_ADDRESS=0x80000000 +CONFIG_HAVE_INTEL_FIRMWARE=y +CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_FSP_LOC=0xffeb0000 +CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_TPM_INIT=y +# CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_DIMM_MAX=4 +CONFIG_TPM_PIRQ=0x0 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Server L1UM" CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_l1um/flashdescriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_l1um/me.bin" CONFIG_HAVE_IFD_BIN=y -# CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +# CONFIG_INTEGRATED_UART is not set +CONFIG_IPMI_KCS_REGISTER_SPACING=1 +CONFIG_MAINBOARD_VERSION="1.0" +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set CONFIG_BOARD_PURISM_LIBREM_L1UM=y +# CONFIG_BOARD_PURISM_LIBREM13_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V3 is not set +# CONFIG_BOARD_PURISM_LIBREM13_V4 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V4 is not set +# CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_BDW is not set +# CONFIG_PCIEXP_L1_SUB_STATE is not set +CONFIG_NO_POST=y +# CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL is not set +CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 +CONFIG_HEAP_SIZE=0x100000 +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +CONFIG_LINUX_COMMAND_LINE="quiet loglevel=3" +CONFIG_BOARD_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_64 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_128 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=16384 +CONFIG_ROM_SIZE=0x1000000 +# CONFIG_SYSTEM_TYPE_LAPTOP is not set +# CONFIG_SYSTEM_TYPE_TABLET is not set +# CONFIG_SYSTEM_TYPE_DETACHABLE is not set +# CONFIG_SYSTEM_TYPE_CONVERTIBLE is not set +# CONFIG_CBFS_AUTOGEN_ATTRIBUTES is not set + +# +# Chipset +# + +# +# SoC +# +CONFIG_CPU_SPECIFIC_OPTIONS=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_CPU_ADDR_BITS=36 +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_SMM_RESERVED_SIZE=0x100000 +CONFIG_SMM_MODULE_STACK_SIZE=0x800 +CONFIG_ACPI_CPU_STRING="\\_PR.CP%02d" +# CONFIG_SOC_CAVIUM_CN81XX is not set +CONFIG_ARCH_ARMV8_EXTENSION=0 +CONFIG_STACK_SIZE=0x1000 +# CONFIG_SOC_CAVIUM_COMMON is not set +CONFIG_BOOTBLOCK_CPU_INIT="soc/intel/fsp_broadwell_de/bootblock/bootblock.c" +# CONFIG_SOC_INTEL_GLK is not set +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_FSP_HEADER_PATH="$(top)/3rdparty/fsp/BroadwellDEFspBinPkg/include/" +# CONFIG_PCIEXP_ASPM is not set CONFIG_PCIEXP_COMMON_CLOCK=y +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_SOC_INTEL_FSP_BROADWELL_DE=y +CONFIG_HPET_MIN_TICKS=0x80 +CONFIG_BROADWELL_DE_FSP_SPECIFIC_OPTIONS=y +CONFIG_FSP_SRC_PATH="$(top)/3rdparty/fsp/BroadwellDEFspBinPkg/include/fspsupport.c" +# CONFIG_FSP_MEMORY_DOWN is not set +CONFIG_FSP_HYPERTHREADING=y CONFIG_FSP_EHCI1_ENABLE=y CONFIG_FSP_EHCI2_ENABLE=y +CONFIG_FSP_DEBUG_LEVEL=0 +CONFIG_UART_PCI_ADDR=0x0 +CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 +CONFIG_SOC_INTEL_COMMON=y + +# +# Intel SoC Common Code +# +CONFIG_SOC_INTEL_COMMON_BLOCK=y +# CONFIG_SOC_INTEL_COMMON_BLOCK_CPU is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_MPINIT is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_CAR is not set +# CONFIG_INTEL_CAR_NEM is not set +# CONFIG_INTEL_CAR_CQOS is not set +# CONFIG_INTEL_CAR_NEM_ENHANCED is not set +# CONFIG_USE_INTEL_FSP_MP_INIT is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_CSE is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_VERSION_2 is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_IMC=y +# CONFIG_PMC_INVALID_READ_AFTER_WRITE is not set +# CONFIG_SOC_INTEL_COMMON_EARLY_MMC_WAKE is not set +# CONFIG_SOC_INTEL_COMMON_MMC_OVERRIDE is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_PRMRR_SIZE_MAX is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_PRMRR_SIZE_256MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_PRMRR_SIZE_128MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_PRMRR_SIZE_64MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_PRMRR_SIZE_32MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_PRMRR_SIZE_1MB is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_PRMRR_DISABLED=y +# CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_ESPI_DISABLE is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 +CONFIG_SA_PCIEX_LENGTH=0x10000000 +# CONFIG_SA_ENABLE_IMR is not set +# CONFIG_SA_ENABLE_DPR is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL is not set +# CONFIG_USE_LEGACY_8254_TIMER is not set + +# +# Intel SoC Common PCH Code +# + +# +# Intel SoC Common coreboot stages +# +# CONFIG_SOC_INTEL_COMMON_RESET is not set +# CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE is not set +# CONFIG_ACPI_CONSOLE is not set +# CONFIG_SOC_INTEL_COMMON_ACPI is not set +# CONFIG_SOC_INTEL_COMMON_NHLT is not set +# CONFIG_SOC_INTEL_DEBUG_CONSENT is not set +# CONFIG_SOC_MEDIATEK_MT8173 is not set +# CONFIG_SOC_MEDIATEK_MT8183 is not set +# CONFIG_SOC_NVIDIA_TEGRA124 is not set +# CONFIG_SOC_NVIDIA_TEGRA210 is not set +# CONFIG_SOC_QUALCOMM_COMMON is not set +# CONFIG_SOC_QC_IPQ40XX is not set +# CONFIG_SOC_QC_IPQ806X is not set +# CONFIG_SOC_QUALCOMM_QCS405 is not set +# CONFIG_SOC_QUALCOMM_SC7180 is not set +# CONFIG_SOC_QUALCOMM_SDM845 is not set +# CONFIG_SOC_ROCKCHIP_RK3288 is not set +# CONFIG_SOC_ROCKCHIP_RK3399 is not set +# CONFIG_CPU_SAMSUNG_EXYNOS5250 is not set +# CONFIG_CPU_SAMSUNG_EXYNOS5420 is not set +# CONFIG_SOC_UCB_RISCV is not set + +# +# CPU +# +CONFIG_XIP_ROM_SIZE=0x10000 +CONFIG_NUM_IPI_STARTS=2 +# CONFIG_CPU_AMD_AGESA is not set +CONFIG_ENABLE_MRC_CACHE=y +# CONFIG_CPU_AMD_PI is not set +# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set +CONFIG_SSE2=y +CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE=y +# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set +# CONFIG_CPU_TI_AM335X is not set +# CONFIG_PARALLEL_CPU_INIT is not set +CONFIG_PARALLEL_MP=y +# CONFIG_PARALLEL_MP_AP_WORK is not set +# CONFIG_UDELAY_LAPIC is not set +CONFIG_UDELAY_TSC=y +CONFIG_TSC_MONOTONIC_TIMER=y +# CONFIG_TSC_SYNC_LFENCE is not set +# CONFIG_TSC_SYNC_MFENCE is not set +# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set +CONFIG_LOGICAL_CPUS=y +CONFIG_HAVE_SMI_HANDLER=y +# CONFIG_NO_SMM is not set +# CONFIG_SMM_ASEG is not set +CONFIG_SMM_TSEG=y +CONFIG_SMM_MODULE_HEAP_SIZE=0x4000 +CONFIG_SMM_STUB_STACK_SIZE=0x400 +# CONFIG_SMM_LAPIC_REMAP_MITIGATION is not set +# CONFIG_SERIALIZED_SMM_INITIALIZATION is not set +# CONFIG_X86_AMD_FIXED_MTRRS is not set +# CONFIG_X86_AMD_INIT_SIPI is not set +# CONFIG_MIRROR_PAYLOAD_TO_RAM_BEFORE_LOADING is not set +# CONFIG_SOC_SETS_MSRS is not set +CONFIG_CAR_GLOBAL_MIGRATION=y +CONFIG_SMP=y +CONFIG_SSE=y +CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y +# CONFIG_USES_MICROCODE_HEADER_FILES is not set +CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER is not set +# CONFIG_CPU_MICROCODE_CBFS_NONE is not set CONFIG_CPU_UCODE_BINARIES="3rdparty/purism-blobs/mainboard/purism/librem_l1um/cpu_microcode_blob.bin" + +# +# Northbridge +# +# CONFIG_NORTHBRIDGE_AMD_AGESA is not set +# CONFIG_NORTHBRIDGE_AMD_PI is not set + +# +# Southbridge +# +# CONFIG_AMD_SB_CIMX is not set +# CONFIG_SOUTHBRIDGE_AMD_CIMX_SB800 is not set +# CONFIG_SOUTHBRIDGE_AMD_CIMX_SB900 is not set +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC=y +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMBASE is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_GPIO is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS is not set +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI=y +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ is not set +# CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set + +# +# Super I/O +# +CONFIG_SUPERIO_ASPEED_AST2400=y +CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM=y +# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set +# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set + +# +# Embedded Controllers +# +# CONFIG_EC_GOOGLE_WILCO is not set + +# +# Intel Firmware +# CONFIG_HAVE_ME_BIN=y +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +# CONFIG_HAVE_GBE_BIN is not set +# CONFIG_MAINBOARD_USES_IFD_EC_REGION is not set +# CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +# CONFIG_CAVIUM_BDK is not set +# CONFIG_MAINBOARD_HAS_CHROMEOS is not set +# CONFIG_GOOGLE_SMBIOS_MAINBOARD_VERSION is not set +# CONFIG_UEFI_2_4_BINDING is not set +# CONFIG_UDK_2015_BINDING is not set +# CONFIG_UDK_2017_BINDING is not set +# CONFIG_USE_SIEMENS_HWILIB is not set +# CONFIG_ARM_LPAE is not set +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +# CONFIG_ARCH_POSTCAR_X86_32 is not set +CONFIG_ARCH_RAMSTAGE_X86_32=y +# CONFIG_ARCH_BOOTBLOCK_X86_64 is not set +# CONFIG_ARCH_VERSTAGE_X86_64 is not set +# CONFIG_ARCH_ROMSTAGE_X86_64 is not set +# CONFIG_ARCH_POSTCAR_X86_64 is not set +# CONFIG_ARCH_RAMSTAGE_X86_64 is not set +# CONFIG_USE_MARCH_586 is not set +# CONFIG_AP_IN_SIPI_WAIT is not set +# CONFIG_SIPI_VECTOR_IN_ROM is not set +CONFIG_RAMBASE=0xe00000 +CONFIG_RAMTOP=0x1000000 +# CONFIG_CBMEM_TOP_BACKUP is not set +CONFIG_PC80_SYSTEM=y +# CONFIG_BOOTBLOCK_DEBUG_SPINLOOP is not set +CONFIG_IOAPIC_INTERRUPTS_ON_FSB=y +# CONFIG_IOAPIC_INTERRUPTS_ON_APIC_SERIAL_BUS is not set +# CONFIG_HPET_ADDRESS_OVERRIDE is not set +CONFIG_HPET_ADDRESS=0xfed00000 +CONFIG_ID_SECTION_OFFSET=0x80 +# CONFIG_VERSTAGE_DEBUG_SPINLOOP is not set +# CONFIG_ROMSTAGE_DEBUG_SPINLOOP is not set +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c" +CONFIG_ACPI_HAVE_PCAT_8259=y +# CONFIG_COLLECT_TIMESTAMPS_NO_TSC is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +# CONFIG_PAGING_IN_CACHE_AS_RAM is not set +# CONFIG_IDT_IN_EVERY_STAGE is not set +CONFIG_HAVE_CF9_RESET=y +# CONFIG_PIRQ_ROUTE is not set + +# +# Devices +# +# CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT is not set +# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set +# CONFIG_VGA_ROM_RUN is not set CONFIG_NO_GFX_INIT=y +# CONFIG_MULTIPLE_VGA_ADAPTERS is not set +# CONFIG_SMBUS_HAS_AUX_CHANNELS is not set +CONFIG_PCI=y +# CONFIG_NO_MMCONF_SUPPORT is not set +CONFIG_MMCONF_SUPPORT=y +# CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT is not set +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_AZALIA_PLUGIN_SUPPORT is not set +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +# CONFIG_EARLY_PCI_BRIDGE is not set +# CONFIG_INTEL_GMA_ADD_VBT is not set +# CONFIG_SOFTWARE_I2C is not set + +# +# Generic Drivers +# +# CONFIG_DRIVERS_AS3722_RTC is not set +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_MAINBOARD_HAS_CRB_TPM is not set +# CONFIG_ELOG is not set +# CONFIG_GIC is not set +CONFIG_IPMI_KCS=y +# CONFIG_DRIVERS_LENOVO_WACOM is not set +CONFIG_CACHE_MRC_SETTINGS=y +# CONFIG_MRC_SETTINGS_PROTECT is not set +# CONFIG_HAS_RECOVERY_MRC_CACHE is not set +# CONFIG_MRC_CLEAR_NORMAL_CACHE_ON_RECOVERY_RETRAIN is not set +# CONFIG_MRC_SETTINGS_VARIABLE_DATA is not set +# CONFIG_MRC_WRITE_NV_LATE is not set +# CONFIG_RT8168_GET_MAC_FROM_VPD is not set +# CONFIG_RT8168_SET_LED_MODE is not set +# CONFIG_SMMSTORE is not set +# CONFIG_SMMSTORE_IN_CBFS is not set +CONFIG_SPI_FLASH=y +# CONFIG_SPI_SDCARD is not set +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y +# CONFIG_SPI_FLASH_NO_FAST_READ is not set +CONFIG_SPI_FLASH_ADESTO=y +CONFIG_SPI_FLASH_AMIC=y +CONFIG_SPI_FLASH_ATMEL=y +CONFIG_SPI_FLASH_EON=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_MACRONIX=y +CONFIG_SPI_FLASH_SPANSION=y +CONFIG_SPI_FLASH_SST=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_SPI_FLASH_FAST_READ_DUAL_OUTPUT_3B is not set +# CONFIG_SPI_FLASH_HAS_VOLATILE_GROUP is not set +# CONFIG_HAVE_SPI_CONSOLE_SUPPORT is not set +CONFIG_DRIVERS_UART=y +# CONFIG_DRIVERS_UART_8250IO_SKIP_INIT is not set +# CONFIG_NO_UART_ON_SUPERIO is not set +# CONFIG_UART_OVERRIDE_INPUT_CLOCK_DIVIDER is not set +# CONFIG_UART_OVERRIDE_REFCLK is not set +# CONFIG_DRIVERS_UART_8250MEM is not set +# CONFIG_DRIVERS_UART_8250MEM_32 is not set +# CONFIG_HAVE_UART_SPECIAL is not set +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_DRIVERS_UART_PL011 is not set +# CONFIG_UART_USE_REFCLK_AS_INPUT_CLOCK is not set +# CONFIG_HAVE_USBDEBUG is not set +# CONFIG_HAVE_USBDEBUG_OPTIONS is not set +# CONFIG_VPD is not set +# CONFIG_DRIVERS_GENERIC_WIFI is not set +# CONFIG_DRIVERS_AMD_PI is not set CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -CONFIG_SMBIOS_ENCLOSURE_TYPE=0x17 +# CONFIG_DRIVERS_I2C_MAX98373 is not set +# CONFIG_DRIVERS_I2C_MAX98927 is not set +# CONFIG_DRIVERS_I2C_PCA9538 is not set +# CONFIG_DRIVERS_I2C_PCF8523 is not set +# CONFIG_DRIVERS_I2C_PTN3460 is not set +# CONFIG_DRIVERS_I2C_RT1011 is not set +# CONFIG_DRIVERS_I2C_RT5663 is not set +# CONFIG_DRIVERS_I2C_RTD2132 is not set +# CONFIG_DRIVERS_I2C_RX6110SA is not set +# CONFIG_DRIVERS_I2C_SX9310 is not set +# CONFIG_MAINBOARD_HAS_I2C_TPM_ATMEL is not set +# CONFIG_MAINBOARD_HAS_I2C_TPM_CR50 is not set +# CONFIG_MAINBOARD_HAS_I2C_TPM_GENERIC is not set +CONFIG_PLATFORM_USES_FSP1_0=y + +# +# Intel FSP +# +CONFIG_HAVE_FSP_BIN=y +CONFIG_MRC_CACHE_FMAP=y +CONFIG_USE_GENERIC_FSP_CAR_INC=y +CONFIG_FSP_USES_UPD=y +# CONFIG_PLATFORM_USES_FSP2_0 is not set +# CONFIG_PLATFORM_USES_FSP2_1 is not set +# CONFIG_INTEL_DDI is not set +# CONFIG_INTEL_EDID is not set +# CONFIG_INTEL_INT15 is not set +# CONFIG_INTEL_GMA_ACPI is not set +# CONFIG_INTEL_GMA_SSC_ALTERNATE_REF is not set +# CONFIG_INTEL_GMA_SWSMISCI is not set +# CONFIG_DRIVER_INTEL_I210 is not set +# CONFIG_DRIVERS_INTEL_MIPI_CAMERA is not set +# CONFIG_HAVE_INTEL_PTT is not set +# CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS is not set +# CONFIG_DRIVER_MAXIM_MAX77686 is not set +# CONFIG_DRIVER_PARADE_PS8625 is not set +# CONFIG_DRIVER_PARADE_PS8640 is not set +CONFIG_DRIVERS_MC146818=y +CONFIG_LPC_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +CONFIG_MAINBOARD_HAS_LPC_TPM=y +# CONFIG_DRIVERS_RICOH_RCE822 is not set +# CONFIG_DRIVER_SIEMENS_NC_FPGA is not set +# CONFIG_NC_FPGA_NOTIFY_CB_READY is not set +# CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_MAINBOARD_HAS_SPI_TPM_CR50 is not set +# CONFIG_DRIVER_TI_TPS65090 is not set +# CONFIG_DRIVERS_TI_TPS65913 is not set +# CONFIG_DRIVERS_TI_TPS65913_RTC is not set +# CONFIG_DRIVERS_USB_ACPI is not set +# CONFIG_COMMONLIB_STORAGE is not set + +# +# Security +# + +# +# Verified Boot (vboot) +# + +# +# Trusted Platform Module +# +CONFIG_TPM1=y +# CONFIG_USER_NO_TPM is not set CONFIG_USER_TPM1=y -CONFIG_NO_POST=y +# CONFIG_USER_TPM2 is not set +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set +# CONFIG_TPM_RDRESP_NEED_DELAY is not set + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# CONFIG_INTEL_TXT is not set +# CONFIG_ACPI_SATA_GENERATOR is not set +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +# CONFIG_ACPI_AMD_HARDWARE_SLEEP_VALUES is not set +# CONFIG_BOOT_DEVICE_NOT_SPI_FLASH is not set +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y +# CONFIG_RTC is not set + +# +# Console +# +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_CONSOLE_SERIAL is not set +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +# CONFIG_NO_EARLY_BOOTBLOCK_POSTCODES is not set +CONFIG_HWBASE_DEBUG_CB=y +# CONFIG_HAVE_ACPI_RESUME is not set +# CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK is not set +# CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK is not set +# CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK is not set +# CONFIG_NO_MONOTONIC_TIMER is not set +CONFIG_HAVE_MONOTONIC_TIMER=y +# CONFIG_TIMER_QUEUE is not set +# CONFIG_HAVE_OPTION_TABLE is not set +# CONFIG_PCI_IO_CFG_EXT is not set +CONFIG_IOAPIC=y +# CONFIG_USE_WATCHDOG_ON_BOOT is not set +# CONFIG_GFXUMA is not set +CONFIG_HAVE_ACPI_TABLES=y +# CONFIG_COMMON_FADT is not set +# CONFIG_ACPI_NHLT is not set + +# +# System tables +# +# CONFIG_GENERATE_MP_TABLE is not set +# CONFIG_GENERATE_PIRQ_TABLE is not set +CONFIG_GENERATE_SMBIOS_TABLES=y +# CONFIG_SMBIOS_PROVIDED_BY_MOBO is not set + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_BAYOU is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_YABITS is not set CONFIG_PAYLOAD_LINUX=y +# CONFIG_PAYLOAD_TIANOCORE is not set CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_LINUX_COMMAND_LINE="quiet loglevel=3" +CONFIG_PAYLOAD_OPTIONS="" +# CONFIG_PXE is not set +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set + +# +# Debugging +# + +# +# CPU Debug Settings +# +CONFIG_HAVE_DISPLAY_MTRRS=y +# CONFIG_DISPLAY_MTRRS is not set + +# +# BLOB Debug Settings +# + +# +# General Debug Settings +# +# CONFIG_FATAL_ASSERTS is not set +# CONFIG_DEBUG_CBFS is not set +# CONFIG_HAVE_DEBUG_RAM_SETUP is not set +# CONFIG_HAVE_DEBUG_SMBUS is not set +# CONFIG_DEBUG_SMI is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_SPI_FLASH is not set +# CONFIG_TRACE is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +CONFIG_HAVE_EM100_SUPPORT=y +# CONFIG_EM100 is not set +CONFIG_NO_EDID_FILL_FB=y +CONFIG_NO_FMAP_CACHE=y +# CONFIG_ENABLE_APIC_EXT_ID is not set +CONFIG_WARNINGS_ARE_ERRORS=y +# CONFIG_POWER_BUTTON_DEFAULT_ENABLE is not set +# CONFIG_POWER_BUTTON_DEFAULT_DISABLE is not set +# CONFIG_POWER_BUTTON_FORCE_ENABLE is not set +# CONFIG_POWER_BUTTON_FORCE_DISABLE is not set +# CONFIG_POWER_BUTTON_IS_OPTIONAL is not set +# CONFIG_REG_SCRIPT is not set +# CONFIG_NO_XIP_EARLY_STAGES is not set +# CONFIG_EARLY_CBMEM_LIST is not set +CONFIG_RELOCATABLE_MODULES=y +CONFIG_NO_STAGE_CACHE=y +CONFIG_BOOTBLOCK_CUSTOM=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index 8b473eb0a..b9b6edb95 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -20,6 +20,7 @@ CONFIG_ARCH_SUPPORTS_CLANG=y CONFIG_OPTION_BACKEND_NONE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -142,11 +143,10 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x20400 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_l1um_v2/flashdescriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_l1um_v2/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set @@ -177,7 +177,6 @@ CONFIG_DRIVERS_UART_8250IO=y CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_FSP_TEMP_RAM_SIZE=0x10000 CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_L1UM_V2=y -CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 # CONFIG_DRIVERS_IPMI_SUPERMICRO_OEM is not set CONFIG_TPM_MEASURED_BOOT=y @@ -194,6 +193,7 @@ CONFIG_BOARD_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set CONFIG_COREBOOT_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=32768 @@ -213,7 +213,7 @@ CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 # # SoC # -CONFIG_CHIPSET_DEVICETREE="" +CONFIG_CHIPSET_DEVICETREE="soc/intel/cannonlake/chipset_pch_h.cb" CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 @@ -224,6 +224,9 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=216 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -257,6 +260,7 @@ CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_CBFS_CACHE_ALIGN=8 @@ -281,7 +285,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -303,7 +306,9 @@ CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_12=y CONFIG_ME_SPEC=12 +CONFIG_CSE_RESET_CLEAR_EC_AP_IDLE_FLAG=y CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y @@ -342,7 +347,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_HECI_DISABLE_USING_SMM=y CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y @@ -456,8 +460,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y @@ -497,7 +503,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -505,8 +511,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -582,7 +586,7 @@ CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -620,6 +624,7 @@ CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -652,6 +657,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -717,6 +723,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -740,6 +747,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index 68fea7412..d4842e182 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -22,6 +22,7 @@ CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -147,14 +148,14 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x20400 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini/flashdescriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 +CONFIG_EDK2_BOOT_TIMEOUT=4 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y -CONFIG_USE_LEGACY_8254_TIMER=y +# CONFIG_USE_LEGACY_8254_TIMER is not set # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini" CONFIG_HAVE_IFD_BIN=y @@ -184,7 +185,6 @@ CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_CNL=y CONFIG_PC_CMOS_BASE_PORT_BANK1=0x360 # CONFIG_ENABLE_EC_UART1 is not set CONFIG_FSP_TEMP_RAM_SIZE=0x10000 -CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y @@ -199,6 +199,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -218,7 +219,7 @@ CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 # # SoC # -CONFIG_CHIPSET_DEVICETREE="" +CONFIG_CHIPSET_DEVICETREE="soc/intel/cannonlake/chipset.cb" CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 @@ -229,6 +230,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=216 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -261,6 +264,7 @@ CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_CBFS_CACHE_ALIGN=8 @@ -285,7 +289,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -307,7 +310,9 @@ CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_12=y CONFIG_ME_SPEC=12 +CONFIG_CSE_RESET_CLEAR_EC_AP_IDLE_FLAG=y CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y @@ -347,7 +352,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_HECI_DISABLE_USING_SMM=y CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y @@ -458,7 +462,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -467,6 +474,7 @@ CONFIG_BOOTBLOCK_SIMPLE=y CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_IDT_IN_EVERY_STAGE=y CONFIG_HAVE_CF9_RESET=y +CONFIG_ACPI_CF9_FULL_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y @@ -499,7 +507,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -508,8 +516,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -569,6 +575,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Skylake" @@ -582,7 +592,7 @@ CONFIG_DRIVERS_MC146818=y CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -607,6 +617,7 @@ CONFIG_NO_TPM=y CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -638,6 +649,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -700,6 +712,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -724,6 +737,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index 8c2e5c3e1..cbe34a87a 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -22,6 +22,7 @@ CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -147,14 +148,14 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x20400 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini_v2/flashdescriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini_v2/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_VBT_DATA_SIZE_KB=8 +CONFIG_EDK2_BOOT_TIMEOUT=4 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y -CONFIG_USE_LEGACY_8254_TIMER=y +# CONFIG_USE_LEGACY_8254_TIMER is not set # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini v2" CONFIG_HAVE_IFD_BIN=y @@ -184,7 +185,6 @@ CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_CNL=y CONFIG_PC_CMOS_BASE_PORT_BANK1=0x360 # CONFIG_ENABLE_EC_UART1 is not set CONFIG_FSP_TEMP_RAM_SIZE=0x10000 -CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y @@ -199,6 +199,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -218,7 +219,7 @@ CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 # # SoC # -CONFIG_CHIPSET_DEVICETREE="" +CONFIG_CHIPSET_DEVICETREE="soc/intel/cannonlake/chipset.cb" CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 @@ -229,6 +230,8 @@ CONFIG_SMM_RESERVED_SIZE=0x200000 CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=216 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -243,7 +246,7 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=3 CONFIG_SOC_INTEL_I2C_DEV_MAX=6 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x30 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0xc35 -CONFIG_FSP_HEADER_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Include/" +CONFIG_FSP_HEADER_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake2/Include/" CONFIG_FSP_FD_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Fsp.fd" CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 CONFIG_INTEL_GMA_BCLV_WIDTH=32 @@ -255,13 +258,15 @@ CONFIG_HAVE_PAM0_REGISTER=y CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_SOC_INTEL_CANNONLAKE_BASE=y CONFIG_SOC_INTEL_COMETLAKE=y -CONFIG_SOC_INTEL_COMETLAKE_1=y +CONFIG_SOC_INTEL_COMETLAKE_1_2=y +CONFIG_FSP_FD_PATH_2="3rdparty/fsp/CometLakeFspBinPkg/CometLake2/Fsp.fd" CONFIG_SOC_INTEL_CANNONLAKE_DEBUG_CONSENT=0 CONFIG_INTEL_TXT_BIOSACM_ALIGNMENT=0x40000 CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_CBFS_CACHE_ALIGN=8 @@ -286,7 +291,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y # CONFIG_USE_INTEL_FSP_MP_INIT is not set -# CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y @@ -308,7 +312,9 @@ CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_12=y CONFIG_ME_SPEC=12 +CONFIG_CSE_RESET_CLEAR_EC_AP_IDLE_FLAG=y CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y @@ -347,7 +353,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y @@ -459,7 +464,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -468,6 +476,7 @@ CONFIG_BOOTBLOCK_SIMPLE=y CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_IDT_IN_EVERY_STAGE=y CONFIG_HAVE_CF9_RESET=y +CONFIG_ACPI_CF9_FULL_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y @@ -500,7 +509,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -509,8 +518,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -553,10 +560,15 @@ CONFIG_PLATFORM_USES_FSP2_0=y CONFIG_PLATFORM_USES_FSP2_X86_32=y CONFIG_HAVE_INTEL_FSP_REPO=y CONFIG_ADD_FSP_BINARIES=y +CONFIG_PLATFORM_USES_SECOND_FSP=y CONFIG_FSP_T_LOCATION=0xfffe0000 CONFIG_FSP_S_CBFS="fsps.bin" CONFIG_FSP_M_CBFS="fspm.bin" CONFIG_FSP_FULL_FD=y +CONFIG_FSP_S_CBFS_2="fsps_2.bin" +CONFIG_FSP_M_CBFS_2="fspm_2.bin" +CONFIG_FSP_M_FILE_2="$(obj)/Fsp_2_M.fd" +CONFIG_FSP_S_FILE_2="$(obj)/Fsp_2_S.fd" CONFIG_FSP_T_RESERVED_SIZE=0x0 CONFIG_FSP_M_XIP=y CONFIG_FSP_USES_CB_STACK=y @@ -570,6 +582,10 @@ CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Skylake" @@ -583,7 +599,7 @@ CONFIG_DRIVERS_MC146818=y CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -608,6 +624,7 @@ CONFIG_NO_TPM=y CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -639,6 +656,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -701,6 +719,7 @@ CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -725,6 +744,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 19c43d6d8..d777c25bd 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -14,12 +14,15 @@ CONFIG_COMPILER_GCC=y CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set # CONFIG_OPTION_BACKEND_NONE is not set CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set -CONFIG_COMPRESS_RAMSTAGE=y +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -37,10 +40,15 @@ CONFIG_BOOTSPLASH_IMAGE=y CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=90 -CONFIG_BOOTSPLASH_CONVERT_RESIZE=y -CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1920x1080" +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set # CONFIG_FW_CONFIG is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) # end of General setup # @@ -58,30 +66,29 @@ CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1920x1080" # CONFIG_VENDOR_APPLE is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set -# CONFIG_VENDOR_BAP is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set # CONFIG_VENDOR_DELL is not set -# CONFIG_VENDOR_ELMEX is not set # CONFIG_VENDOR_EMULATION is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set -# CONFIG_VENDOR_GIZMOSPHERE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set -# CONFIG_VENDOR_JETWAY is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set # CONFIG_VENDOR_LENOVO is not set # CONFIG_VENDOR_LIBRETREND is not set -# CONFIG_VENDOR_LIPPERT is not set # CONFIG_VENDOR_MSI is not set CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_OCP is not set @@ -97,7 +104,6 @@ CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -121,16 +127,16 @@ CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_DEVICE is not set # CONFIG_POST_IO is not set CONFIG_UART_FOR_CONSOLE=0 +CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x56 +CONFIG_VBOOT_VBNV_OFFSET=0x28 CONFIG_VARIANT_DIR="ns50pu" -CONFIG_DEVICETREE="devicetree.cb" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Nitrokey" CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" # CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x2000 -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x4000 CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 @@ -141,22 +147,27 @@ CONFIG_CONSOLE_POST=y # CONFIG_USE_PM_ACPI_TIMER is not set CONFIG_TPM_PIRQ=0x27 # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_VBOOT_FWID_VERSION="$(CONFIG_LOCALVERSION)" CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +CONFIG_EC_SYSTEM76_EC_FLASH_SIZE=0x20000 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfef00000 CONFIG_DCACHE_RAM_SIZE=0xc0000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x80400 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_DRIVERS_INTEL_WIFI=y -CONFIG_IFD_BIN_PATH="../nitrokey-blobs/nitropad-ns51/flashdescriptor-HAP.bin" -CONFIG_ME_BIN_PATH="../nitrokey-blobs/nitropad-ns51/me.bin" +CONFIG_IFD_BIN_PATH="3rdparty/dasharo-blobs/novacustom/ns5x_adl/descriptor.bin" +CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/ns5x_adl/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=42 CONFIG_PCIEXP_HOTPLUG_MEM=0xc200000 @@ -176,11 +187,15 @@ CONFIG_BOARD_NOVACUSTOM_NS5X_ADLP=y # CONFIG_BOARD_NOVACUSTOM_NV4X_TGLU is not set # CONFIG_BOARD_NOVACUSTOM_NS5X_TGLU is not set CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y CONFIG_PCIEXP_CLK_PM=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x10000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_FSP_TEMP_RAM_SIZE=0x20000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set @@ -194,16 +209,17 @@ CONFIG_BOARD_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set CONFIG_COREBOOT_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=32768 CONFIG_ROM_SIZE=0x02000000 CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y -# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set # CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 # end of Mainboard CONFIG_SYSTEM_TYPE_LAPTOP=y @@ -215,11 +231,11 @@ CONFIG_SYSTEM_TYPE_LAPTOP=y # # SoC # -CONFIG_ARCH_ALL_STAGES_X86=y CONFIG_CHIPSET_DEVICETREE="soc/intel/alderlake/chipset.cb" +CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" +CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 -CONFIG_FSP_TEMP_RAM_SIZE=0x20000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_CONSOLE_UART_BASE_ADDRESS=0xfe03e000 CONFIG_SMM_TSEG_SIZE=0x800000 @@ -229,10 +245,9 @@ CONFIG_ACPI_BERT=y CONFIG_ACPI_BERT_SIZE=0x10000 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=133 CONFIG_VBOOT_HASH_BLOCK_SIZE=0x1000 -CONFIG_CPU_SPECIFIC_OPTIONS=y -CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" -CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02d" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_SOC_INTEL_ALDERLAKE=y CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y @@ -250,24 +265,24 @@ CONFIG_MAX_PCIE_CLOCK_SRC=10 CONFIG_MAX_PCIE_CLOCK_REQ=10 CONFIG_PCR_BASE_ADDRESS=0xfd000000 CONFIG_CPU_BCLK_MHZ=100 +CONFIG_SOC_INTEL_PERFORMANCE_CORE_SCALE_FACTOR=127 +CONFIG_SOC_INTEL_EFFICIENT_CORE_SCALE_FACTOR=100 CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_CLOCK_MHZ=120 CONFIG_CPU_XTAL_HZ=38400000 CONFIG_SOC_INTEL_UFS_CLK_FREQ_HZ=19200000 CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=7 CONFIG_SOC_INTEL_I2C_DEV_MAX=8 +# CONFIG_ENABLE_SATA_TEST_MODE is not set CONFIG_SOC_INTEL_UART_DEV_MAX=7 -CONFIG_VBT_DATA_SIZE_KB=9 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x25a CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0x7fff CONFIG_FSP_HEADER_PATH="3rdparty/fsp/AlderLakeFspBinPkg/Client/AlderLakeP/Include/" -CONFIG_FSP_FD_PATH="3rdparty/fsp/AlderLakeFspBinPkg/Client/AlderLakeP/Fsp.fd" +CONFIG_FSP_FD_PATH="3rdparty/fsp/RaptorLakeFspBinPkg/Client/RaptorLakeP/Fsp.fd" CONFIG_SOC_INTEL_ALDERLAKE_DEBUG_CONSENT=0 CONFIG_DATA_BUS_WIDTH=128 CONFIG_DIMMS_PER_CHANNEL=2 CONFIG_MRC_CHANNEL_WIDTH=16 -CONFIG_ACPI_ADL_IPU_ES_SUPPORT=y -CONFIG_USE_FSP_MP_INIT=y -# CONFIG_USE_COREBOOT_MP_INIT is not set +CONFIG_ALDERLAKE_ENABLE_SOC_WORKAROUND=y CONFIG_SI_DESC_REGION="SI_DESC" CONFIG_SI_DESC_REGION_SZ=4096 # CONFIG_BUILDING_WITH_DEBUG_FSP is not set @@ -275,14 +290,22 @@ CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 CONFIG_INTEL_GMA_BCLV_WIDTH=32 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8254 CONFIG_INTEL_GMA_BCLM_WIDTH=32 +CONFIG_FSP_PUBLISH_MBP_HOB=y +# CONFIG_INCLUDE_HSPHY_IN_FMAP is not set +CONFIG_HSPHY_FW_MAX_SIZE=0x8000 CONFIG_MAX_HECI_DEVICES=6 CONFIG_BOOTBLOCK_IN_CBFS=y -CONFIG_PCIEXP_ASPM=y +CONFIG_HAVE_PAM0_REGISTER=y CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 +CONFIG_CPU_MAX_TEMPERATURE=100 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 -CONFIG_UART_PCI_ADDR=0x0 +CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 +CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_INTEL_TME=y CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y +CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_SOC_INTEL_COMMON=y @@ -298,10 +321,14 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP_LPM_REQ=y CONFIG_SOC_INTEL_COMMON_BLOCK_CRASHLOG=y CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPPC=y CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPU_HYBRID=y +CONFIG_SOC_INTEL_UFS_OCP_TIMER_DISABLE=y +CONFIG_SOC_INTEL_UFS_LTR_DISQUALIFY=y CONFIG_SOC_INTEL_COMMON_BLOCK_CHIP_CONFIG=y CONFIG_SOC_INTEL_COMMON_BLOCK_CNVI=y CONFIG_SOC_INTEL_COMMON_BLOCK_CPU=y CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_MPINIT=y +CONFIG_USE_FSP_FEATURE_PROGRAM_ON_APS=y +# CONFIG_USE_COREBOOT_MP_INIT is not set CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y @@ -310,13 +337,14 @@ CONFIG_COS_MAPPED_TO_MSB=y CONFIG_CAR_HAS_L3_PROTECTED_WAYS=y CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI=y CONFIG_CPU_SUPPORTS_INTEL_TME=y -CONFIG_INTEL_TME=y +# CONFIG_TME_KEY_REGENERATION_ON_WARM_BOOT is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y +# CONFIG_INTEL_KEYLOCKER is not set CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=y CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=y -CONFIG_SOC_INTEL_CSE_HAVE_HAP=y +CONFIG_SOC_INTEL_CSE_SEND_EOP_LATE=y CONFIG_SOC_INTEL_CSE_FMAP_NAME="SI_ME" CONFIG_SOC_INTEL_CSE_RW_A_FMAP_NAME="ME_RW_A" CONFIG_SOC_INTEL_CSE_RW_B_FMAP_NAME="ME_RW_B" @@ -330,6 +358,9 @@ CONFIG_SOC_INTEL_CSE_IOM_CBFS_NAME="cse_iom" CONFIG_SOC_INTEL_CSE_IOM_CBFS_FILE="" CONFIG_SOC_INTEL_CSE_NPHY_CBFS_NAME="cse_nphy" CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_16=y +CONFIG_ME_SPEC=16 CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y @@ -354,6 +385,9 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_LPC=y CONFIG_SOC_INTEL_COMMON_BLOCK_LPC_MIRROR_TO_GPMR=y CONFIG_SOC_INTEL_COMMON_BLOCK_LPSS=y CONFIG_SOC_INTEL_COMMON_BLOCK_MEMINIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_OC_WDT=y +# CONFIG_SOC_INTEL_COMMON_OC_WDT_ENABLE is not set +# CONFIG_SOC_INTEL_COMMON_OC_WDT_WDAT is not set CONFIG_SOC_INTEL_COMMON_BLOCK_BASE_P2SB=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE_RTD3=y @@ -367,7 +401,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_POWER_LIMIT=y CONFIG_SOC_INTEL_COMMON_BLOCK_RTC=y CONFIG_SOC_INTEL_COMMON_BLOCK_SATA=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS=y -CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_SOC_INTEL_COMMON_BLOCK_TCO=y CONFIG_SOC_INTEL_COMMON_BLOCK_TCO_ENABLE_THROUGH_SMBUS=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM=y @@ -377,7 +410,7 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y -# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set +# CONFIG_TCSS_HAS_USBC_OPS is not set CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_BEHIND_PMC=y CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y @@ -387,6 +420,10 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_USB4=y CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_PCIE=y CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_XHCI=y CONFIG_SOC_INTEL_ENABLE_USB4_PCIE_RESOURCES=y +CONFIG_FIRMWARE_CONNECTION_MANAGER=y +# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_VTD=y +# CONFIG_ENABLE_EARLY_DMA_PROTECTION is not set CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI=y CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y @@ -397,7 +434,9 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y CONFIG_SOC_INTEL_COMMON_PCH_BASE=y CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=y +CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM=y CONFIG_PCH_SPECIFIC_BASE_OPTIONS=y +CONFIG_PCH_SPECIFIC_DISCRETE_OPTIONS=y CONFIG_PCH_SPECIFIC_CLIENT_OPTIONS=y # @@ -415,14 +454,13 @@ CONFIG_SOC_INTEL_CRASHLOG=y # # CPU # -CONFIG_SSE2=y CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE=y CONFIG_CPU_INTEL_COMMON=y CONFIG_ENABLE_VMX=y CONFIG_SET_IA32_FC_LOCK_BIT=y CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_VOLTAGE=y CONFIG_CPU_INTEL_COMMON_SMM=y -CONFIG_MICROCODE_UPDATE_PRE_RAM=y CONFIG_PARALLEL_MP=y CONFIG_PARALLEL_MP_AP_WORK=y CONFIG_XAPIC_ONLY=y @@ -431,13 +469,14 @@ CONFIG_XAPIC_ONLY=y # CONFIG_X2APIC_LATE_WORKAROUND is not set CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y -CONFIG_LOGICAL_CPUS=y +CONFIG_X86_CLFLUSH_CAR=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y -CONFIG_SMM_STUB_STACK_SIZE=0x400 -CONFIG_CPU_INFO_V2=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y CONFIG_SSE=y +CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y @@ -456,8 +495,10 @@ CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y # CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +# CONFIG_INTEL_CHIPSET_LOCKDOWN is not set CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 CONFIG_RCBA_LENGTH=0x4000 @@ -468,25 +509,44 @@ CONFIG_RCBA_LENGTH=0x4000 # # Embedded Controllers # +CONFIG_EC_ACPI=y CONFIG_EC_SYSTEM76_EC=y -CONFIG_EC_SYSTEM76_EC_COLOR_KEYBOARD=y -CONFIG_EC_SYSTEM76_EC_ACPI_DEVICE_HID="17761776" +# CONFIG_EC_SYSTEM76_EC_UPDATE is not set # # Intel Firmware # +CONFIG_IFDTOOL_DISABLE_ME=y CONFIG_HAVE_ME_BIN=y # CONFIG_STITCH_ME_BIN is not set # CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +CONFIG_HAVE_INTEL_ME_HAP=y +# CONFIG_INTEL_ME_DISABLED_HECI is not set +CONFIG_INTEL_ME_DISABLED_HAP=y +# CONFIG_INTEL_ME_ENABLED is not set +CONFIG_INTEL_ME_DEFAULT_STATE=2 # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_BIOS_VENDOR="3mdeb" + +# +# Dasharo +# + +# +# Dasharo Configuration +# +CONFIG_DASHARO_PREFER_S3_SLEEP=y +# CONFIG_DASHARO_FIRMWARE_UPDATE_MODE is not set +# end of Dasharo Configuration + CONFIG_UDK_BASE=y CONFIG_UDK_202005_BINDING=y CONFIG_UDK_2013_VERSION=2013 CONFIG_UDK_2017_VERSION=2017 CONFIG_UDK_202005_VERSION=202005 -CONFIG_UDK_202111_VERSION=202111 +CONFIG_UDK_202302_VERSION=202302 CONFIG_UDK_VERSION=202005 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y @@ -495,8 +555,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_CUSTOM_BOOTMEDIA=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -509,6 +571,7 @@ CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -519,6 +582,7 @@ CONFIG_HAVE_FSP_GOP=y # CONFIG_VGA_ROM_RUN is not set CONFIG_RUN_FSP_GOP=y # CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y # # Display @@ -531,8 +595,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -540,6 +603,7 @@ CONFIG_PCI_ALLOW_BUS_MASTER=y CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 # CONFIG_EARLY_PCI_BRIDGE is not set @@ -549,7 +613,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -CONFIG_RESOURCE_ALLOCATOR_V4=y +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set # end of Devices # @@ -560,11 +624,11 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y CONFIG_MRC_SETTINGS_PROTECT=y -CONFIG_SMMSTORE=y +# CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y -CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_SMM=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -575,6 +639,7 @@ CONFIG_DRIVERS_UART_8250MEM_32=y # CONFIG_VPD is not set CONFIG_DRIVERS_GENERIC_BAYHUB_LV2=y # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set @@ -608,18 +673,26 @@ CONFIG_FSPS_USE_MULTI_PHASE_INIT=y CONFIG_FSP_USES_CB_DEBUG_EVENT_HANDLER=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_FSP_ENABLE_SERIAL_DEBUG=y +CONFIG_FSP_MULTIPHASE_SI_INIT_RETURN_BROKEN=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_INTEL_GMA_OPREGION_2_1=y +CONFIG_INTEL_GMA_VERSION_2=y CONFIG_DRIVERS_INTEL_PMC=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set # CONFIG_DRIVERS_PS2_KEYBOARD is not set CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_MTK_WIFI=y CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V2=y CONFIG_DRIVERS_INTEL_USB4_RETIMER=y @@ -644,14 +717,24 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set +# CONFIG_TPM1 is not set CONFIG_TPM2=y CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM2=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_MEASURED_BOOT=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM2=y +# CONFIG_TPM_HASH_SHA1 is not set +CONFIG_TPM_HASH_SHA256=y +# CONFIG_TPM_HASH_SHA384 is not set +# CONFIG_TPM_HASH_SHA512 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -661,24 +744,31 @@ CONFIG_PLATFORM_HAS_DRAM_CLEAR=y # CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set # end of Memory initialization +CONFIG_INTEL_TXT_LIB=y # CONFIG_INTEL_TXT is not set # CONFIG_STM is not set # CONFIG_INTEL_CBNT_SUPPORT is not set -CONFIG_BOOTMEDIA_LOCK_NONE=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_NONE is not set +CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y # CONFIG_BOOTMEDIA_LOCK_CHIP is not set +CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +# CONFIG_BOOTMEDIA_LOCK_WPRO_VBOOT_RO is not set # CONFIG_BOOTMEDIA_SMM_BWP is not set # end of Security CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_ACPI_LPIT=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -692,6 +782,7 @@ CONFIG_FIXED_UART_FOR_CONSOLE=y CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set # CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_CONSOLE_SYSTEM76_EC is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y @@ -709,6 +800,7 @@ CONFIG_CONSOLE_USE_ANSI_ESCAPES=y CONFIG_HWBASE_DEBUG_CB=y # end of Console +CONFIG_ACPI_S1_NOT_SUPPORTED=y CONFIG_HAVE_ACPI_RESUME=y CONFIG_RESUME_PATH_SAME_AS_BOOT=y CONFIG_HAVE_MONOTONIC_TIMER=y @@ -734,13 +826,19 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" + +# +# Dasharo specific payload options +# +# end of Dasharo specific payload options + +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -765,6 +863,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -772,6 +874,7 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # CONFIG_DISPLAY_FSP_HEADER is not set # CONFIG_VERIFY_HOBS is not set CONFIG_DISPLAY_FSP_VERSION_INFO=y +# CONFIG_ENABLE_FSP_ERROR_INFO is not set CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y # CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set @@ -787,7 +890,6 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -795,9 +897,11 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_SPD_READ_BY_WORD=y +CONFIG_DECOMPRESS_OFAST=y CONFIG_WARNINGS_ARE_ERRORS=y CONFIG_MAX_REBOOT_CNT=3 CONFIG_RELOCATABLE_MODULES=y diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-novacustom-nv4x_adl.config similarity index 82% rename from config/coreboot-nitropad-nv41.config rename to config/coreboot-novacustom-nv4x_adl.config index 631e61766..d36edb6b0 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-novacustom-nv4x_adl.config @@ -14,12 +14,15 @@ CONFIG_COMPILER_GCC=y CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set # CONFIG_OPTION_BACKEND_NONE is not set CONFIG_USE_OPTION_TABLE=y # CONFIG_STATIC_OPTION_TABLE is not set -CONFIG_COMPRESS_RAMSTAGE=y +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -37,10 +40,15 @@ CONFIG_BOOTSPLASH_IMAGE=y CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=90 -CONFIG_BOOTSPLASH_CONVERT_RESIZE=y -CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1920x1080" +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set # CONFIG_FW_CONFIG is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) # end of General setup # @@ -58,30 +66,29 @@ CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1920x1080" # CONFIG_VENDOR_APPLE is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set -# CONFIG_VENDOR_BAP is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set # CONFIG_VENDOR_DELL is not set -# CONFIG_VENDOR_ELMEX is not set # CONFIG_VENDOR_EMULATION is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set -# CONFIG_VENDOR_GIZMOSPHERE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set -# CONFIG_VENDOR_JETWAY is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set # CONFIG_VENDOR_LENOVO is not set # CONFIG_VENDOR_LIBRETREND is not set -# CONFIG_VENDOR_LIPPERT is not set # CONFIG_VENDOR_MSI is not set CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_OCP is not set @@ -97,7 +104,6 @@ CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -121,42 +127,47 @@ CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_DEVICE is not set # CONFIG_POST_IO is not set CONFIG_UART_FOR_CONSOLE=0 +CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x56 +CONFIG_VBOOT_VBNV_OFFSET=0x28 CONFIG_VARIANT_DIR="nv40pz" -CONFIG_DEVICETREE="devicetree.cb" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Nitrokey" +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Notebook" CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" # CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x2000 -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x4000 CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_BOARD_CLEVO_ADLP_COMMON=y CONFIG_BOARD_CLEVO_NV40PZ_BASE=y -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Nitropad NV41" +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="NV4xPZ" CONFIG_CONSOLE_POST=y # CONFIG_USE_PM_ACPI_TIMER is not set -CONFIG_TPM_PIRQ=0x0 +CONFIG_TPM_PIRQ=0x27 # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_VBOOT_FWID_VERSION="$(CONFIG_LOCALVERSION)" CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +CONFIG_EC_SYSTEM76_EC_FLASH_SIZE=0x20000 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfef00000 CONFIG_DCACHE_RAM_SIZE=0xc0000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x80400 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_DRIVERS_INTEL_WIFI=y -CONFIG_IFD_BIN_PATH="../nitrokey-blobs/nitropad-nv41/flashdescriptor-HAP.bin" -CONFIG_ME_BIN_PATH="../nitrokey-blobs/nitropad-nv41/me.bin" +CONFIG_IFD_BIN_PATH="3rdparty/dasharo-blobs/novacustom/nv4x_adl/descriptor.bin" +CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/nv4x_adl/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=42 CONFIG_PCIEXP_HOTPLUG_MEM=0xc200000 @@ -176,11 +187,15 @@ CONFIG_BOARD_NOVACUSTOM_NV4X_ADLP=y # CONFIG_BOARD_NOVACUSTOM_NV4X_TGLU is not set # CONFIG_BOARD_NOVACUSTOM_NS5X_TGLU is not set CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y CONFIG_PCIEXP_CLK_PM=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x10000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_FSP_TEMP_RAM_SIZE=0x20000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set @@ -194,16 +209,17 @@ CONFIG_BOARD_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set CONFIG_COREBOOT_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=32768 CONFIG_ROM_SIZE=0x02000000 CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y -# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set # CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 # end of Mainboard CONFIG_SYSTEM_TYPE_LAPTOP=y @@ -215,11 +231,11 @@ CONFIG_SYSTEM_TYPE_LAPTOP=y # # SoC # -CONFIG_ARCH_ALL_STAGES_X86=y CONFIG_CHIPSET_DEVICETREE="soc/intel/alderlake/chipset.cb" +CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" +CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 -CONFIG_FSP_TEMP_RAM_SIZE=0x20000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_CONSOLE_UART_BASE_ADDRESS=0xfe03e000 CONFIG_SMM_TSEG_SIZE=0x800000 @@ -229,10 +245,9 @@ CONFIG_ACPI_BERT=y CONFIG_ACPI_BERT_SIZE=0x10000 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=133 CONFIG_VBOOT_HASH_BLOCK_SIZE=0x1000 -CONFIG_CPU_SPECIFIC_OPTIONS=y -CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" -CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02d" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_SOC_INTEL_ALDERLAKE=y CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y @@ -250,24 +265,24 @@ CONFIG_MAX_PCIE_CLOCK_SRC=10 CONFIG_MAX_PCIE_CLOCK_REQ=10 CONFIG_PCR_BASE_ADDRESS=0xfd000000 CONFIG_CPU_BCLK_MHZ=100 +CONFIG_SOC_INTEL_PERFORMANCE_CORE_SCALE_FACTOR=127 +CONFIG_SOC_INTEL_EFFICIENT_CORE_SCALE_FACTOR=100 CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_CLOCK_MHZ=120 CONFIG_CPU_XTAL_HZ=38400000 CONFIG_SOC_INTEL_UFS_CLK_FREQ_HZ=19200000 CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=7 CONFIG_SOC_INTEL_I2C_DEV_MAX=8 +# CONFIG_ENABLE_SATA_TEST_MODE is not set CONFIG_SOC_INTEL_UART_DEV_MAX=7 -CONFIG_VBT_DATA_SIZE_KB=9 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x25a CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0x7fff CONFIG_FSP_HEADER_PATH="3rdparty/fsp/AlderLakeFspBinPkg/Client/AlderLakeP/Include/" -CONFIG_FSP_FD_PATH="3rdparty/fsp/AlderLakeFspBinPkg/Client/AlderLakeP/Fsp.fd" +CONFIG_FSP_FD_PATH="3rdparty/fsp/RaptorLakeFspBinPkg/Client/RaptorLakeP/Fsp.fd" CONFIG_SOC_INTEL_ALDERLAKE_DEBUG_CONSENT=0 CONFIG_DATA_BUS_WIDTH=128 CONFIG_DIMMS_PER_CHANNEL=2 CONFIG_MRC_CHANNEL_WIDTH=16 -CONFIG_ACPI_ADL_IPU_ES_SUPPORT=y -CONFIG_USE_FSP_MP_INIT=y -# CONFIG_USE_COREBOOT_MP_INIT is not set +CONFIG_ALDERLAKE_ENABLE_SOC_WORKAROUND=y CONFIG_SI_DESC_REGION="SI_DESC" CONFIG_SI_DESC_REGION_SZ=4096 # CONFIG_BUILDING_WITH_DEBUG_FSP is not set @@ -275,14 +290,22 @@ CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 CONFIG_INTEL_GMA_BCLV_WIDTH=32 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8254 CONFIG_INTEL_GMA_BCLM_WIDTH=32 +CONFIG_FSP_PUBLISH_MBP_HOB=y +# CONFIG_INCLUDE_HSPHY_IN_FMAP is not set +CONFIG_HSPHY_FW_MAX_SIZE=0x8000 CONFIG_MAX_HECI_DEVICES=6 CONFIG_BOOTBLOCK_IN_CBFS=y -CONFIG_PCIEXP_ASPM=y +CONFIG_HAVE_PAM0_REGISTER=y CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 +CONFIG_CPU_MAX_TEMPERATURE=100 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 -CONFIG_UART_PCI_ADDR=0x0 +CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 +CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_INTEL_TME=y CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y +CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_SOC_INTEL_COMMON=y @@ -298,10 +321,14 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP_LPM_REQ=y CONFIG_SOC_INTEL_COMMON_BLOCK_CRASHLOG=y CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPPC=y CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPU_HYBRID=y +CONFIG_SOC_INTEL_UFS_OCP_TIMER_DISABLE=y +CONFIG_SOC_INTEL_UFS_LTR_DISQUALIFY=y CONFIG_SOC_INTEL_COMMON_BLOCK_CHIP_CONFIG=y CONFIG_SOC_INTEL_COMMON_BLOCK_CNVI=y CONFIG_SOC_INTEL_COMMON_BLOCK_CPU=y CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_MPINIT=y +CONFIG_USE_FSP_FEATURE_PROGRAM_ON_APS=y +# CONFIG_USE_COREBOOT_MP_INIT is not set CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y CONFIG_INTEL_CAR_NEM_ENHANCED=y @@ -310,13 +337,14 @@ CONFIG_COS_MAPPED_TO_MSB=y CONFIG_CAR_HAS_L3_PROTECTED_WAYS=y CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI=y CONFIG_CPU_SUPPORTS_INTEL_TME=y -CONFIG_INTEL_TME=y +# CONFIG_TME_KEY_REGENERATION_ON_WARM_BOOT is not set CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y CONFIG_HAVE_HYPERTHREADING=y CONFIG_FSP_HYPERTHREADING=y +# CONFIG_INTEL_KEYLOCKER is not set CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=y CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=y -CONFIG_SOC_INTEL_CSE_HAVE_HAP=y +CONFIG_SOC_INTEL_CSE_SEND_EOP_LATE=y CONFIG_SOC_INTEL_CSE_FMAP_NAME="SI_ME" CONFIG_SOC_INTEL_CSE_RW_A_FMAP_NAME="ME_RW_A" CONFIG_SOC_INTEL_CSE_RW_B_FMAP_NAME="ME_RW_B" @@ -330,6 +358,9 @@ CONFIG_SOC_INTEL_CSE_IOM_CBFS_NAME="cse_iom" CONFIG_SOC_INTEL_CSE_IOM_CBFS_FILE="" CONFIG_SOC_INTEL_CSE_NPHY_CBFS_NAME="cse_nphy" CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_16=y +CONFIG_ME_SPEC=16 CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y @@ -354,6 +385,9 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_LPC=y CONFIG_SOC_INTEL_COMMON_BLOCK_LPC_MIRROR_TO_GPMR=y CONFIG_SOC_INTEL_COMMON_BLOCK_LPSS=y CONFIG_SOC_INTEL_COMMON_BLOCK_MEMINIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_OC_WDT=y +# CONFIG_SOC_INTEL_COMMON_OC_WDT_ENABLE is not set +# CONFIG_SOC_INTEL_COMMON_OC_WDT_WDAT is not set CONFIG_SOC_INTEL_COMMON_BLOCK_BASE_P2SB=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE_RTD3=y @@ -367,7 +401,6 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_POWER_LIMIT=y CONFIG_SOC_INTEL_COMMON_BLOCK_RTC=y CONFIG_SOC_INTEL_COMMON_BLOCK_SATA=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS=y -CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 CONFIG_SOC_INTEL_COMMON_BLOCK_TCO=y CONFIG_SOC_INTEL_COMMON_BLOCK_TCO_ENABLE_THROUGH_SMBUS=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM=y @@ -377,7 +410,7 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y -# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set +# CONFIG_TCSS_HAS_USBC_OPS is not set CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_BEHIND_PMC=y CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y @@ -387,6 +420,10 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_USB4=y CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_PCIE=y CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_XHCI=y CONFIG_SOC_INTEL_ENABLE_USB4_PCIE_RESOURCES=y +CONFIG_FIRMWARE_CONNECTION_MANAGER=y +# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_VTD=y +# CONFIG_ENABLE_EARLY_DMA_PROTECTION is not set CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI=y CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y @@ -397,7 +434,9 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y CONFIG_SOC_INTEL_COMMON_PCH_BASE=y CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=y +CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM=y CONFIG_PCH_SPECIFIC_BASE_OPTIONS=y +CONFIG_PCH_SPECIFIC_DISCRETE_OPTIONS=y CONFIG_PCH_SPECIFIC_CLIENT_OPTIONS=y # @@ -415,14 +454,13 @@ CONFIG_SOC_INTEL_CRASHLOG=y # # CPU # -CONFIG_SSE2=y CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE=y CONFIG_CPU_INTEL_COMMON=y CONFIG_ENABLE_VMX=y CONFIG_SET_IA32_FC_LOCK_BIT=y CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_VOLTAGE=y CONFIG_CPU_INTEL_COMMON_SMM=y -CONFIG_MICROCODE_UPDATE_PRE_RAM=y CONFIG_PARALLEL_MP=y CONFIG_PARALLEL_MP_AP_WORK=y CONFIG_XAPIC_ONLY=y @@ -431,13 +469,14 @@ CONFIG_XAPIC_ONLY=y # CONFIG_X2APIC_LATE_WORKAROUND is not set CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y -CONFIG_LOGICAL_CPUS=y +CONFIG_X86_CLFLUSH_CAR=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y -CONFIG_SMM_STUB_STACK_SIZE=0x400 -CONFIG_CPU_INFO_V2=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y CONFIG_SSE=y +CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y @@ -456,8 +495,10 @@ CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y # CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +# CONFIG_INTEL_CHIPSET_LOCKDOWN is not set CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 CONFIG_RCBA_LENGTH=0x4000 @@ -468,25 +509,45 @@ CONFIG_RCBA_LENGTH=0x4000 # # Embedded Controllers # +CONFIG_EC_ACPI=y CONFIG_EC_SYSTEM76_EC=y CONFIG_EC_SYSTEM76_EC_DGPU=y -CONFIG_EC_SYSTEM76_EC_ACPI_DEVICE_HID="17761776" +# CONFIG_EC_SYSTEM76_EC_UPDATE is not set # # Intel Firmware # +CONFIG_IFDTOOL_DISABLE_ME=y CONFIG_HAVE_ME_BIN=y # CONFIG_STITCH_ME_BIN is not set # CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +CONFIG_HAVE_INTEL_ME_HAP=y +# CONFIG_INTEL_ME_DISABLED_HECI is not set +CONFIG_INTEL_ME_DISABLED_HAP=y +# CONFIG_INTEL_ME_ENABLED is not set +CONFIG_INTEL_ME_DEFAULT_STATE=2 # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_BIOS_VENDOR="3mdeb" + +# +# Dasharo +# + +# +# Dasharo Configuration +# +CONFIG_DASHARO_PREFER_S3_SLEEP=y +# CONFIG_DASHARO_FIRMWARE_UPDATE_MODE is not set +# end of Dasharo Configuration + CONFIG_UDK_BASE=y CONFIG_UDK_202005_BINDING=y CONFIG_UDK_2013_VERSION=2013 CONFIG_UDK_2017_VERSION=2017 CONFIG_UDK_202005_VERSION=202005 -CONFIG_UDK_202111_VERSION=202111 +CONFIG_UDK_202302_VERSION=202302 CONFIG_UDK_VERSION=202005 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y @@ -495,8 +556,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_CUSTOM_BOOTMEDIA=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -509,6 +572,7 @@ CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -519,6 +583,7 @@ CONFIG_HAVE_FSP_GOP=y # CONFIG_VGA_ROM_RUN is not set CONFIG_RUN_FSP_GOP=y # CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y # # Display @@ -531,8 +596,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 @@ -540,6 +604,7 @@ CONFIG_PCI_ALLOW_BUS_MASTER=y CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 # CONFIG_EARLY_PCI_BRIDGE is not set @@ -549,7 +614,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -CONFIG_RESOURCE_ALLOCATOR_V4=y +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set # end of Devices # @@ -560,11 +625,11 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y CONFIG_MRC_SETTINGS_PROTECT=y -CONFIG_SMMSTORE=y +# CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y -CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_SMM=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -575,6 +640,7 @@ CONFIG_DRIVERS_UART_8250MEM_32=y # CONFIG_VPD is not set CONFIG_DRIVERS_GENERIC_BAYHUB_LV2=y # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set @@ -608,18 +674,26 @@ CONFIG_FSPS_USE_MULTI_PHASE_INIT=y CONFIG_FSP_USES_CB_DEBUG_EVENT_HANDLER=y # CONFIG_DISPLAY_FSP_TIMESTAMPS is not set CONFIG_FSP_ENABLE_SERIAL_DEBUG=y +CONFIG_FSP_MULTIPHASE_SI_INIT_RETURN_BROKEN=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_INTEL_GMA_OPREGION_2_1=y +CONFIG_INTEL_GMA_VERSION_2=y CONFIG_DRIVERS_INTEL_PMC=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set # CONFIG_DRIVERS_PS2_KEYBOARD is not set CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_MTK_WIFI=y CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V2=y CONFIG_DRIVERS_INTEL_USB4_RETIMER=y @@ -644,14 +718,24 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set +# CONFIG_TPM1 is not set CONFIG_TPM2=y CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM2=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_MEASURED_BOOT=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM2=y +# CONFIG_TPM_HASH_SHA1 is not set +CONFIG_TPM_HASH_SHA256=y +# CONFIG_TPM_HASH_SHA384 is not set +# CONFIG_TPM_HASH_SHA512 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -661,24 +745,31 @@ CONFIG_PLATFORM_HAS_DRAM_CLEAR=y # CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set # end of Memory initialization +CONFIG_INTEL_TXT_LIB=y # CONFIG_INTEL_TXT is not set # CONFIG_STM is not set # CONFIG_INTEL_CBNT_SUPPORT is not set -CONFIG_BOOTMEDIA_LOCK_NONE=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_NONE is not set +CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y # CONFIG_BOOTMEDIA_LOCK_CHIP is not set +CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +# CONFIG_BOOTMEDIA_LOCK_WPRO_VBOOT_RO is not set # CONFIG_BOOTMEDIA_SMM_BWP is not set # end of Security CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_ACPI_LPIT=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -692,6 +783,7 @@ CONFIG_FIXED_UART_FOR_CONSOLE=y CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set # CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_CONSOLE_SYSTEM76_EC is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y @@ -709,6 +801,7 @@ CONFIG_CONSOLE_USE_ANSI_ESCAPES=y CONFIG_HWBASE_DEBUG_CB=y # end of Console +CONFIG_ACPI_S1_NOT_SUPPORTED=y CONFIG_HAVE_ACPI_RESUME=y CONFIG_RESUME_PATH_SAME_AS_BOOT=y CONFIG_HAVE_MONOTONIC_TIMER=y @@ -734,13 +827,19 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" + +# +# Dasharo specific payload options +# +# end of Dasharo specific payload options + +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -765,6 +864,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -772,6 +875,7 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # CONFIG_DISPLAY_FSP_HEADER is not set # CONFIG_VERIFY_HOBS is not set CONFIG_DISPLAY_FSP_VERSION_INFO=y +# CONFIG_ENABLE_FSP_ERROR_INFO is not set CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y # CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set @@ -787,7 +891,6 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -795,9 +898,11 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_SPD_READ_BY_WORD=y +CONFIG_DECOMPRESS_OFAST=y CONFIG_WARNINGS_ARE_ERRORS=y CONFIG_MAX_REBOOT_CNT=3 CONFIG_RELOCATABLE_MODULES=y diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config new file mode 100644 index 000000000..4f947d78c --- /dev/null +++ b/config/coreboot-novacustom-v540tu.config @@ -0,0 +1,947 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="v0.9.0-rc2" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +CONFIG_ARCH_SUPPORTS_CLANG=y +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +# CONFIG_NO_STAGE_CACHE is not set +CONFIG_TSEG_STAGE_CACHE=y +# CONFIG_UPDATE_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=90 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set +# CONFIG_FW_CONFIG is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_ADLINK is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +CONFIG_VENDOR_CLEVO=y +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_NOVACUSTOM is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_UP is not set +CONFIG_MAINBOARD_FAMILY="Not Applicable" +CONFIG_MAINBOARD_PART_NUMBER="V54x_6x_TU" +CONFIG_MAINBOARD_VERSION="V540TU" +CONFIG_MAINBOARD_DIR="clevo/mtl-h" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=1024 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Clevo" +CONFIG_CBFS_SIZE=0x1000000 +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=22 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +# CONFIG_POST_DEVICE is not set +# CONFIG_POST_IO is not set +CONFIG_UART_FOR_CONSOLE=0 +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VBOOT_VBNV_OFFSET=0x28 +CONFIG_VARIANT_DIR="igpu" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Notebook" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x2000 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 + +# +# Alder Lake P +# +# CONFIG_BOARD_CLEVO_NS50PU is not set +# CONFIG_BOARD_CLEVO_NV40PZ is not set + +# +# Comet Lake U +# +# CONFIG_BOARD_CLEVO_L140CU is not set + +# +# Kaby Lake U +# +# CONFIG_BOARD_CLEVO_N130WU is not set + +# +# Meteor Lake H +# +# CONFIG_BOARD_CLEVO_V540TNX is not set +# CONFIG_BOARD_CLEVO_V560TNX is not set +CONFIG_BOARD_CLEVO_V540TU=y +# CONFIG_BOARD_CLEVO_V560TU is not set + +# +# Tiger Lake U +# +# CONFIG_BOARD_CLEVO_L140MU is not set +# CONFIG_BOARD_CLEVO_NV40MZ is not set +# CONFIG_BOARD_CLEVO_NS50MU is not set +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="V54x_6x_TU" +# CONFIG_CONSOLE_POST is not set +# CONFIG_USE_PM_ACPI_TIMER is not set +CONFIG_TPM_PIRQ=0x61 +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_VBOOT_FWID_VERSION="$(CONFIG_LOCALVERSION)" +CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +CONFIG_BOARD_CLEVO_MTLH_COMMON=y +CONFIG_BOARD_CLEVO_V5X0TU_BASE=y +CONFIG_EC_SYSTEM76_EC_FLASH_SIZE=0x40000 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0xc0000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x80400 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 +CONFIG_HAVE_INTEL_FIRMWARE=y +CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_IFD_BIN_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/descriptor.bin" +CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/me.bin" +CONFIG_GBE_BIN_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/gbe.bin" +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x200000 +CONFIG_PCIEXP_DEFAULT_MAX_RESIZABLE_BAR_BITS=36 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y +# CONFIG_USE_LEGACY_8254_TIMER is not set +# CONFIG_DEBUG_SMI is not set +CONFIG_HAVE_IFD_BIN=y +CONFIG_PCIEXP_HOTPLUG_BUSES=42 +CONFIG_PCIEXP_HOTPLUG_MEM=0xc200000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x1c000000 +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_FSP_TEMP_RAM_SIZE=0x20000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_32768=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set +CONFIG_COREBOOT_ROMSIZE_KB_32768=y +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=32768 +CONFIG_ROM_SIZE=0x02000000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# end of Mainboard + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="soc/intel/meteorlake/chipset.cb" +CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" +CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_CONSOLE_UART_BASE_ADDRESS=0xfe02c000 +CONFIG_SMM_TSEG_SIZE=0x800000 +CONFIG_SMM_RESERVED_SIZE=0x200000 +CONFIG_SMM_MODULE_STACK_SIZE=0x800 +CONFIG_ACPI_BERT=y +CONFIG_ACPI_BERT_SIZE=0x10000 +CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=133 +CONFIG_VBOOT_HASH_BLOCK_SIZE=0x1000 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 +CONFIG_EXT_BIOS_WIN_SIZE=0x2000000 +CONFIG_IFD_CHIPSET="mtl" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_TBT_ROOT_PORTS=4 +CONFIG_MAX_ROOT_PORTS=12 +CONFIG_MAX_PCIE_CLOCK_SRC=9 +CONFIG_PCR_BASE_ADDRESS=0xe0000000 +CONFIG_CPU_BCLK_MHZ=100 +CONFIG_SOC_INTEL_PERFORMANCE_CORE_SCALE_FACTOR=125 +CONFIG_SOC_INTEL_EFFICIENT_CORE_SCALE_FACTOR=100 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_CLOCK_MHZ=120 +CONFIG_CPU_XTAL_HZ=38400000 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=3 +CONFIG_SOC_INTEL_I2C_DEV_MAX=6 +CONFIG_SOC_INTEL_UART_DEV_MAX=3 +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x25a +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0x7fff +CONFIG_FSP_HEADER_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/MeteorLakeFspBinPkg/Include/" +CONFIG_FSP_FD_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/MeteorLakeFspBinPkg/Fsp.fd" +CONFIG_DATA_BUS_WIDTH=128 +CONFIG_DIMMS_PER_CHANNEL=2 +CONFIG_MRC_CHANNEL_WIDTH=16 +CONFIG_BUILDING_WITH_DEBUG_FSP=y +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 +CONFIG_INTEL_GMA_BCLV_WIDTH=32 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLM_WIDTH=32 +CONFIG_FSP_PUBLISH_MBP_HOB=y +CONFIG_MAX_HECI_DEVICES=6 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 +CONFIG_SOC_INTEL_METEORLAKE=y +CONFIG_SOC_INTEL_METEORLAKE_U_H=y +CONFIG_SOC_INTEL_METEORLAKE_TCSS_USB4_SUPPORT=y +CONFIG_METEORLAKE_CAR_ENHANCED_NEM=y +CONFIG_CPU_MAX_TEMPERATURE=110 +CONFIG_IOE_PCR_BASE_ADDRESS=0x60000000 +CONFIG_SOC_INTEL_USB2_DEV_MAX=10 +CONFIG_SOC_INTEL_USB3_DEV_MAX=2 +CONFIG_SOC_INTEL_METEORLAKE_DEBUG_CONSENT=0 +CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x800000 +CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x100f +CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x100f +CONFIG_IOE_DIE_CLOCK_START=6 +CONFIG_SOC_INTEL_CSE_FW_PARTITION_CMOS_OFFSET=161 +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_SLP_S0_FREQ_HZ=0x2005 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=42 +CONFIG_INTEL_TME=y +CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y +CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_INTEL_COMMON=y + +# +# Intel SoC Common Code for IP blocks +# +CONFIG_SOC_INTEL_COMMON_BLOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_LPIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP_LPM_REQ=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CRASHLOG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPU_HYBRID=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CHIP_CONFIG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CNVI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_MPINIT=y +CONFIG_USE_FSP_FEATURE_PROGRAM_ON_APS=y +# CONFIG_USE_COREBOOT_MP_INIT is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y +CONFIG_INTEL_CAR_NEM_ENHANCED=y +CONFIG_CAR_HAS_SF_MASKS=y +CONFIG_COS_MAPPED_TO_MSB=y +CONFIG_CAR_HAS_L3_PROTECTED_WAYS=y +CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI=y +CONFIG_CPU_SUPPORTS_INTEL_TME=y +CONFIG_TME_KEY_REGENERATION_ON_WARM_BOOT=y +CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y +CONFIG_HAVE_HYPERTHREADING=y +CONFIG_FSP_HYPERTHREADING=y +CONFIG_INTEL_KEYLOCKER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE=2 +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_MAX is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_256MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_128MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_64MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_32MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_16MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_8MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_4MB is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_2MB=y +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_0MB is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=y +CONFIG_SOC_INTEL_CSE_SEND_EOP_LATE=y +CONFIG_SOC_INTEL_CSE_FMAP_NAME="SI_ME" +CONFIG_SOC_INTEL_CSE_RW_A_FMAP_NAME="ME_RW_A" +CONFIG_SOC_INTEL_CSE_RW_B_FMAP_NAME="ME_RW_B" +CONFIG_SOC_INTEL_CSE_RW_CBFS_NAME="me_rw" +CONFIG_SOC_INTEL_CSE_RW_HASH_CBFS_NAME="me_rw.hash" +CONFIG_SOC_INTEL_CSE_RW_VERSION_CBFS_NAME="me_rw.version" +CONFIG_SOC_INTEL_CSE_RW_FILE="" +CONFIG_SOC_INTEL_CSE_RW_VERSION="" +CONFIG_SOC_INTEL_CSE_SET_EOP=y +CONFIG_SOC_INTEL_CSE_IOM_CBFS_NAME="cse_iom" +CONFIG_SOC_INTEL_CSE_IOM_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_NAME="cse_nphy" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_PRE_CPU_RESET_TELEMETRY=y +CONFIG_SOC_INTEL_CSE_PRE_CPU_RESET_TELEMETRY_V2=y +CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_18=y +CONFIG_ME_SPEC=18 +CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y +CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y +CONFIG_FAST_SPI_SUPPORTS_EXT_BIOS_WINDOW=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_IOSTANDBY=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_DUAL_ROUTE_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_LOCK_USING_PCR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_PMODE_4BITS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GRAPHICS=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +CONFIG_SOC_INTEL_GFX_NON_PREFETCHABLE_MMIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_VERSION_2=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA_VERB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_I2C=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IOC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IPU=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IRQ=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ITSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC_MIRROR_TO_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_MEMINIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_BASE_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IOE_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE_RTD3=y +CONFIG_PCIE_CLOCK_CONTROL_THROUGH_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC=y +CONFIG_SOC_INTEL_MEM_MAPPED_PM_CONFIGURATION=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC_EPOC=y +CONFIG_PMC_IPC_ACPI_INTERFACE=y +CONFIG_PMC_GLOBAL_RESET_ENABLE_LOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_POWER_LIMIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_RTC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SATA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO_ENABLE_THROUGH_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_TCO_ENABLE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 +CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y +# CONFIG_TCSS_HAS_USBC_OPS is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y +CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_BEHIND_PMC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_UART=y +CONFIG_INTEL_LPSS_UART_FOR_CONSOLE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_PCIE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_XHCI=y +CONFIG_SOC_INTEL_ENABLE_USB4_PCIE_RESOURCES=y +# CONFIG_FIRMWARE_CONNECTION_MANAGER is not set +CONFIG_SOFTWARE_CONNECTION_MANAGER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_VTD=y +CONFIG_ENABLE_EARLY_DMA_PROTECTION=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y + +# +# Intel SoC Common PCH Code +# +CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y +CONFIG_SOC_INTEL_COMMON_PCH_BASE=y +CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=y +CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM=y +CONFIG_PCH_SPECIFIC_BASE_OPTIONS=y +CONFIG_PCH_SPECIFIC_DISCRETE_OPTIONS=y +CONFIG_PCH_SPECIFIC_CLIENT_OPTIONS=y + +# +# Intel SoC Common coreboot stages and non-IP blocks +# +CONFIG_SOC_INTEL_COMMON_BASECODE=y +CONFIG_SOC_INTEL_COMMON_RESET=y +CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y +CONFIG_PAVP=y +# CONFIG_SOC_INTEL_DEBUG_CONSENT is not set +CONFIG_HAVE_INTEL_COMPLIANCE_TEST_MODE=y +# CONFIG_SOC_INTEL_COMPLIANCE_TEST_MODE is not set +CONFIG_SOC_INTEL_CRASHLOG=y +CONFIG_SOC_INTEL_IOE_DIE_SUPPORT=y + +# +# CPU +# +CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE=y +CONFIG_CPU_INTEL_COMMON=y +CONFIG_ENABLE_VMX=y +CONFIG_SET_IA32_FC_LOCK_BIT=y +CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_VOLTAGE=y +CONFIG_CPU_INTEL_COMMON_SMM=y +CONFIG_PARALLEL_MP=y +CONFIG_PARALLEL_MP_AP_WORK=y +CONFIG_DEFAULT_X2APIC_LATE_WORKAROUND=y +# CONFIG_XAPIC_ONLY is not set +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +CONFIG_X2APIC_LATE_WORKAROUND=y +CONFIG_UDELAY_TSC=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_X86_CLFLUSH_CAR=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_X86_INIT_NEED_1_SIPI=y +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y +CONFIG_SSE=y +CONFIG_SSE2=y +CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y +CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y +CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS is not set +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER is not set +# CONFIG_CPU_MICROCODE_CBFS_NONE is not set + +# +# Northbridge +# + +# +# Southbridge +# +CONFIG_PCIEXP_HOTPLUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +# CONFIG_INTEL_CHIPSET_LOCKDOWN is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_EC_ACPI=y +CONFIG_EC_SYSTEM76_EC=y +# CONFIG_EC_SYSTEM76_EC_UPDATE is not set + +# +# Intel Firmware +# +# CONFIG_IFDTOOL_DISABLE_ME is not set +CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +CONFIG_HAVE_INTEL_ME_HAP=y +# CONFIG_INTEL_ME_DISABLED_HECI is not set +CONFIG_INTEL_ME_DISABLED_HAP=y +# CONFIG_INTEL_ME_ENABLED is not set +CONFIG_INTEL_ME_DEFAULT_STATE=2 +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +CONFIG_HAVE_GBE_BIN=y +# CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_BIOS_VENDOR="3mdeb" + +# +# Dasharo +# + +# +# Dasharo Configuration +# +CONFIG_DASHARO_PREFER_S3_SLEEP=y +CONFIG_DASHARO_FIRMWARE_UPDATE_MODE=y +# end of Dasharo Configuration + +CONFIG_UDK_BASE=y +# CONFIG_UDK_202005_BINDING is not set +CONFIG_UDK_202302_BINDING=y +CONFIG_UDK_2013_VERSION=2013 +CONFIG_UDK_2017_VERSION=2017 +CONFIG_UDK_202005_VERSION=202005 +CONFIG_UDK_202302_VERSION=202302 +CONFIG_UDK_VERSION=202302 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y +CONFIG_X86_CUSTOM_BOOTMEDIA=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_IDT_IN_EVERY_STAGE=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_HAVE_FSP_GOP=y +# CONFIG_VGA_ROM_RUN is not set +CONFIG_RUN_FSP_GOP=y +# CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +CONFIG_BOOTSPLASH=y +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x10000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS=y +CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR=y +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y +CONFIG_PCIEXP_HOTPLUG_IO=0x800 +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +CONFIG_INTEL_GMA_HAVE_VBT=y +CONFIG_INTEL_GMA_ADD_VBT=y +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_EFI_VARIABLE_STORE is not set +# CONFIG_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=y +CONFIG_MRC_CACHE_USING_MRC_VERSION=y +# CONFIG_SMMSTORE is not set +CONFIG_SPI_FLASH=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y +CONFIG_SPI_FLASH_SMM=y +# CONFIG_SPI_FLASH_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +CONFIG_TPM_PPI=y +CONFIG_DRIVERS_UART=y +CONFIG_NO_UART_ON_SUPERIO=y +CONFIG_DRIVERS_UART_8250MEM=y +CONFIG_DRIVERS_UART_8250MEM_32=y +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_BAYHUB_LV2=y +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVERS_I2C_DESIGNWARE=y +CONFIG_DRIVERS_I2C_GENERIC=y +CONFIG_DRIVERS_I2C_HID=y +# CONFIG_DRIVERS_I2C_MAX98396 is not set +# CONFIG_DISPLAY_HOBS is not set +# CONFIG_DISPLAY_UPD_DATA is not set +# CONFIG_BMP_LOGO is not set +CONFIG_PLATFORM_USES_FSP2_0=y +CONFIG_PLATFORM_USES_FSP2_1=y +CONFIG_PLATFORM_USES_FSP2_2=y +CONFIG_PLATFORM_USES_FSP2_3=y +CONFIG_PLATFORM_USES_FSP2_X86_32=y +CONFIG_ADD_FSP_BINARIES=y +CONFIG_FSP_T_LOCATION=0xfffe0000 +CONFIG_FSP_S_CBFS="fsps.bin" +CONFIG_FSP_M_CBFS="fspm.bin" +CONFIG_FSP_FULL_FD=y +CONFIG_FSP_T_RESERVED_SIZE=0x0 +CONFIG_FSP_M_XIP=y +CONFIG_FSP_USES_CB_STACK=y +CONFIG_HAVE_FSP_LOGO_SUPPORT=y +CONFIG_FSP_COMPRESS_FSP_S_LZ4=y +CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +CONFIG_SOC_INTEL_COMMON_FSP_RESET=y +CONFIG_FSPS_HAS_ARCH_UPD=y +CONFIG_FSPS_USE_MULTI_PHASE_INIT=y +CONFIG_FSP_USES_CB_DEBUG_EVENT_HANDLER=y +# CONFIG_DISPLAY_FSP_TIMESTAMPS is not set +CONFIG_FSP_ENABLE_SERIAL_DEBUG=y +CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" +CONFIG_INTEL_GMA_OPREGION_2_1=y +CONFIG_INTEL_GMA_VERSION_2=y +CONFIG_DRIVERS_INTEL_PMC=y +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +CONFIG_DRIVERS_MC146818=y +# CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_SIL_3114 is not set +CONFIG_DRIVERS_USB_ACPI=y +CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_MTK_WIFI=y +CONFIG_MP_SERVICES_PPI=y +CONFIG_MP_SERVICES_PPI_V2=y +CONFIG_DRIVERS_INTEL_USB4_RETIMER=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +# CONFIG_TPM1 is not set +CONFIG_TPM2=y +CONFIG_TPM=y +CONFIG_MAINBOARD_HAS_TPM2=y +# CONFIG_DEBUG_TPM is not set +CONFIG_TPM_RDRESP_NEED_DELAY=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM2=y +# CONFIG_TPM_HASH_SHA1 is not set +CONFIG_TPM_HASH_SHA256=y +# CONFIG_TPM_HASH_SHA384 is not set +# CONFIG_TPM_HASH_SHA512 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# CONFIG_INTEL_TXT is not set +# CONFIG_STM is not set +# CONFIG_INTEL_CBNT_SUPPORT is not set +# CONFIG_BOOTMEDIA_LOCK_NONE is not set +CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +# CONFIG_BOOTMEDIA_LOCK_WPRO_VBOOT_RO is not set +# CONFIG_BOOTMEDIA_SMM_BWP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_ACPI_LPIT=y +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y +CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +CONFIG_FIXED_UART_FOR_CONSOLE=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +# CONFIG_CONSOLE_SYSTEM76_EC is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_ACPI_S1_NOT_SUPPORTED=y +CONFIG_HAVE_ACPI_RESUME=y +CONFIG_RESUME_PATH_SAME_AS_BOOT=y +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_IOAPIC=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +CONFIG_PAYLOAD_OPTIONS="" +# CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" + +# +# Dasharo specific payload options +# +# end of Dasharo specific payload options + +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# +# CONFIG_DISPLAY_FSP_CALLS_AND_STATUS is not set +# CONFIG_DISPLAY_FSP_HEADER is not set +# CONFIG_VERIFY_HOBS is not set +# CONFIG_DISPLAY_FSP_VERSION_INFO is not set +CONFIG_DISPLAY_FSP_VERSION_INFO_2=y +# CONFIG_ENABLE_FSP_ERROR_INFO is not set +CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y +# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_FATAL_ASSERTS is not set +CONFIG_HAVE_DEBUG_GPIO=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_RAM_SETUP=y +# CONFIG_DEBUG_RAM_SETUP is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_SPI_FLASH is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +CONFIG_HAVE_EM100_SUPPORT=y +# CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_SPD_READ_BY_WORD=y +CONFIG_DECOMPRESS_OFAST=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_GENERIC_GPIO_LIB=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config new file mode 100644 index 000000000..66a6a530d --- /dev/null +++ b/config/coreboot-novacustom-v560tu.config @@ -0,0 +1,947 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="v0.9.0-rc2" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +CONFIG_ARCH_SUPPORTS_CLANG=y +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +# CONFIG_NO_STAGE_CACHE is not set +CONFIG_TSEG_STAGE_CACHE=y +# CONFIG_UPDATE_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=90 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set +# CONFIG_FW_CONFIG is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_ADLINK is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +CONFIG_VENDOR_CLEVO=y +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_NOVACUSTOM is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_UP is not set +CONFIG_MAINBOARD_FAMILY="Not Applicable" +CONFIG_MAINBOARD_PART_NUMBER="V54x_6x_TU" +CONFIG_MAINBOARD_VERSION="V560TU" +CONFIG_MAINBOARD_DIR="clevo/mtl-h" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=1024 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Clevo" +CONFIG_CBFS_SIZE=0x1000000 +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=22 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +# CONFIG_POST_DEVICE is not set +# CONFIG_POST_IO is not set +CONFIG_UART_FOR_CONSOLE=0 +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VBOOT_VBNV_OFFSET=0x28 +CONFIG_VARIANT_DIR="igpu" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Notebook" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x2000 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 + +# +# Alder Lake P +# +# CONFIG_BOARD_CLEVO_NS50PU is not set +# CONFIG_BOARD_CLEVO_NV40PZ is not set + +# +# Comet Lake U +# +# CONFIG_BOARD_CLEVO_L140CU is not set + +# +# Kaby Lake U +# +# CONFIG_BOARD_CLEVO_N130WU is not set + +# +# Meteor Lake H +# +# CONFIG_BOARD_CLEVO_V540TNX is not set +# CONFIG_BOARD_CLEVO_V560TNX is not set +# CONFIG_BOARD_CLEVO_V540TU is not set +CONFIG_BOARD_CLEVO_V560TU=y + +# +# Tiger Lake U +# +# CONFIG_BOARD_CLEVO_L140MU is not set +# CONFIG_BOARD_CLEVO_NV40MZ is not set +# CONFIG_BOARD_CLEVO_NS50MU is not set +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="V54x_6x_TU" +# CONFIG_CONSOLE_POST is not set +# CONFIG_USE_PM_ACPI_TIMER is not set +CONFIG_TPM_PIRQ=0x61 +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_VBOOT_FWID_VERSION="$(CONFIG_LOCALVERSION)" +CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +CONFIG_BOARD_CLEVO_MTLH_COMMON=y +CONFIG_BOARD_CLEVO_V5X0TU_BASE=y +CONFIG_EC_SYSTEM76_EC_FLASH_SIZE=0x40000 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0xc0000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x80400 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 +CONFIG_HAVE_INTEL_FIRMWARE=y +CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_IFD_BIN_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/descriptor.bin" +CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/me.bin" +CONFIG_GBE_BIN_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/gbe.bin" +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x200000 +CONFIG_PCIEXP_DEFAULT_MAX_RESIZABLE_BAR_BITS=36 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y +# CONFIG_USE_LEGACY_8254_TIMER is not set +# CONFIG_DEBUG_SMI is not set +CONFIG_HAVE_IFD_BIN=y +CONFIG_PCIEXP_HOTPLUG_BUSES=42 +CONFIG_PCIEXP_HOTPLUG_MEM=0xc200000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x1c000000 +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_FSP_TEMP_RAM_SIZE=0x20000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_32768=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set +CONFIG_COREBOOT_ROMSIZE_KB_32768=y +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=32768 +CONFIG_ROM_SIZE=0x02000000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# end of Mainboard + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="soc/intel/meteorlake/chipset.cb" +CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" +CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_CONSOLE_UART_BASE_ADDRESS=0xfe02c000 +CONFIG_SMM_TSEG_SIZE=0x800000 +CONFIG_SMM_RESERVED_SIZE=0x200000 +CONFIG_SMM_MODULE_STACK_SIZE=0x800 +CONFIG_ACPI_BERT=y +CONFIG_ACPI_BERT_SIZE=0x10000 +CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=133 +CONFIG_VBOOT_HASH_BLOCK_SIZE=0x1000 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 +CONFIG_EXT_BIOS_WIN_SIZE=0x2000000 +CONFIG_IFD_CHIPSET="mtl" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_TBT_ROOT_PORTS=4 +CONFIG_MAX_ROOT_PORTS=12 +CONFIG_MAX_PCIE_CLOCK_SRC=9 +CONFIG_PCR_BASE_ADDRESS=0xe0000000 +CONFIG_CPU_BCLK_MHZ=100 +CONFIG_SOC_INTEL_PERFORMANCE_CORE_SCALE_FACTOR=125 +CONFIG_SOC_INTEL_EFFICIENT_CORE_SCALE_FACTOR=100 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_CLOCK_MHZ=120 +CONFIG_CPU_XTAL_HZ=38400000 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=3 +CONFIG_SOC_INTEL_I2C_DEV_MAX=6 +CONFIG_SOC_INTEL_UART_DEV_MAX=3 +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x25a +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0x7fff +CONFIG_FSP_HEADER_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/MeteorLakeFspBinPkg/Include/" +CONFIG_FSP_FD_PATH="3rdparty/dasharo-blobs/novacustom/v5x0tu/MeteorLakeFspBinPkg/Fsp.fd" +CONFIG_DATA_BUS_WIDTH=128 +CONFIG_DIMMS_PER_CHANNEL=2 +CONFIG_MRC_CHANNEL_WIDTH=16 +CONFIG_BUILDING_WITH_DEBUG_FSP=y +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 +CONFIG_INTEL_GMA_BCLV_WIDTH=32 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLM_WIDTH=32 +CONFIG_FSP_PUBLISH_MBP_HOB=y +CONFIG_MAX_HECI_DEVICES=6 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 +CONFIG_SOC_INTEL_METEORLAKE=y +CONFIG_SOC_INTEL_METEORLAKE_U_H=y +CONFIG_SOC_INTEL_METEORLAKE_TCSS_USB4_SUPPORT=y +CONFIG_METEORLAKE_CAR_ENHANCED_NEM=y +CONFIG_CPU_MAX_TEMPERATURE=110 +CONFIG_IOE_PCR_BASE_ADDRESS=0x60000000 +CONFIG_SOC_INTEL_USB2_DEV_MAX=10 +CONFIG_SOC_INTEL_USB3_DEV_MAX=2 +CONFIG_SOC_INTEL_METEORLAKE_DEBUG_CONSENT=0 +CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x800000 +CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x100f +CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x100f +CONFIG_IOE_DIE_CLOCK_START=6 +CONFIG_SOC_INTEL_CSE_FW_PARTITION_CMOS_OFFSET=161 +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_SLP_S0_FREQ_HZ=0x2005 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=42 +CONFIG_INTEL_TME=y +CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y +CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_INTEL_COMMON=y + +# +# Intel SoC Common Code for IP blocks +# +CONFIG_SOC_INTEL_COMMON_BLOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_LPIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP_LPM_REQ=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CRASHLOG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPU_HYBRID=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CHIP_CONFIG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CNVI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_MPINIT=y +CONFIG_USE_FSP_FEATURE_PROGRAM_ON_APS=y +# CONFIG_USE_COREBOOT_MP_INIT is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y +CONFIG_INTEL_CAR_NEM_ENHANCED=y +CONFIG_CAR_HAS_SF_MASKS=y +CONFIG_COS_MAPPED_TO_MSB=y +CONFIG_CAR_HAS_L3_PROTECTED_WAYS=y +CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI=y +CONFIG_CPU_SUPPORTS_INTEL_TME=y +CONFIG_TME_KEY_REGENERATION_ON_WARM_BOOT=y +CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y +CONFIG_HAVE_HYPERTHREADING=y +CONFIG_FSP_HYPERTHREADING=y +CONFIG_INTEL_KEYLOCKER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE=2 +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_MAX is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_256MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_128MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_64MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_32MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_16MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_8MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_4MB is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_2MB=y +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_0MB is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=y +CONFIG_SOC_INTEL_CSE_SEND_EOP_LATE=y +CONFIG_SOC_INTEL_CSE_FMAP_NAME="SI_ME" +CONFIG_SOC_INTEL_CSE_RW_A_FMAP_NAME="ME_RW_A" +CONFIG_SOC_INTEL_CSE_RW_B_FMAP_NAME="ME_RW_B" +CONFIG_SOC_INTEL_CSE_RW_CBFS_NAME="me_rw" +CONFIG_SOC_INTEL_CSE_RW_HASH_CBFS_NAME="me_rw.hash" +CONFIG_SOC_INTEL_CSE_RW_VERSION_CBFS_NAME="me_rw.version" +CONFIG_SOC_INTEL_CSE_RW_FILE="" +CONFIG_SOC_INTEL_CSE_RW_VERSION="" +CONFIG_SOC_INTEL_CSE_SET_EOP=y +CONFIG_SOC_INTEL_CSE_IOM_CBFS_NAME="cse_iom" +CONFIG_SOC_INTEL_CSE_IOM_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_NAME="cse_nphy" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_PRE_CPU_RESET_TELEMETRY=y +CONFIG_SOC_INTEL_CSE_PRE_CPU_RESET_TELEMETRY_V2=y +CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_18=y +CONFIG_ME_SPEC=18 +CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y +CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y +CONFIG_FAST_SPI_SUPPORTS_EXT_BIOS_WINDOW=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_IOSTANDBY=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_DUAL_ROUTE_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_LOCK_USING_PCR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_PMODE_4BITS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GRAPHICS=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +CONFIG_SOC_INTEL_GFX_NON_PREFETCHABLE_MMIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_VERSION_2=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA_VERB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_I2C=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IOC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IPU=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IRQ=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ITSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC_MIRROR_TO_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_MEMINIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_BASE_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IOE_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE_RTD3=y +CONFIG_PCIE_CLOCK_CONTROL_THROUGH_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC=y +CONFIG_SOC_INTEL_MEM_MAPPED_PM_CONFIGURATION=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC_EPOC=y +CONFIG_PMC_IPC_ACPI_INTERFACE=y +CONFIG_PMC_GLOBAL_RESET_ENABLE_LOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_POWER_LIMIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_RTC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SATA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO_ENABLE_THROUGH_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_TCO_ENABLE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 +CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y +# CONFIG_TCSS_HAS_USBC_OPS is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y +CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_BEHIND_PMC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_UART=y +CONFIG_INTEL_LPSS_UART_FOR_CONSOLE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_PCIE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_XHCI=y +CONFIG_SOC_INTEL_ENABLE_USB4_PCIE_RESOURCES=y +# CONFIG_FIRMWARE_CONNECTION_MANAGER is not set +CONFIG_SOFTWARE_CONNECTION_MANAGER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_VTD=y +CONFIG_ENABLE_EARLY_DMA_PROTECTION=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y + +# +# Intel SoC Common PCH Code +# +CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y +CONFIG_SOC_INTEL_COMMON_PCH_BASE=y +CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=y +CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM=y +CONFIG_PCH_SPECIFIC_BASE_OPTIONS=y +CONFIG_PCH_SPECIFIC_DISCRETE_OPTIONS=y +CONFIG_PCH_SPECIFIC_CLIENT_OPTIONS=y + +# +# Intel SoC Common coreboot stages and non-IP blocks +# +CONFIG_SOC_INTEL_COMMON_BASECODE=y +CONFIG_SOC_INTEL_COMMON_RESET=y +CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y +CONFIG_PAVP=y +# CONFIG_SOC_INTEL_DEBUG_CONSENT is not set +CONFIG_HAVE_INTEL_COMPLIANCE_TEST_MODE=y +# CONFIG_SOC_INTEL_COMPLIANCE_TEST_MODE is not set +CONFIG_SOC_INTEL_CRASHLOG=y +CONFIG_SOC_INTEL_IOE_DIE_SUPPORT=y + +# +# CPU +# +CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE=y +CONFIG_CPU_INTEL_COMMON=y +CONFIG_ENABLE_VMX=y +CONFIG_SET_IA32_FC_LOCK_BIT=y +CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_VOLTAGE=y +CONFIG_CPU_INTEL_COMMON_SMM=y +CONFIG_PARALLEL_MP=y +CONFIG_PARALLEL_MP_AP_WORK=y +CONFIG_DEFAULT_X2APIC_LATE_WORKAROUND=y +# CONFIG_XAPIC_ONLY is not set +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +CONFIG_X2APIC_LATE_WORKAROUND=y +CONFIG_UDELAY_TSC=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_X86_CLFLUSH_CAR=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_X86_INIT_NEED_1_SIPI=y +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y +CONFIG_SSE=y +CONFIG_SSE2=y +CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y +CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y +CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS is not set +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER is not set +# CONFIG_CPU_MICROCODE_CBFS_NONE is not set + +# +# Northbridge +# + +# +# Southbridge +# +CONFIG_PCIEXP_HOTPLUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +# CONFIG_INTEL_CHIPSET_LOCKDOWN is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_EC_ACPI=y +CONFIG_EC_SYSTEM76_EC=y +# CONFIG_EC_SYSTEM76_EC_UPDATE is not set + +# +# Intel Firmware +# +# CONFIG_IFDTOOL_DISABLE_ME is not set +CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +CONFIG_HAVE_INTEL_ME_HAP=y +# CONFIG_INTEL_ME_DISABLED_HECI is not set +CONFIG_INTEL_ME_DISABLED_HAP=y +# CONFIG_INTEL_ME_ENABLED is not set +CONFIG_INTEL_ME_DEFAULT_STATE=2 +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +CONFIG_HAVE_GBE_BIN=y +# CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_BIOS_VENDOR="3mdeb" + +# +# Dasharo +# + +# +# Dasharo Configuration +# +CONFIG_DASHARO_PREFER_S3_SLEEP=y +CONFIG_DASHARO_FIRMWARE_UPDATE_MODE=y +# end of Dasharo Configuration + +CONFIG_UDK_BASE=y +# CONFIG_UDK_202005_BINDING is not set +CONFIG_UDK_202302_BINDING=y +CONFIG_UDK_2013_VERSION=2013 +CONFIG_UDK_2017_VERSION=2017 +CONFIG_UDK_202005_VERSION=202005 +CONFIG_UDK_202302_VERSION=202302 +CONFIG_UDK_VERSION=202302 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y +CONFIG_X86_CUSTOM_BOOTMEDIA=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_IDT_IN_EVERY_STAGE=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_HAVE_FSP_GOP=y +# CONFIG_VGA_ROM_RUN is not set +CONFIG_RUN_FSP_GOP=y +# CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +CONFIG_BOOTSPLASH=y +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x10000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS=y +CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR=y +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y +CONFIG_PCIEXP_HOTPLUG_IO=0x800 +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +CONFIG_INTEL_GMA_HAVE_VBT=y +CONFIG_INTEL_GMA_ADD_VBT=y +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_EFI_VARIABLE_STORE is not set +# CONFIG_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=y +CONFIG_MRC_CACHE_USING_MRC_VERSION=y +# CONFIG_SMMSTORE is not set +CONFIG_SPI_FLASH=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y +CONFIG_SPI_FLASH_SMM=y +# CONFIG_SPI_FLASH_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +CONFIG_TPM_PPI=y +CONFIG_DRIVERS_UART=y +CONFIG_NO_UART_ON_SUPERIO=y +CONFIG_DRIVERS_UART_8250MEM=y +CONFIG_DRIVERS_UART_8250MEM_32=y +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_BAYHUB_LV2=y +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVERS_I2C_DESIGNWARE=y +CONFIG_DRIVERS_I2C_GENERIC=y +CONFIG_DRIVERS_I2C_HID=y +# CONFIG_DRIVERS_I2C_MAX98396 is not set +# CONFIG_DISPLAY_HOBS is not set +# CONFIG_DISPLAY_UPD_DATA is not set +# CONFIG_BMP_LOGO is not set +CONFIG_PLATFORM_USES_FSP2_0=y +CONFIG_PLATFORM_USES_FSP2_1=y +CONFIG_PLATFORM_USES_FSP2_2=y +CONFIG_PLATFORM_USES_FSP2_3=y +CONFIG_PLATFORM_USES_FSP2_X86_32=y +CONFIG_ADD_FSP_BINARIES=y +CONFIG_FSP_T_LOCATION=0xfffe0000 +CONFIG_FSP_S_CBFS="fsps.bin" +CONFIG_FSP_M_CBFS="fspm.bin" +CONFIG_FSP_FULL_FD=y +CONFIG_FSP_T_RESERVED_SIZE=0x0 +CONFIG_FSP_M_XIP=y +CONFIG_FSP_USES_CB_STACK=y +CONFIG_HAVE_FSP_LOGO_SUPPORT=y +CONFIG_FSP_COMPRESS_FSP_S_LZ4=y +CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +CONFIG_SOC_INTEL_COMMON_FSP_RESET=y +CONFIG_FSPS_HAS_ARCH_UPD=y +CONFIG_FSPS_USE_MULTI_PHASE_INIT=y +CONFIG_FSP_USES_CB_DEBUG_EVENT_HANDLER=y +# CONFIG_DISPLAY_FSP_TIMESTAMPS is not set +CONFIG_FSP_ENABLE_SERIAL_DEBUG=y +CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" +CONFIG_INTEL_GMA_OPREGION_2_1=y +CONFIG_INTEL_GMA_VERSION_2=y +CONFIG_DRIVERS_INTEL_PMC=y +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +CONFIG_DRIVERS_MC146818=y +# CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_SIL_3114 is not set +CONFIG_DRIVERS_USB_ACPI=y +CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_MTK_WIFI=y +CONFIG_MP_SERVICES_PPI=y +CONFIG_MP_SERVICES_PPI_V2=y +CONFIG_DRIVERS_INTEL_USB4_RETIMER=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +# CONFIG_TPM1 is not set +CONFIG_TPM2=y +CONFIG_TPM=y +CONFIG_MAINBOARD_HAS_TPM2=y +# CONFIG_DEBUG_TPM is not set +CONFIG_TPM_RDRESP_NEED_DELAY=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM2=y +# CONFIG_TPM_HASH_SHA1 is not set +CONFIG_TPM_HASH_SHA256=y +# CONFIG_TPM_HASH_SHA384 is not set +# CONFIG_TPM_HASH_SHA512 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# CONFIG_INTEL_TXT is not set +# CONFIG_STM is not set +# CONFIG_INTEL_CBNT_SUPPORT is not set +# CONFIG_BOOTMEDIA_LOCK_NONE is not set +CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +# CONFIG_BOOTMEDIA_LOCK_WPRO_VBOOT_RO is not set +# CONFIG_BOOTMEDIA_SMM_BWP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_ACPI_LPIT=y +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y +CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +CONFIG_FIXED_UART_FOR_CONSOLE=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +# CONFIG_CONSOLE_SYSTEM76_EC is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_ACPI_S1_NOT_SUPPORTED=y +CONFIG_HAVE_ACPI_RESUME=y +CONFIG_RESUME_PATH_SAME_AS_BOOT=y +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_IOAPIC=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +CONFIG_PAYLOAD_OPTIONS="" +# CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" + +# +# Dasharo specific payload options +# +# end of Dasharo specific payload options + +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# +# CONFIG_DISPLAY_FSP_CALLS_AND_STATUS is not set +# CONFIG_DISPLAY_FSP_HEADER is not set +# CONFIG_VERIFY_HOBS is not set +# CONFIG_DISPLAY_FSP_VERSION_INFO is not set +CONFIG_DISPLAY_FSP_VERSION_INFO_2=y +# CONFIG_ENABLE_FSP_ERROR_INFO is not set +CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y +# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_FATAL_ASSERTS is not set +CONFIG_HAVE_DEBUG_GPIO=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_RAM_SETUP=y +# CONFIG_DEBUG_RAM_SETUP is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_SPI_FLASH is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +CONFIG_HAVE_EM100_SUPPORT=y +# CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_SPD_READ_BY_WORD=y +CONFIG_DECOMPRESS_OFAST=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_GENERIC_GPIO_LIB=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-optiplex-7019_9010-maximized.config b/config/coreboot-optiplex-7019_9010-maximized.config new file mode 100644 index 000000000..e19295b15 --- /dev/null +++ b/config/coreboot-optiplex-7019_9010-maximized.config @@ -0,0 +1,711 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_LTO is not set +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +CONFIG_TIMESTAMPS_ON_CONSOLE=y +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +# CONFIG_NO_STAGE_CACHE is not set +CONFIG_TSEG_STAGE_CACHE=y +# CONFIG_UPDATE_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set +CONFIG_VENDOR_DELL=y +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set +# CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set +CONFIG_MAINBOARD_PART_NUMBER="OptiPlex 9010" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="dell/snb_ivb_workstations" +CONFIG_VGA_BIOS_ID="8086,0106" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Dell Inc." +CONFIG_CBFS_SIZE=0xBE4FFF +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 +CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 +CONFIG_MAX_CPUS=8 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_POST_DEVICE=y +CONFIG_POST_IO=y +CONFIG_VARIANT_DIR="optiplex_9010_sff" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" +# CONFIG_VBOOT is not set +# CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Dell Inc." +CONFIG_DRAM_RESET_GATE_GPIO=60 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="OptiPlex 9010" +# CONFIG_CONSOLE_POST is not set +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_MAX_SOCKET=1 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +# CONFIG_BOARD_DELL_E6400 is not set +# CONFIG_BOARD_DELL_LATITUDE_E7240 is not set +# CONFIG_BOARD_DELL_OPTIPLEX_3050 is not set +# CONFIG_BOARD_DELL_OPTIPLEX_9020_SFF is not set +# CONFIG_BOARD_DELL_OPTIPLEX_9020_MT is not set +# CONFIG_BOARD_DELL_LATITUDE_E5420 is not set +# CONFIG_BOARD_DELL_LATITUDE_E5520 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6220 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6320 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6420 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6520 is not set +# CONFIG_BOARD_DELL_LATITUDE_E5530 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6230 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6330 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6430 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6530 is not set +CONFIG_BOARD_DELL_OPTIPLEX_9010=y +# CONFIG_BOARD_DELL_PRECISION_T1650 is not set +# CONFIG_BOARD_DELL_XPS_8300 is not set +CONFIG_BOARD_DELL_SNB_IVB_WORKSTATIONS=y +CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=y +CONFIG_SMSC_SCH5545_EC_FW_FILE="@BLOB_DIR@/xx30/sch5545_ecfw.bin" +CONFIG_DCACHE_RAM_BASE=0xfefe0000 +CONFIG_DCACHE_RAM_SIZE=0x20000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 +CONFIG_HAVE_INTEL_FIRMWARE=y +CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_IFD_BIN_PATH="@BLOB_DIR@/optiplex_9010/ifd.bin" +CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" +CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set +CONFIG_HAVE_IFD_BIN=y +CONFIG_PCIEXP_HOTPLUG_BUSES=8 +CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +CONFIG_D3COLD_SUPPORT=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_12288=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +CONFIG_COREBOOT_ROMSIZE_KB_12288=y +# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=12288 +CONFIG_ROM_SIZE=0x00c00000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="northbridge/intel/sandybridge/chipset.cb" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_SMM_TSEG_SIZE=0x800000 +CONFIG_SMM_RESERVED_SIZE=0x100000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 +CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 +CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 +CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y +CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 + +# +# CPU +# +CONFIG_CPU_INTEL_MODEL_206AX=y +CONFIG_CPU_INTEL_COMMON=y +CONFIG_ENABLE_VMX=y +CONFIG_SET_IA32_FC_LOCK_BIT=y +CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_TIMEBASE=y +CONFIG_CPU_INTEL_COMMON_SMM=y +CONFIG_MICROCODE_UPDATE_PRE_RAM=y +CONFIG_PARALLEL_MP=y +CONFIG_XAPIC_ONLY=y +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +# CONFIG_X2APIC_LATE_WORKAROUND is not set +CONFIG_UDELAY_TSC=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_TSC_SYNC_MFENCE=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y +CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y +CONFIG_SSE=y +CONFIG_SSE2=y +CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y +CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y +CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS is not set +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER is not set +# CONFIG_CPU_MICROCODE_CBFS_NONE is not set + +# +# Northbridge +# +CONFIG_USE_NATIVE_RAMINIT=y +CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y +# CONFIG_NATIVE_RAMINIT_IGNORE_MAX_MEM_FUSES is not set +# CONFIG_NATIVE_RAMINIT_IGNORE_XMP_MAX_DIMMS is not set +# CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set +# CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set +CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y +CONFIG_SOUTHBRIDGE_INTEL_C216=y +# CONFIG_HIDE_MEI_ON_ERROR is not set +CONFIG_PCIEXP_HOTPLUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMCLIB=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMBASE=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_GPIO=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_ME=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_EARLY_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI_ICH9=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y +CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +# CONFIG_INTEL_CHIPSET_LOCKDOWN is not set +CONFIG_TCO_SPACE_NOT_YET_SPLIT=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_WATCHDOG=y +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# +CONFIG_SUPERIO_SMSC_SCH5545=y + +# +# Embedded Controllers +# + +# +# Intel Firmware +# +CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_CHECK_ME is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +# CONFIG_USE_ME_CLEANER is not set +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +CONFIG_HAVE_GBE_BIN=y +# CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_LIBGFXINIT=y +CONFIG_MAINBOARD_USE_LIBGFXINIT=y +# CONFIG_VGA_ROM_RUN is not set +# CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +# CONFIG_VGA_TEXT_FRAMEBUFFER is not set +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x04000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +# CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y +# CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set +CONFIG_PCIEXP_HOTPLUG_IO=0x800 +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +CONFIG_INTEL_GMA_HAVE_VBT=y +CONFIG_INTEL_GMA_ADD_VBT=y +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y +CONFIG_USE_DDR3=y +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +# CONFIG_MRC_SETTINGS_PROTECT is not set +# CONFIG_DRIVERS_OPTION_CFR is not set +# CONFIG_SMMSTORE is not set +CONFIG_SPI_FLASH=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y +# CONFIG_SPI_FLASH_NO_FAST_READ is not set +CONFIG_SPI_FLASH_ADESTO=y +CONFIG_SPI_FLASH_AMIC=y +CONFIG_SPI_FLASH_ATMEL=y +CONFIG_SPI_FLASH_EON=y +CONFIG_SPI_FLASH_MACRONIX=y +CONFIG_SPI_FLASH_SPANSION=y +CONFIG_SPI_FLASH_SST=y +CONFIG_SPI_FLASH_ISSI=y +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_DRIVERS_UART=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +# CONFIG_USBDEBUG is not set +# CONFIG_VPD is not set +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +# CONFIG_DRIVERS_I2C_MAX98396 is not set +CONFIG_INTEL_INT15=y +CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" +CONFIG_GFX_GMA=y +CONFIG_GFX_GMA_DYN_CPU=y +CONFIG_GFX_GMA_GENERATION="Ironlake" +CONFIG_GFX_GMA_PCH="Cougar_Point" +CONFIG_GFX_GMA_PANEL_2_PORT="Disabled" +CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +CONFIG_DRIVERS_MC146818=y +CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_SIL_3114 is not set +CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_MTK_WIFI=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +CONFIG_TPM1=y +# CONFIG_TPM2 is not set +CONFIG_TPM=y +CONFIG_MAINBOARD_HAS_TPM1=y +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# CONFIG_INTEL_TXT is not set +# CONFIG_STM is not set +# CONFIG_BOOTMEDIA_LOCK_NONE is not set +CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +# CONFIG_BOOTMEDIA_SMM_BWP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y +CONFIG_RTC=y + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_POST_DEVICE_NONE=y +# CONFIG_POST_DEVICE_LPC is not set +# CONFIG_POST_DEVICE_PCI_PCIE is not set +CONFIG_POST_IO_PORT=0x80 +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_HAVE_ACPI_RESUME=y +CONFIG_RESUME_PATH_SAME_AS_BOOT=y +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_IOAPIC=y +CONFIG_USE_WATCHDOG_ON_BOOT=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +# CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_RAM_SETUP=y +# CONFIG_DEBUG_RAM_SETUP is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_SPI_FLASH is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +CONFIG_HAVE_EM100_SUPPORT=y +# CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_RAMSTAGE_ADA=y +CONFIG_RAMSTAGE_LIBHWBASE=y +CONFIG_HWBASE_DYNAMIC_MMIO=y +CONFIG_HWBASE_DEFAULT_MMCONF=0xf0000000 +CONFIG_HWBASE_DIRECT_PCIDEV=y +CONFIG_DECOMPRESS_OFAST=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-optiplex-7019_9010_TXT-maximized.config b/config/coreboot-optiplex-7019_9010_TXT-maximized.config new file mode 100644 index 000000000..79d2bd4da --- /dev/null +++ b/config/coreboot-optiplex-7019_9010_TXT-maximized.config @@ -0,0 +1,725 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_LTO is not set +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +CONFIG_TIMESTAMPS_ON_CONSOLE=y +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +# CONFIG_NO_STAGE_CACHE is not set +CONFIG_TSEG_STAGE_CACHE=y +# CONFIG_UPDATE_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set +CONFIG_VENDOR_DELL=y +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set +# CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set +CONFIG_MAINBOARD_PART_NUMBER="OptiPlex 9010" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="dell/snb_ivb_workstations" +CONFIG_VGA_BIOS_ID="8086,0106" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Dell Inc." +CONFIG_CBFS_SIZE=0xBE4FFF +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 +CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 +CONFIG_MAX_CPUS=8 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_POST_DEVICE=y +CONFIG_POST_IO=y +CONFIG_VARIANT_DIR="optiplex_9010_sff" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" +# CONFIG_VBOOT is not set +# CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Dell Inc." +CONFIG_DRAM_RESET_GATE_GPIO=60 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="OptiPlex 9010" +# CONFIG_CONSOLE_POST is not set +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_MAX_SOCKET=1 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +# CONFIG_BOARD_DELL_E6400 is not set +# CONFIG_BOARD_DELL_LATITUDE_E7240 is not set +# CONFIG_BOARD_DELL_OPTIPLEX_3050 is not set +# CONFIG_BOARD_DELL_OPTIPLEX_9020_SFF is not set +# CONFIG_BOARD_DELL_OPTIPLEX_9020_MT is not set +# CONFIG_BOARD_DELL_LATITUDE_E5420 is not set +# CONFIG_BOARD_DELL_LATITUDE_E5520 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6220 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6320 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6420 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6520 is not set +# CONFIG_BOARD_DELL_LATITUDE_E5530 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6230 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6330 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6430 is not set +# CONFIG_BOARD_DELL_LATITUDE_E6530 is not set +CONFIG_BOARD_DELL_OPTIPLEX_9010=y +# CONFIG_BOARD_DELL_PRECISION_T1650 is not set +# CONFIG_BOARD_DELL_XPS_8300 is not set +CONFIG_BOARD_DELL_SNB_IVB_WORKSTATIONS=y +CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=y +CONFIG_SMSC_SCH5545_EC_FW_FILE="@BLOB_DIR@/xx30/sch5545_ecfw.bin" +CONFIG_DCACHE_RAM_BASE=0xfefe0000 +CONFIG_DCACHE_RAM_SIZE=0x20000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 +CONFIG_HAVE_INTEL_FIRMWARE=y +CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_IFD_BIN_PATH="@BLOB_DIR@/optiplex_9010/ifd.bin" +CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" +CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set +CONFIG_HAVE_IFD_BIN=y +CONFIG_PCIEXP_HOTPLUG_BUSES=8 +CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +CONFIG_D3COLD_SUPPORT=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_12288=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +CONFIG_COREBOOT_ROMSIZE_KB_12288=y +# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=12288 +CONFIG_ROM_SIZE=0x00c00000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="northbridge/intel/sandybridge/chipset.cb" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_SMM_TSEG_SIZE=0x800000 +CONFIG_SMM_RESERVED_SIZE=0x100000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 +CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 +CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 +CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_INTEL_TXT_BIOSACM_ALIGNMENT=0x20000 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y +CONFIG_INTEL_TXT_SINIT_SIZE=0x20000 +CONFIG_INTEL_TXT_HEAP_SIZE=0xe0000 +CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 + +# +# CPU +# +CONFIG_CPU_INTEL_MODEL_206AX=y +CONFIG_CPU_INTEL_COMMON=y +CONFIG_ENABLE_VMX=y +CONFIG_SET_IA32_FC_LOCK_BIT=y +CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_TIMEBASE=y +CONFIG_CPU_INTEL_COMMON_SMM=y +CONFIG_MICROCODE_UPDATE_PRE_RAM=y +CONFIG_PARALLEL_MP=y +CONFIG_XAPIC_ONLY=y +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +# CONFIG_X2APIC_LATE_WORKAROUND is not set +CONFIG_UDELAY_TSC=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_TSC_SYNC_MFENCE=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y +CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y +CONFIG_SSE=y +CONFIG_SSE2=y +CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y +CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y +CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS is not set +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER is not set +# CONFIG_CPU_MICROCODE_CBFS_NONE is not set + +# +# Northbridge +# +CONFIG_USE_NATIVE_RAMINIT=y +CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y +# CONFIG_NATIVE_RAMINIT_IGNORE_MAX_MEM_FUSES is not set +# CONFIG_NATIVE_RAMINIT_IGNORE_XMP_MAX_DIMMS is not set +# CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set +# CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set +CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y +CONFIG_SOUTHBRIDGE_INTEL_C216=y +# CONFIG_HIDE_MEI_ON_ERROR is not set +CONFIG_PCIEXP_HOTPLUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMCLIB=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMBASE=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_GPIO=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_ME=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_EARLY_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI_ICH9=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y +CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +# CONFIG_INTEL_CHIPSET_LOCKDOWN is not set +CONFIG_TCO_SPACE_NOT_YET_SPLIT=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_WATCHDOG=y +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# +CONFIG_SUPERIO_SMSC_SCH5545=y + +# +# Embedded Controllers +# + +# +# Intel Firmware +# +CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_CHECK_ME is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +# CONFIG_USE_ME_CLEANER is not set +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +CONFIG_HAVE_GBE_BIN=y +# CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y +CONFIG_AP_IN_SIPI_WAIT=y +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_LIBGFXINIT=y +CONFIG_MAINBOARD_USE_LIBGFXINIT=y +# CONFIG_VGA_ROM_RUN is not set +# CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +# CONFIG_VGA_TEXT_FRAMEBUFFER is not set +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x04000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +# CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y +# CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set +CONFIG_PCIEXP_HOTPLUG_IO=0x800 +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +CONFIG_INTEL_GMA_HAVE_VBT=y +CONFIG_INTEL_GMA_ADD_VBT=y +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y +CONFIG_USE_DDR3=y +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=y +# CONFIG_DRIVERS_OPTION_CFR is not set +# CONFIG_SMMSTORE is not set +CONFIG_SPI_FLASH=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y +# CONFIG_SPI_FLASH_NO_FAST_READ is not set +CONFIG_SPI_FLASH_ADESTO=y +CONFIG_SPI_FLASH_AMIC=y +CONFIG_SPI_FLASH_ATMEL=y +CONFIG_SPI_FLASH_EON=y +CONFIG_SPI_FLASH_MACRONIX=y +CONFIG_SPI_FLASH_SPANSION=y +CONFIG_SPI_FLASH_SST=y +CONFIG_SPI_FLASH_ISSI=y +# CONFIG_TPM_PPI is not set +CONFIG_DRIVERS_UART=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +# CONFIG_USBDEBUG is not set +# CONFIG_VPD is not set +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +# CONFIG_DRIVERS_I2C_MAX98396 is not set +CONFIG_INTEL_INT15=y +CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" +CONFIG_GFX_GMA=y +CONFIG_GFX_GMA_DYN_CPU=y +CONFIG_GFX_GMA_GENERATION="Ironlake" +CONFIG_GFX_GMA_PCH="Cougar_Point" +CONFIG_GFX_GMA_PANEL_2_PORT="Disabled" +CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +CONFIG_DRIVERS_MC146818=y +CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_SIL_3114 is not set +CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_MTK_WIFI=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +CONFIG_TPM1=y +# CONFIG_TPM2 is not set +CONFIG_TPM=y +CONFIG_MAINBOARD_HAS_TPM1=y +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set +CONFIG_TPM_MEASURED_BOOT_INIT_BOOTBLOCK=y +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +CONFIG_INTEL_TXT_LIB=y +CONFIG_INTEL_TXT=y +CONFIG_INTEL_TXT_BIOSACM_FILE="@BLOB_DIR@/xx30/IVB_BIOSAC_PRODUCTION.bin" +CONFIG_INTEL_TXT_SINITACM_FILE="@BLOB_DIR@/xx30/SNB_IVB_SINIT_20190708_PW.bin" +CONFIG_INTEL_TXT_DPR_SIZE=3 +CONFIG_INTEL_TXT_BDR_VERSION=5 +# CONFIG_INTEL_TXT_TEST_BIOS_ACM_CALLING_CODE is not set +# CONFIG_INTEL_TXT_LOGGING is not set +CONFIG_INTEL_TXT_CBFS_BIOS_POLICY="txt_bios_policy.bin" +CONFIG_INTEL_TXT_CBFS_BIOS_ACM="txt_bios_acm.bin" +CONFIG_INTEL_TXT_CBFS_SINIT_ACM="txt_sinit_acm.bin" +# CONFIG_STM is not set +# CONFIG_BOOTMEDIA_LOCK_NONE is not set +CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +# CONFIG_BOOTMEDIA_SMM_BWP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y +CONFIG_RTC=y + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_POST_DEVICE_NONE=y +# CONFIG_POST_DEVICE_LPC is not set +# CONFIG_POST_DEVICE_PCI_PCIE is not set +CONFIG_POST_IO_PORT=0x80 +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_HAVE_ACPI_RESUME=y +CONFIG_RESUME_PATH_SAME_AS_BOOT=y +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_IOAPIC=y +CONFIG_USE_WATCHDOG_ON_BOOT=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +# CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_RAM_SETUP=y +# CONFIG_DEBUG_RAM_SETUP is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_SPI_FLASH is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +CONFIG_HAVE_EM100_SUPPORT=y +# CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_RAMSTAGE_ADA=y +CONFIG_RAMSTAGE_LIBHWBASE=y +CONFIG_HWBASE_DYNAMIC_MMIO=y +CONFIG_HWBASE_DEFAULT_MMCONF=0xf0000000 +CONFIG_HWBASE_DIRECT_PCIDEV=y +CONFIG_DECOMPRESS_OFAST=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index d467890ff..50c8b9daf 100644 --- a/config/coreboot-p8z77-m_pro-tpm1.config +++ b/config/coreboot-p8z77-m_pro-tpm1.config @@ -21,6 +21,7 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -66,6 +67,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 CONFIG_VENDOR_ASUS=y # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -79,7 +81,9 @@ CONFIG_VENDOR_ASUS=y # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set # CONFIG_VENDOR_LENOVO is not set # CONFIG_VENDOR_LIBRETREND is not set @@ -97,7 +101,6 @@ CONFIG_VENDOR_ASUS=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -115,7 +118,7 @@ CONFIG_FMDFILE="" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="ASUS" CONFIG_CBFS_SIZE=0x7E7000 -CONFIG_CONSOLE_SERIAL=y +# CONFIG_CONSOLE_SERIAL is not set CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 CONFIG_MAX_CPUS=8 @@ -165,22 +168,26 @@ CONFIG_BOARD_ASUS_P8X7X_SERIES=y CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 # CONFIG_CONSOLE_POST is not set CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_INTEL_WIFI=n CONFIG_IFD_BIN_PATH="@BLOB_DIR@/p8z77-m_pro/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/p8z77-m_pro/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="P8Z77-M PRO" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -190,9 +197,13 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" CONFIG_TTYS0_BAUD=115200 +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -235,29 +246,27 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_TTYS0_BASE=0x3f8 -CONFIG_TTYS0_LCS=3 -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -278,12 +287,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -326,7 +334,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -366,9 +373,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -378,6 +386,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -403,8 +412,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -424,11 +432,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -440,21 +443,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_DRIVERS_UART=y @@ -471,9 +471,11 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -483,10 +485,11 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -515,8 +518,13 @@ CONFIG_TPM=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -539,6 +547,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -555,6 +566,7 @@ CONFIG_SQUELCH_EARLY_SMP=y # # I/O mapped, 8250-compatible # +CONFIG_TTYS0_BASE=0x3f8 # # Serial port base address = 0x3f8 @@ -567,14 +579,15 @@ CONFIG_CONSOLE_SERIAL_115200=y # CONFIG_CONSOLE_SERIAL_38400 is not set # CONFIG_CONSOLE_SERIAL_19200 is not set # CONFIG_CONSOLE_SERIAL_9600 is not set +CONFIG_TTYS0_LCS=3 # CONFIG_SPKMODEM is not set # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=y +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set @@ -603,6 +616,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # System tables # CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -618,13 +632,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -649,6 +662,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -663,13 +680,13 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y @@ -684,3 +701,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config b/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config deleted file mode 100644 index 38f6c3164..000000000 --- a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config +++ /dev/null @@ -1,19 +0,0 @@ -# CONFIG_INCLUDE_CONFIG_FILE is not set -CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_CBFS_SIZE=0x980000 -# CONFIG_POST_IO is not set -# CONFIG_POST_DEVICE is not set -CONFIG_BOARD_EMULATION_QEMU_X86_Q35=y -# CONFIG_CONSOLE_SERIAL is not set -CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" -CONFIG_COREBOOT_ROMSIZE_KB_10240=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_UART_PCI_ADDR=0 -CONFIG_DRIVERS_PS2_KEYBOARD=y -CONFIG_USER_TPM1=y -CONFIG_TPM_MEASURED_BOOT=y -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=y -CONFIG_PAYLOAD_LINUX=y -CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" diff --git a/config/coreboot-qemu-tpm1-prod.config b/config/coreboot-qemu-tpm1-prod.config new file mode 100644 index 000000000..0742355a1 --- /dev/null +++ b/config/coreboot-qemu-tpm1-prod.config @@ -0,0 +1,589 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +CONFIG_CCACHE=y +# CONFIG_LTO is not set +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +# CONFIG_INCLUDE_CONFIG_FILE is not set +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +CONFIG_NO_STAGE_CACHE=y +# CONFIG_CBMEM_STAGE_CACHE is not set +# CONFIG_UPDATE_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set +# CONFIG_VENDOR_DELL is not set +CONFIG_VENDOR_EMULATION=y +# CONFIG_VENDOR_ERYING is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set +# CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set +CONFIG_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_PART_NUMBER="QEMU x86 q35/ich9" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="emulation/qemu-q35" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Emulation" +CONFIG_CBFS_SIZE=0x980000 +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=4 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +# CONFIG_POST_DEVICE is not set +# CONFIG_POST_IO is not set +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VBOOT_VBNV_OFFSET=0x2c +# CONFIG_CHROMEOS is not set +# CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +# CONFIG_CONSOLE_POST is not set +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_MAX_SOCKET=1 +CONFIG_TPM_PIRQ=0x0 +# CONFIG_BOARD_EMULATION_QEMU_AARCH64 is not set +# CONFIG_BOARD_EMULATION_QEMU_ARMV7 is not set +# CONFIG_BOARD_EMULATION_QEMU_X86_I440FX is not set +# CONFIG_BOARD_EMULATION_QEMU_POWER8 is not set +# CONFIG_BOARD_EMULATION_QEMU_POWER9 is not set +CONFIG_BOARD_EMULATION_QEMU_X86_Q35=y +# CONFIG_BOARD_EMULATION_QEMU_RISCV_RV64 is not set +# CONFIG_BOARD_EMULATION_QEMU_RISCV_RV32 is not set +# CONFIG_BOARD_EMULATION_QEMU_SBSA is not set +# CONFIG_BOARD_EMULATION_SPIKE_RISCV is not set +CONFIG_DCACHE_RAM_BASE=0x10000 +CONFIG_DCACHE_RAM_SIZE=0x90000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 +# CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set +CONFIG_PCIEXP_HOTPLUG_BUSES=32 +CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_D3COLD_SUPPORT=y +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="console=ttyS0,115200 console=tty quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_8192=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +CONFIG_COREBOOT_ROMSIZE_KB_10240=y +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=10240 +CONFIG_ROM_SIZE=0x00a00000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HPET_MIN_TICKS=0x80 +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y +CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 + +# +# CPU +# +CONFIG_CPU_QEMU_X86=y +# CONFIG_CPU_QEMU_X86_NO_SMM is not set +CONFIG_CPU_QEMU_X86_ASEG_SMM=y +# CONFIG_CPU_QEMU_X86_TSEG_SMM is not set +CONFIG_PARALLEL_MP=y +CONFIG_XAPIC_ONLY=y +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +# CONFIG_X2APIC_LATE_WORKAROUND is not set +CONFIG_UDELAY_TSC=y +CONFIG_UNKNOWN_TSC_RATE=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y +CONFIG_SMM_ASEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y + +# +# Northbridge +# + +# +# Southbridge +# +CONFIG_PCIEXP_HOTPLUG=y +CONFIG_SOUTHBRIDGE_INTEL_I82801IX=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMCLIB=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMBASE=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_GPIO=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_EARLY_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_TCO_SPACE_NOT_YET_SPLIT=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_WATCHDOG=y +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_MAINBOARD_HAS_CHROMEOS=y + +# +# ChromeOS +# +# end of ChromeOS + +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_IDT_IN_EVERY_STAGE=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +# CONFIG_VGA_TEXT_FRAMEBUFFER is not set +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x10000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +# CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y +# CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set +CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_ELOG is not set +# CONFIG_DRIVERS_OPTION_CFR is not set +# CONFIG_SMMSTORE is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_DRIVERS_UART=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +# CONFIG_USBDEBUG is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y +CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y +CONFIG_DRIVERS_EMULATION_QEMU_XRES=1024 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=768 +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +# CONFIG_DRIVERS_I2C_MAX98396 is not set +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +CONFIG_DRIVERS_PS2_KEYBOARD=y +CONFIG_DRIVERS_MC146818=y +CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +CONFIG_VGA=y +# CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_DRIVERS_MTK_WIFI is not set +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +CONFIG_TPM1=y +# CONFIG_TPM2 is not set +CONFIG_TPM=y +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# CONFIG_INTEL_TXT is not set +CONFIG_BOOTMEDIA_LOCK_NONE=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_BOOT_DEVICE_NOT_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +CONFIG_CONSOLE_QEMU_DEBUGCON=y +CONFIG_CONSOLE_QEMU_DEBUGCON_PORT=0x402 +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_IOAPIC=y +CONFIG_USE_WATCHDOG_ON_BOOT=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +# CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_DECOMPRESS_OFAST=y +CONFIG_PROBE_RAM=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 022084c3e..695e4eb4e 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set CONFIG_CCACHE=y +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,6 +20,7 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y # CONFIG_INCLUDE_CONFIG_FILE is not set CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -40,7 +40,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -58,31 +57,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set CONFIG_VENDOR_EMULATION=y +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set # CONFIG_VENDOR_LENOVO is not set # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -93,18 +102,20 @@ CONFIG_VENDOR_EMULATION=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_PART_NUMBER="QEMU x86 q35/ich9" CONFIG_MAINBOARD_VERSION="1.0" @@ -120,17 +131,26 @@ CONFIG_MAX_CPUS=4 CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_DEVICE is not set # CONFIG_POST_IO is not set +CONFIG_OVERRIDE_DEVICETREE="" CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set CONFIG_VBOOT_VBNV_OFFSET=0x2c # CONFIG_CHROMEOS is not set -CONFIG_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +# CONFIG_CONSOLE_POST is not set CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -# CONFIG_CONSOLE_POST is not set +CONFIG_MAX_SOCKET=1 CONFIG_TPM_PIRQ=0x0 # CONFIG_BOARD_EMULATION_QEMU_AARCH64 is not set # CONFIG_BOARD_EMULATION_QEMU_ARMV7 is not set @@ -140,31 +160,33 @@ CONFIG_TPM_PIRQ=0x0 CONFIG_BOARD_EMULATION_QEMU_X86_Q35=y # CONFIG_BOARD_EMULATION_QEMU_RISCV_RV64 is not set # CONFIG_BOARD_EMULATION_QEMU_RISCV_RV32 is not set +# CONFIG_BOARD_EMULATION_QEMU_SBSA is not set # CONFIG_BOARD_EMULATION_SPIKE_RISCV is not set -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0x10000 CONFIG_DCACHE_RAM_SIZE=0x90000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set CONFIG_PCIEXP_HOTPLUG_BUSES=32 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y CONFIG_DRIVERS_UART_8250IO=y -CONFIG_HEAP_SIZE=0x8000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" -CONFIG_BOARD_ROMSIZE_KB_2048=y +CONFIG_BOARD_ROMSIZE_KB_8192=y # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set # CONFIG_COREBOOT_ROMSIZE_KB_512 is not set # CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set @@ -176,6 +198,7 @@ CONFIG_BOARD_ROMSIZE_KB_2048=y CONFIG_COREBOOT_ROMSIZE_KB_10240=y # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=10240 @@ -200,20 +223,23 @@ CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +# CONFIG_USE_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -230,9 +256,10 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_UNKNOWN_TSC_RATE=y CONFIG_TSC_MONOTONIC_TIMER=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_ASEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y @@ -255,7 +282,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y # CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set @@ -278,6 +304,7 @@ CONFIG_MAINBOARD_HAS_CHROMEOS=y # # end of ChromeOS +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -285,19 +312,27 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y # CONFIG_BOOTBLOCK_NORMAL is not set CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_IDT_IN_EVERY_STAGE=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -317,13 +352,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -334,25 +369,21 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_USE_DDR5=y -CONFIG_USE_LPDDR4=y -CONFIG_USE_DDR4=y -CONFIG_USE_DDR3=y -CONFIG_USE_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y # end of Devices # # Generic Drivers # CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_ELOG is not set +# CONFIG_DRIVERS_OPTION_CFR is not set +# CONFIG_SMMSTORE is not set CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_DRIVERS_UART=y @@ -362,24 +393,25 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_USBDEBUG is not set # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 +CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y +CONFIG_DRIVERS_EMULATION_QEMU_XRES=1024 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=768 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set # CONFIG_DRIVERS_I2C_MAX98396 is not set -CONFIG_INTEL_GMA_OPREGION_2_0=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_VGA=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -401,15 +433,20 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y # CONFIG_TPM2 is not set CONFIG_TPM=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -428,9 +465,13 @@ CONFIG_BOOTMEDIA_LOCK_NONE=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_NOT_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y # # Console @@ -446,19 +487,19 @@ CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_QEMU_DEBUGCON=y CONFIG_CONSOLE_QEMU_DEBUGCON_PORT=0x402 # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=y +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=6 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y CONFIG_CONSOLE_USE_ANSI_ESCAPES=y # CONFIG_CMOS_POST is not set -CONFIG_HWBASE_DEBUG_NULL=y +CONFIG_HWBASE_DEBUG_CB=y # end of Console CONFIG_HAVE_MONOTONIC_TIMER=y @@ -470,6 +511,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # System tables # CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -478,6 +520,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -485,13 +528,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -516,6 +557,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -524,17 +569,18 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # General Debug Settings # # CONFIG_GDB_STUB is not set -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set +# CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_DECOMPRESS_OFAST=y +CONFIG_PROBE_RAM=y CONFIG_WARNINGS_ARE_ERRORS=y CONFIG_MAX_REBOOT_CNT=3 CONFIG_RELOCATABLE_MODULES=y diff --git a/config/coreboot-qemu-tpm2-prod.config b/config/coreboot-qemu-tpm2-prod.config new file mode 100644 index 000000000..c4b06ec5e --- /dev/null +++ b/config/coreboot-qemu-tpm2-prod.config @@ -0,0 +1,581 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +CONFIG_CCACHE=y +# CONFIG_LTO is not set +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +# CONFIG_INCLUDE_CONFIG_FILE is not set +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +CONFIG_NO_STAGE_CACHE=y +# CONFIG_CBMEM_STAGE_CACHE is not set +# CONFIG_UPDATE_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set +# CONFIG_VENDOR_DELL is not set +CONFIG_VENDOR_EMULATION=y +# CONFIG_VENDOR_ERYING is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set +# CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set +CONFIG_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_PART_NUMBER="QEMU x86 q35/ich9" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="emulation/qemu-q35" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Emulation" +CONFIG_CBFS_SIZE=0xfe0000 +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=4 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +# CONFIG_POST_DEVICE is not set +# CONFIG_POST_IO is not set +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VBOOT_VBNV_OFFSET=0x2c +# CONFIG_CHROMEOS is not set +# CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +# CONFIG_CONSOLE_POST is not set +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_MAX_SOCKET=1 +CONFIG_TPM_PIRQ=0x0 +# CONFIG_BOARD_EMULATION_QEMU_AARCH64 is not set +# CONFIG_BOARD_EMULATION_QEMU_ARMV7 is not set +# CONFIG_BOARD_EMULATION_QEMU_X86_I440FX is not set +# CONFIG_BOARD_EMULATION_QEMU_POWER8 is not set +# CONFIG_BOARD_EMULATION_QEMU_POWER9 is not set +CONFIG_BOARD_EMULATION_QEMU_X86_Q35=y +# CONFIG_BOARD_EMULATION_QEMU_RISCV_RV64 is not set +# CONFIG_BOARD_EMULATION_QEMU_RISCV_RV32 is not set +# CONFIG_BOARD_EMULATION_QEMU_SBSA is not set +# CONFIG_BOARD_EMULATION_SPIKE_RISCV is not set +CONFIG_DCACHE_RAM_BASE=0x10000 +CONFIG_DCACHE_RAM_SIZE=0x90000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 +# CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_D3COLD_SUPPORT=y +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="console=ttyS0,115200 console=tty quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_8192=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=16384 +CONFIG_ROM_SIZE=0x01000000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HPET_MIN_TICKS=0x80 +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y +CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 + +# +# CPU +# +CONFIG_CPU_QEMU_X86=y +# CONFIG_CPU_QEMU_X86_NO_SMM is not set +CONFIG_CPU_QEMU_X86_ASEG_SMM=y +# CONFIG_CPU_QEMU_X86_TSEG_SMM is not set +CONFIG_PARALLEL_MP=y +CONFIG_XAPIC_ONLY=y +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +# CONFIG_X2APIC_LATE_WORKAROUND is not set +CONFIG_UDELAY_TSC=y +CONFIG_UNKNOWN_TSC_RATE=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y +CONFIG_SMM_ASEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_SOUTHBRIDGE_INTEL_I82801IX=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMCLIB=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMBASE=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_GPIO=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_EARLY_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_TCO_SPACE_NOT_YET_SPLIT=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_WATCHDOG=y +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_MAINBOARD_HAS_CHROMEOS=y + +# +# ChromeOS +# +# end of ChromeOS + +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_IDT_IN_EVERY_STAGE=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +# CONFIG_VGA_TEXT_FRAMEBUFFER is not set +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x10000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +# CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_ELOG is not set +# CONFIG_DRIVERS_OPTION_CFR is not set +# CONFIG_SMMSTORE is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_DRIVERS_UART=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +# CONFIG_USBDEBUG is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y +CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y +CONFIG_DRIVERS_EMULATION_QEMU_XRES=1024 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=768 +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +# CONFIG_DRIVERS_I2C_MAX98396 is not set +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +CONFIG_DRIVERS_PS2_KEYBOARD=y +CONFIG_DRIVERS_MC146818=y +CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +CONFIG_VGA=y +# CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_DRIVERS_MTK_WIFI is not set +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +# CONFIG_TPM1 is not set +CONFIG_TPM2=y +CONFIG_TPM=y +# CONFIG_DEBUG_TPM is not set +CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM2 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# CONFIG_INTEL_TXT is not set +CONFIG_BOOTMEDIA_LOCK_NONE=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_BOOT_DEVICE_NOT_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +CONFIG_CONSOLE_QEMU_DEBUGCON=y +CONFIG_CONSOLE_QEMU_DEBUGCON_PORT=0x402 +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_IOAPIC=y +CONFIG_USE_WATCHDOG_ON_BOOT=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +# CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_DECOMPRESS_OFAST=y +CONFIG_PROBE_RAM=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index bdf4fbb56..bb42ba01a 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set CONFIG_CCACHE=y +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,6 +20,7 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y # CONFIG_INCLUDE_CONFIG_FILE is not set CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -40,7 +40,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -58,31 +57,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set CONFIG_VENDOR_EMULATION=y +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set # CONFIG_VENDOR_LENOVO is not set # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -93,18 +102,20 @@ CONFIG_VENDOR_EMULATION=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_PART_NUMBER="QEMU x86 q35/ich9" CONFIG_MAINBOARD_VERSION="1.0" @@ -120,17 +131,26 @@ CONFIG_MAX_CPUS=4 CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_DEVICE is not set # CONFIG_POST_IO is not set +CONFIG_OVERRIDE_DEVICETREE="" CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set CONFIG_VBOOT_VBNV_OFFSET=0x2c # CONFIG_CHROMEOS is not set -CONFIG_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +# CONFIG_CONSOLE_POST is not set CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -# CONFIG_CONSOLE_POST is not set +CONFIG_MAX_SOCKET=1 CONFIG_TPM_PIRQ=0x0 # CONFIG_BOARD_EMULATION_QEMU_AARCH64 is not set # CONFIG_BOARD_EMULATION_QEMU_ARMV7 is not set @@ -140,28 +160,30 @@ CONFIG_TPM_PIRQ=0x0 CONFIG_BOARD_EMULATION_QEMU_X86_Q35=y # CONFIG_BOARD_EMULATION_QEMU_RISCV_RV64 is not set # CONFIG_BOARD_EMULATION_QEMU_RISCV_RV32 is not set +# CONFIG_BOARD_EMULATION_QEMU_SBSA is not set # CONFIG_BOARD_EMULATION_SPIKE_RISCV is not set -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0x10000 CONFIG_DCACHE_RAM_SIZE=0x90000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y CONFIG_DRIVERS_UART_8250IO=y -CONFIG_HEAP_SIZE=0x8000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" -CONFIG_BOARD_ROMSIZE_KB_2048=y +CONFIG_BOARD_ROMSIZE_KB_8192=y # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set # CONFIG_COREBOOT_ROMSIZE_KB_512 is not set # CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set @@ -173,6 +195,7 @@ CONFIG_BOARD_ROMSIZE_KB_2048=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -197,20 +220,23 @@ CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +# CONFIG_USE_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -227,9 +253,10 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_UNKNOWN_TSC_RATE=y CONFIG_TSC_MONOTONIC_TIMER=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_ASEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y @@ -252,7 +279,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y # CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set @@ -275,6 +301,7 @@ CONFIG_MAINBOARD_HAS_CHROMEOS=y # # end of ChromeOS +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -282,19 +309,27 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y CONFIG_BOOTBLOCK_SIMPLE=y # CONFIG_BOOTBLOCK_NORMAL is not set CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_IDT_IN_EVERY_STAGE=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -314,13 +349,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x10000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -328,25 +363,21 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_USE_DDR5=y -CONFIG_USE_LPDDR4=y -CONFIG_USE_DDR4=y -CONFIG_USE_DDR3=y -CONFIG_USE_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y # end of Devices # # Generic Drivers # CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_ELOG is not set +# CONFIG_DRIVERS_OPTION_CFR is not set +# CONFIG_SMMSTORE is not set CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_DRIVERS_UART=y @@ -356,24 +387,25 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_USBDEBUG is not set # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 +CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y +CONFIG_DRIVERS_EMULATION_QEMU_XRES=1024 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=768 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set # CONFIG_DRIVERS_I2C_MAX98396 is not set -CONFIG_INTEL_GMA_OPREGION_2_0=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_VGA=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -395,14 +427,18 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set # CONFIG_TPM1 is not set CONFIG_TPM2=y CONFIG_TPM=y # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -421,9 +457,13 @@ CONFIG_BOOTMEDIA_LOCK_NONE=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_NOT_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y # # Console @@ -439,19 +479,19 @@ CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_QEMU_DEBUGCON=y CONFIG_CONSOLE_QEMU_DEBUGCON_PORT=0x402 # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=y +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=6 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y CONFIG_CONSOLE_USE_ANSI_ESCAPES=y # CONFIG_CMOS_POST is not set -CONFIG_HWBASE_DEBUG_NULL=y +CONFIG_HWBASE_DEBUG_CB=y # end of Console CONFIG_HAVE_MONOTONIC_TIMER=y @@ -463,6 +503,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # System tables # CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -471,6 +512,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -478,13 +520,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -509,6 +549,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -517,17 +561,18 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # General Debug Settings # # CONFIG_GDB_STUB is not set -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set +# CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_DECOMPRESS_OFAST=y +CONFIG_PROBE_RAM=y CONFIG_WARNINGS_ARE_ERRORS=y CONFIG_MAX_REBOOT_CNT=3 CONFIG_RELOCATABLE_MODULES=y diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index af7ea9fba..be42a857a 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -22,10 +21,13 @@ CONFIG_USE_OPTION_TABLE=y CONFIG_STATIC_OPTION_TABLE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -39,7 +41,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -57,31 +58,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -92,18 +103,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_FAMILY="ThinkPad T420" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T420" @@ -120,39 +133,47 @@ CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_OVERRIDE_DEVICETREE="" CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a -CONFIG_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T420" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_VBOOT_SLOTS_RW_A=y CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx20/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx20/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx20/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T420" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -160,7 +181,11 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -180,6 +205,7 @@ CONFIG_BOARD_LENOVO_T420=y # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -193,16 +219,18 @@ CONFIG_BOARD_LENOVO_T420=y # CONFIG_BOARD_LENOVO_X230S is not set # CONFIG_BOARD_LENOVO_X230_EDP is not set # CONFIG_BOARD_LENOVO_X60 is not set -CONFIG_DRIVER_LENOVO_SERIALS=y CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_8192=y @@ -217,6 +245,7 @@ CONFIG_COREBOOT_ROMSIZE_KB_8192=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=8192 @@ -245,27 +274,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -286,12 +317,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -311,12 +342,17 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_BD82X6X=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -334,7 +370,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -374,6 +409,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -381,10 +417,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -394,6 +431,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -414,13 +456,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -431,8 +473,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -440,11 +480,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -455,21 +491,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -483,12 +518,16 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVER_LENOVO_SERIALS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -499,11 +538,12 @@ CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -525,15 +565,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -556,6 +602,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -601,6 +650,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -609,6 +659,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -616,13 +667,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -647,6 +696,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -654,13 +707,11 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -668,6 +719,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-t420.config b/config/coreboot-t420.config index 36068d830..e332fd789 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.config @@ -21,10 +21,11 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -64,6 +65,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -77,7 +79,9 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -95,7 +99,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -121,7 +124,6 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" @@ -133,24 +135,28 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_VBOOT_SLOTS_RW_A=y CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_INTEL_WIFI=n CONFIG_IFD_BIN_PATH="@BLOB_DIR@/t420/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/t420/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/t420/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T420" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -197,9 +203,12 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -244,27 +253,27 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -285,12 +294,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -333,7 +341,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -381,9 +388,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -393,6 +401,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -418,8 +427,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -439,11 +447,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -454,21 +457,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -485,9 +485,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -498,11 +501,12 @@ CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -531,8 +535,13 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -553,6 +562,9 @@ CONFIG_BOOTMEDIA_LOCK_NONE=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -598,6 +610,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -613,13 +626,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -644,6 +656,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -657,7 +673,6 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -665,6 +680,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y @@ -679,3 +695,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-t430-legacy-flash.config b/config/coreboot-t430-legacy-flash.config index f44706ed5..13f1e0f8f 100644 --- a/config/coreboot-t430-legacy-flash.config +++ b/config/coreboot-t430-legacy-flash.config @@ -24,7 +24,7 @@ CONFIG_COMPRESS_RAMSTAGE_LZMA=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y CONFIG_TIMESTAMPS_ON_CONSOLE=y -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -146,7 +146,6 @@ CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X230" # CONFIG_HAVE_IFD_BIN is not set @@ -426,7 +425,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_NO_DDR5=y CONFIG_NO_LPDDR4=y CONFIG_NO_DDR4=y @@ -557,7 +555,7 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set @@ -664,3 +662,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-t430-legacy.config b/config/coreboot-t430-legacy.config index 8a1917711..03555f257 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.config @@ -22,10 +22,11 @@ CONFIG_USE_OPTION_TABLE=y CONFIG_STATIC_OPTION_TABLE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y CONFIG_TIMESTAMPS_ON_CONSOLE=y -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -66,6 +67,7 @@ CONFIG_FW_CONFIG_SOURCE_CBFS=y # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -79,7 +81,9 @@ CONFIG_FW_CONFIG_SOURCE_CBFS=y # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -97,7 +101,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -123,7 +126,6 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" @@ -135,20 +137,24 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_INTEL_WIFI=n CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T430" # CONFIG_HAVE_IFD_BIN is not set CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -196,9 +202,12 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -243,27 +252,27 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -284,12 +293,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -332,7 +340,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -371,9 +378,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -383,6 +391,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -408,8 +417,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 # CONFIG_PCI_ALLOW_BUS_MASTER is not set @@ -427,11 +435,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -442,21 +445,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -473,9 +473,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -486,11 +489,12 @@ CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -519,8 +523,13 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -541,6 +550,9 @@ CONFIG_BOOTMEDIA_LOCK_NONE=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -586,6 +598,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -601,13 +614,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -632,6 +644,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -645,12 +661,12 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y @@ -665,3 +681,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 74d2eb51a..194bcca40 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -22,10 +21,13 @@ CONFIG_USE_OPTION_TABLE=y CONFIG_STATIC_OPTION_TABLE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -39,7 +41,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -57,31 +58,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -92,18 +103,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_FAMILY="ThinkPad T430" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T430" @@ -120,38 +133,46 @@ CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_OVERRIDE_DEVICETREE="" CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a -CONFIG_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T430" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T430" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -159,7 +180,11 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -179,6 +204,7 @@ CONFIG_BOARD_LENOVO_THINKPAD_T430=y # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -193,16 +219,18 @@ CONFIG_BOARD_LENOVO_THINKPAD_T430=y # CONFIG_BOARD_LENOVO_X230_EDP is not set # CONFIG_BOARD_LENOVO_X60 is not set CONFIG_VBOOT_SLOTS_RW_AB=y -CONFIG_DRIVER_LENOVO_SERIALS=y CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_12288=y @@ -217,6 +245,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -245,27 +274,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -286,12 +317,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -311,12 +342,17 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -334,7 +370,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -374,6 +409,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -381,10 +417,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -394,6 +431,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -414,13 +456,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -431,8 +473,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -440,11 +480,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -455,21 +491,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -483,12 +518,16 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVER_LENOVO_SERIALS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -499,11 +538,12 @@ CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -525,15 +565,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -556,6 +602,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -601,6 +650,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -609,6 +659,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -616,13 +667,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -647,6 +696,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -654,13 +707,11 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -668,6 +719,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 737119e4c..e3f91d4c4 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,10 +20,13 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_ROMSTAGE=y @@ -39,7 +41,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -57,31 +58,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -92,18 +103,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_MAINBOARD_FAMILY="ThinkPad T440p" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T440p" CONFIG_MAINBOARD_VERSION="1.0" @@ -114,50 +127,62 @@ CONFIG_DIMM_SPD_SIZE=256 CONFIG_FMDFILE="" CONFIG_NO_POST=y CONFIG_MAINBOARD_VENDOR="LENOVO" -CONFIG_CBFS_SIZE=0x800000 +CONFIG_CBFS_SIZE=0xBE4FFF CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 # CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="t440p" CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T440p" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xff7c0000 CONFIG_DCACHE_RAM_SIZE=0x10000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x2000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/t440p/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/t440p/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/t440p/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 # CONFIG_ENABLE_DDR_2X_REFRESH is not set CONFIG_PCIEXP_AER=y -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T440p" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_BOARD_LENOVO_THINKPAD_T440P=y # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -177,6 +202,7 @@ CONFIG_BOARD_LENOVO_THINKPAD_T440P=y # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -196,11 +222,15 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0036" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_12288=y @@ -215,6 +245,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -244,12 +275,12 @@ CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xe8000000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 @@ -258,16 +289,17 @@ CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_HAVE_MRC=y CONFIG_MRC_FILE="@BLOB_DIR@/haswell/mrc.bin" CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x30000 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_DISABLE_ME_PCI=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -281,7 +313,6 @@ CONFIG_SET_MSR_AESNI_LOCK_BIT=y CONFIG_CPU_INTEL_COMMON_TIMEBASE=y CONFIG_CPU_INTEL_COMMON_VOLTAGE=y CONFIG_CPU_INTEL_COMMON_SMM=y -CONFIG_MICROCODE_UPDATE_PRE_RAM=y CONFIG_PARALLEL_MP=y CONFIG_XAPIC_ONLY=y # CONFIG_X2APIC_ONLY is not set @@ -290,12 +321,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -310,12 +340,12 @@ CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y # CONFIG_NORTHBRIDGE_INTEL_HASWELL=y # CONFIG_USE_NATIVE_RAMINIT is not set +# CONFIG_USE_BROADWELL_MRC is not set CONFIG_HASWELL_HIDE_PEG_FROM_MRC=y # # Southbridge # -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_PCIEXP_HOTPLUG is not set CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y CONFIG_SOUTHBRIDGE_INTEL_LYNXPOINT=y @@ -332,7 +362,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI_ICH9=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -358,6 +387,7 @@ CONFIG_H8_FLASH_LEDS_ON_DEATH=y # CONFIG_H8_FN_CTRL_SWAP is not set CONFIG_H8_HAS_BAT_THRESHOLDS_IMPL=y CONFIG_H8_HAS_PRIMARY_FN_KEYS=y +CONFIG_H8_HAS_LEDLOGO=y CONFIG_EC_LENOVO_PMH7=y # @@ -373,6 +403,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -380,8 +411,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -391,6 +424,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -411,13 +449,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -425,8 +463,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -434,11 +470,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -449,6 +481,7 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y @@ -458,11 +491,10 @@ CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -481,9 +513,11 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_INTEL_DDI=y CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Haswell" CONFIG_GFX_GMA_PCH="Lynx_Point" @@ -493,10 +527,11 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" # CONFIG_DRIVERS_PS2_KEYBOARD is not set CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -518,15 +553,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -550,6 +591,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -595,6 +639,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # System tables # CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -603,6 +648,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -610,13 +656,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -641,6 +685,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -648,11 +696,9 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -660,6 +706,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-t480-maximized.config b/config/coreboot-t480-maximized.config new file mode 100644 index 000000000..48b70fc5a --- /dev/null +++ b/config/coreboot-t480-maximized.config @@ -0,0 +1,885 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_LTO is not set +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +# CONFIG_NO_STAGE_CACHE is not set +CONFIG_TSEG_STAGE_CACHE=y +# CONFIG_UPDATE_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=90 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set +# CONFIG_VENDOR_DELL is not set +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set +CONFIG_VENDOR_LENOVO=y +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set +# CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set +CONFIG_MAINBOARD_FAMILY="T480" +CONFIG_MAINBOARD_PART_NUMBER="T480" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/sklkbl_thinkpad" +CONFIG_VGA_BIOS_ID="8086,0406" +CONFIG_DIMM_MAX=2 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" +CONFIG_CBFS_SIZE=0xEEC000 +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 +CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y +CONFIG_MAX_CPUS=8 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_VARIANT_DIR="t480" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +# CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="T480" +CONFIG_MAX_SOCKET=1 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0x40000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 +CONFIG_HAVE_INTEL_FIRMWARE=y +CONFIG_USE_LEGACY_8254_TIMER=y +CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 +# CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx80/ifd.bin" +CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx80/me.bin" +CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx80/gbe.bin" +CONFIG_MAINBOARD_SUPPORTS_SKYLAKE_CPU=y +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y +# CONFIG_DEBUG_SMI is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set +CONFIG_HAVE_IFD_BIN=y +CONFIG_PCIEXP_HOTPLUG_BUSES=8 +CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 +# CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set +# CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set +# CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set +# CONFIG_BOARD_LENOVO_S230U is not set +CONFIG_BOARD_LENOVO_T480=y +# CONFIG_BOARD_LENOVO_T480S is not set +# CONFIG_BOARD_LENOVO_T400 is not set +# CONFIG_BOARD_LENOVO_T500 is not set +# CONFIG_BOARD_LENOVO_R400 is not set +# CONFIG_BOARD_LENOVO_R500 is not set +# CONFIG_BOARD_LENOVO_W500 is not set +# CONFIG_BOARD_LENOVO_T410 is not set +# CONFIG_BOARD_LENOVO_T420 is not set +# CONFIG_BOARD_LENOVO_T420S is not set +# CONFIG_BOARD_LENOVO_THINKPAD_T430 is not set +# CONFIG_BOARD_LENOVO_T430S is not set +# CONFIG_BOARD_LENOVO_T431S is not set +# CONFIG_BOARD_LENOVO_T520 is not set +# CONFIG_BOARD_LENOVO_W520 is not set +# CONFIG_BOARD_LENOVO_T530 is not set +# CONFIG_BOARD_LENOVO_W530 is not set +# CONFIG_BOARD_LENOVO_T60 is not set +# CONFIG_BOARD_LENOVO_Z61T is not set +# CONFIG_BOARD_LENOVO_R60 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set +# CONFIG_BOARD_LENOVO_X131E is not set +# CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set +# CONFIG_BOARD_LENOVO_X200 is not set +# CONFIG_BOARD_LENOVO_X301 is not set +# CONFIG_BOARD_LENOVO_X201 is not set +# CONFIG_BOARD_LENOVO_X220 is not set +# CONFIG_BOARD_LENOVO_X220I is not set +# CONFIG_BOARD_LENOVO_X1 is not set +# CONFIG_BOARD_LENOVO_X230 is not set +# CONFIG_BOARD_LENOVO_X230T is not set +# CONFIG_BOARD_LENOVO_X230S is not set +# CONFIG_BOARD_LENOVO_X230_EDP is not set +# CONFIG_BOARD_LENOVO_X60 is not set +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_THINKPADEC_HKEY_EISAID="IBM0068" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON=y +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=16384 +CONFIG_ROM_SIZE=0x01000000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# end of Mainboard + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="soc/intel/skylake/chipset.cb" +CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" +CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_SMM_TSEG_SIZE=0x800000 +CONFIG_SMM_RESERVED_SIZE=0x200000 +CONFIG_SMM_MODULE_STACK_SIZE=0x800 +CONFIG_ACPI_BERT_SIZE=0x0 +CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=120 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_IFD_CHIPSET="sklkbl" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_ROOT_PORTS=24 +CONFIG_PCR_BASE_ADDRESS=0xfd000000 +CONFIG_CPU_BCLK_MHZ=100 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_CLOCK_MHZ=120 +CONFIG_CPU_XTAL_HZ=24000000 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=2 +CONFIG_SOC_INTEL_I2C_DEV_MAX=6 +# CONFIG_ENABLE_SATA_TEST_MODE is not set +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x30 +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0xc35 +CONFIG_FSP_HEADER_PATH="3rdparty/fsp/KabylakeFspBinPkg/Include/" +CONFIG_FSP_FD_PATH="3rdparty/fsp/KabylakeFspBinPkg/Fsp.fd" +CONFIG_SOC_INTEL_COMMON_DEBUG_CONSENT=0 +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +CONFIG_FSP_PUBLISH_MBP_HOB=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +CONFIG_MAX_HECI_DEVICES=5 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_INTEL_TXT_BIOSACM_ALIGNMENT=0x40000 +CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=10 +CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 +CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 +CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_SOC_INTEL_COMMON_SKYLAKE_BASE=y +CONFIG_SOC_INTEL_KABYLAKE=y +CONFIG_FSP_T_LOCATION=0xfffe0000 +CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y +CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_INTEL_COMMON=y + +# +# Intel SoC Common Code for IP blocks +# +CONFIG_SOC_INTEL_COMMON_BLOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_LPIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CHIP_CONFIG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_MPINIT=y +CONFIG_USE_FSP_FEATURE_PROGRAM_ON_APS=y +# CONFIG_USE_COREBOOT_MP_INIT is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y +CONFIG_INTEL_CAR_NEM_ENHANCED=y +# CONFIG_USE_INTEL_FSP_MP_INIT is not set +CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y +CONFIG_HAVE_HYPERTHREADING=y +CONFIG_FSP_HYPERTHREADING=y +# CONFIG_INTEL_KEYLOCKER is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_MAX is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_256MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_128MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_64MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_32MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_16MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_8MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_4MB is not set +# CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_2MB is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_PRMRR_SIZE_0MB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PCR=y +CONFIG_SOC_INTEL_CSE_FMAP_NAME="SI_ME" +CONFIG_SOC_INTEL_CSE_RW_A_FMAP_NAME="ME_RW_A" +CONFIG_SOC_INTEL_CSE_RW_B_FMAP_NAME="ME_RW_B" +CONFIG_SOC_INTEL_CSE_RW_CBFS_NAME="me_rw" +CONFIG_SOC_INTEL_CSE_RW_HASH_CBFS_NAME="me_rw.hash" +CONFIG_SOC_INTEL_CSE_RW_VERSION_CBFS_NAME="me_rw.version" +CONFIG_SOC_INTEL_CSE_RW_FILE="" +CONFIG_SOC_INTEL_CSE_RW_VERSION="" +CONFIG_SOC_INTEL_CSE_IOM_CBFS_NAME="cse_iom" +CONFIG_SOC_INTEL_CSE_IOM_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_NAME="cse_nphy" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" +CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y +CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_PADCFG_PADTOL=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_DUAL_ROUTE_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GRAPHICS=y +CONFIG_SOC_INTEL_GFX_HAVE_DDI_A_BIFURCATION=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA_VERB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_I2C=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ITSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC_MIRROR_TO_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_BASE_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC_DISCOVERABLE=y +CONFIG_PMC_GLOBAL_RESET_ENABLE_LOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_POWER_LIMIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_RTC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SATA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SCS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SGX=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_LOCK_MEMORY=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO_ENABLE_THROUGH_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y +# CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_TCO_ENABLE is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 +CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y +CONFIG_SA_ENABLE_DPR=y +CONFIG_HAVE_CAPID_A_REGISTER=y +CONFIG_HAVE_BDSM_BGSM_REGISTER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL=y +CONFIG_SOC_INTEL_COMMON_BLOCK_THERMAL_PCI_DEV=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_UART=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y + +# +# Intel SoC Common PCH Code +# +CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y +CONFIG_SOC_INTEL_COMMON_PCH_BASE=y +CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=y +CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM=y +CONFIG_PCH_SPECIFIC_BASE_OPTIONS=y +CONFIG_PCH_SPECIFIC_DISCRETE_OPTIONS=y +CONFIG_PCH_SPECIFIC_CLIENT_OPTIONS=y + +# +# Intel SoC Common coreboot stages and non-IP blocks +# +CONFIG_SOC_INTEL_COMMON_BASECODE=y +CONFIG_SOC_INTEL_COMMON_RESET=y +CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y +CONFIG_PAVP=y +# CONFIG_MMA is not set +CONFIG_SOC_INTEL_COMMON_NHLT=y +# CONFIG_SOC_INTEL_DEBUG_CONSENT is not set + +# +# CPU +# +CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE=y +CONFIG_CPU_INTEL_COMMON=y +CONFIG_ENABLE_VMX=y +CONFIG_SET_IA32_FC_LOCK_BIT=y +CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_SMM=y +CONFIG_PARALLEL_MP=y +CONFIG_PARALLEL_MP_AP_WORK=y +CONFIG_XAPIC_ONLY=y +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +# CONFIG_X2APIC_LATE_WORKAROUND is not set +CONFIG_UDELAY_TSC=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_TSC_SYNC_MFENCE=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y +CONFIG_SSE=y +CONFIG_SSE2=y +CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y +CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y +CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS is not set +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER is not set +# CONFIG_CPU_MICROCODE_CBFS_NONE is not set + +# +# Northbridge +# + +# +# Southbridge +# +CONFIG_PCIEXP_HOTPLUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +# CONFIG_INTEL_CHIPSET_LOCKDOWN is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_EC_ACPI=y +CONFIG_EC_LENOVO_H8=y +CONFIG_H8_BEEP_ON_DEATH=y +CONFIG_H8_FLASH_LEDS_ON_DEATH=y +# CONFIG_H8_SUPPORT_BT_ON_WIFI is not set +# CONFIG_H8_FN_CTRL_SWAP is not set +CONFIG_H8_HAS_BAT_THRESHOLDS_IMPL=y +CONFIG_H8_HAS_PRIMARY_FN_KEYS=y +CONFIG_H8_HAS_LEDLOGO=y +CONFIG_EC_LENOVO_PMH7=y + +# +# Intel Firmware +# +CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_CHECK_ME is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +# CONFIG_USE_ME_CLEANER is not set +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +CONFIG_HAVE_GBE_BIN=y +# CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 +CONFIG_UDK_BASE=y +CONFIG_UDK_2017_BINDING=y +CONFIG_UDK_2013_VERSION=2013 +CONFIG_UDK_2017_VERSION=2017 +CONFIG_UDK_202005_VERSION=202005 +CONFIG_UDK_202111_VERSION=202111 +CONFIG_UDK_202302_VERSION=202302 +CONFIG_UDK_202305_VERSION=202305 +CONFIG_UDK_VERSION=2017 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_HAVE_FSP_GOP=y +CONFIG_MAINBOARD_HAS_LIBGFXINIT=y +CONFIG_MAINBOARD_USE_LIBGFXINIT=y +# CONFIG_VGA_ROM_RUN is not set +# CONFIG_RUN_FSP_GOP is not set +# CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +# CONFIG_VGA_TEXT_FRAMEBUFFER is not set +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_NONE=y +# CONFIG_DEFAULT_SCREEN_ROTATION_90 is not set +# CONFIG_DEFAULT_SCREEN_ROTATION_180 is not set +# CONFIG_DEFAULT_SCREEN_ROTATION_270 is not set +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x10000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +# CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y +# CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set +CONFIG_PCIEXP_HOTPLUG_IO=0x800 +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +CONFIG_INTEL_GMA_HAVE_VBT=y +CONFIG_INTEL_GMA_ADD_VBT=y +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_EFI_VARIABLE_STORE is not set +# CONFIG_DRIVERS_EFI_FW_INFO is not set +# CONFIG_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=y +# CONFIG_DRIVERS_OPTION_CFR is not set +# CONFIG_SMMSTORE is not set +CONFIG_SPI_FLASH=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y +CONFIG_SPI_FLASH_SMM=y +# CONFIG_SPI_FLASH_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_DRIVERS_UART=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVERS_I2C_DESIGNWARE=y +# CONFIG_DRIVERS_I2C_MAX98396 is not set +CONFIG_FSP_USE_REPO=y +# CONFIG_DISPLAY_HOBS is not set +# CONFIG_DISPLAY_UPD_DATA is not set +# CONFIG_BMP_LOGO is not set +CONFIG_PLATFORM_USES_FSP2_0=y +CONFIG_PLATFORM_USES_FSP2_X86_32=y +CONFIG_HAVE_INTEL_FSP_REPO=y +CONFIG_ADD_FSP_BINARIES=y +CONFIG_FSP_S_CBFS="fsps.bin" +CONFIG_FSP_M_CBFS="fspm.bin" +CONFIG_FSP_FULL_FD=y +CONFIG_FSP_T_RESERVED_SIZE=0x0 +CONFIG_FSP_M_XIP=y +CONFIG_HAVE_FSP_LOGO_SUPPORT=y +CONFIG_FSP_COMPRESS_FSP_S_LZ4=y +CONFIG_SOC_INTEL_COMMON_FSP_RESET=y +CONFIG_USE_FSP_NOTIFY_PHASE_POST_PCI_ENUM=y +CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y +CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y +# CONFIG_DISPLAY_FSP_TIMESTAMPS is not set +# CONFIG_BUILDING_WITH_DEBUG_FSP is not set +CONFIG_INTEL_INT15=y +CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" +CONFIG_GFX_GMA=y +CONFIG_GFX_GMA_DYN_CPU=y +CONFIG_GFX_GMA_GENERATION="Skylake" +CONFIG_GFX_GMA_PCH="Sunrise_Point" +CONFIG_GFX_GMA_PANEL_2_PORT="Disabled" +CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +CONFIG_DRIVERS_MC146818=y +CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_SIL_3114 is not set +CONFIG_DRIVERS_USB_ACPI=y +CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_MTK_WIFI=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +# CONFIG_TPM1 is not set +CONFIG_TPM2=y +CONFIG_TPM=y +CONFIG_MAINBOARD_HAS_TPM2=y +# CONFIG_DEBUG_TPM is not set +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM2=y +# CONFIG_TPM_HASH_SHA1 is not set +CONFIG_TPM_HASH_SHA256=y +# CONFIG_TPM_HASH_SHA384 is not set +# CONFIG_TPM_HASH_SHA512 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# CONFIG_INTEL_TXT is not set +# CONFIG_STM is not set +# CONFIG_INTEL_CBNT_SUPPORT is not set +# CONFIG_BOOTMEDIA_LOCK_NONE is not set +CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +# CONFIG_BOOTMEDIA_SMM_BWP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_CUSTOM_MADT=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_ACPI_LPIT=y +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y +CONFIG_RTC=y + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_ACPI_S1_NOT_SUPPORTED=y +CONFIG_HAVE_ACPI_RESUME=y +CONFIG_RESUME_PATH_SAME_AS_BOOT=y +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_IOAPIC=y +CONFIG_ACPI_NHLT=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +# CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# +# CONFIG_DISPLAY_FSP_CALLS_AND_STATUS is not set +# CONFIG_DISPLAY_FSP_HEADER is not set +# CONFIG_VERIFY_HOBS is not set +# CONFIG_DISPLAY_FSP_VERSION_INFO is not set +CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y +# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +CONFIG_HAVE_DEBUG_GPIO=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_SPI_FLASH is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +CONFIG_HAVE_EM100_SUPPORT=y +# CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_RAMSTAGE_ADA=y +CONFIG_RAMSTAGE_LIBHWBASE=y +CONFIG_SPD_READ_BY_WORD=y +CONFIG_HWBASE_DYNAMIC_MMIO=y +CONFIG_HWBASE_DEFAULT_MMCONF=0xe0000000 +CONFIG_HWBASE_DIRECT_PCIDEV=y +CONFIG_DECOMPRESS_OFAST=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_GENERIC_GPIO_LIB=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-t520-maximized.config b/config/coreboot-t520-maximized.config index 0e8257484..a90978bd1 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.config @@ -21,8 +21,8 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y # CONFIG_INCLUDE_CONFIG_FILE is not set -# CONFIG_COLLECT_TIMESTAMPS is not set CONFIG_USE_BLOBS=y # CONFIG_USE_AMD_BLOBS is not set # CONFIG_USE_QC_BLOBS is not set @@ -65,6 +65,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -78,7 +79,9 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -96,7 +99,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -121,7 +123,6 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="t520" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -134,24 +135,28 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_VBOOT_SLOTS_RW_A=y CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_INTEL_WIFI=n CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx20/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx20/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx20/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T520" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -199,9 +204,12 @@ CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" CONFIG_BOARD_LENOVO_BASEBOARD_T520=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 # CONFIG_TPM_MEASURED_BOOT is not set @@ -246,27 +254,27 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -287,12 +295,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -335,7 +342,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -383,9 +389,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -394,6 +401,7 @@ CONFIG_BOOTBLOCK_SIMPLE=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -419,8 +427,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -440,11 +447,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -455,21 +457,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -486,9 +485,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -499,10 +501,11 @@ CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -530,6 +533,10 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -552,6 +559,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -571,9 +581,9 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set @@ -597,6 +607,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -612,13 +623,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -643,6 +653,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -656,13 +670,13 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y @@ -677,3 +691,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-t530-dgpu-maximized.config b/config/coreboot-t530-dgpu-maximized.config index cd2dfa2ca..85813cb21 100644 --- a/config/coreboot-t530-dgpu-maximized.config +++ b/config/coreboot-t530-dgpu-maximized.config @@ -22,6 +22,7 @@ CONFIG_USE_OPTION_TABLE=y CONFIG_STATIC_OPTION_TABLE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -67,6 +68,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -80,7 +82,9 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -98,7 +102,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -123,7 +126,6 @@ CONFIG_VGA_BIOS_DGPU_ID="10de,0def" CONFIG_VGA_BIOS_DGPU_FILE="@BLOB_DIR@/xx30/10de,0def.rom" CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="t530" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" CONFIG_VGA_BIOS=y @@ -136,24 +138,28 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_VGA_BIOS_FILE="@BLOB_DIR@/xx30/8086,0106.rom" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T530" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -201,10 +207,13 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_BOARD_LENOVO_BASEBOARD_T530=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PRE_GRAPHICS_DELAY_MS=0 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -249,29 +258,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set # CONFIG_VGA_BIOS_SECOND is not set CONFIG_S3_VGA_ROM_RUN=y CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -292,12 +301,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -340,7 +348,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -388,9 +395,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -400,6 +408,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -460,8 +469,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -482,11 +490,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -497,21 +500,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -528,17 +528,21 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set # CONFIG_DRIVERS_PS2_KEYBOARD is not set CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -567,8 +571,13 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -591,6 +600,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -610,9 +622,9 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set @@ -636,6 +648,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -651,13 +664,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -682,6 +694,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -695,13 +711,13 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_DECOMPRESS_OFAST=y @@ -711,3 +727,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 50e6d6a6d..b0b9f1666 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -6,25 +6,24 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set -# CONFIG_OPTION_BACKEND_NONE is not set -CONFIG_USE_OPTION_TABLE=y -CONFIG_STATIC_OPTION_TABLE=y +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y -# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_TIMESTAMPS_ON_CONSOLE=y CONFIG_USE_BLOBS=y # CONFIG_USE_AMD_BLOBS is not set # CONFIG_USE_QC_BLOBS is not set @@ -41,7 +40,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -59,31 +57,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -94,18 +102,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_MAINBOARD_FAMILY="ThinkPad T530" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T530" CONFIG_MAINBOARD_VERSION="1.0" @@ -121,39 +131,47 @@ CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="t530" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T530" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad T530" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -161,7 +179,11 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -181,6 +203,7 @@ CONFIG_BOARD_LENOVO_T530=y # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -195,17 +218,19 @@ CONFIG_BOARD_LENOVO_T530=y # CONFIG_BOARD_LENOVO_X230_EDP is not set # CONFIG_BOARD_LENOVO_X60 is not set CONFIG_VBOOT_SLOTS_RW_AB=y -CONFIG_DRIVER_LENOVO_SERIALS=y CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" CONFIG_BOARD_LENOVO_BASEBOARD_T530=y -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_12288=y @@ -220,6 +245,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -248,27 +274,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -289,12 +317,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -313,13 +341,18 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_MAX_DIMMS is not set # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set -CONFIG_RAMINIT_ENABLE_ECC=y +# CONFIG_RAMINIT_ENABLE_ECC is not set +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -337,7 +370,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -377,6 +409,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -384,10 +417,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -397,6 +431,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -417,25 +456,21 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 -CONFIG_PCI_ALLOW_BUS_MASTER=y -CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y -CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +# CONFIG_PCI_ALLOW_BUS_MASTER is not set # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -443,11 +478,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -458,21 +489,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -486,12 +516,16 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVER_LENOVO_SERIALS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -502,10 +536,11 @@ CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -527,15 +562,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -558,6 +599,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -577,18 +621,18 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=5 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y CONFIG_CONSOLE_USE_ANSI_ESCAPES=y -CONFIG_HWBASE_DEBUG_NULL=y +CONFIG_HWBASE_DEBUG_CB=y # end of Console CONFIG_HAVE_ACPI_RESUME=y @@ -603,6 +647,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -611,6 +656,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -618,13 +664,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -649,6 +693,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -656,19 +704,19 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set +# CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-talos-2.config b/config/coreboot-talos-2.config index 1788a4925..8896e9e1c 100644 --- a/config/coreboot-talos-2.config +++ b/config/coreboot-talos-2.config @@ -1,9 +1,387 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_ALLOW_EXPERIMENTAL_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +CONFIG_OPTION_BACKEND_NONE=y +CONFIG_COMPRESS_RAMSTAGE=y +CONFIG_COMPRESS_PRERAM_STAGES=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +# CONFIG_ASAN is not set +CONFIG_NO_STAGE_CACHE=y +# CONFIG_CBMEM_STAGE_CACHE is not set +# CONFIG_UPDATE_IMAGE is not set +# CONFIG_BOOTSPLASH_IMAGE is not set +# CONFIG_FW_CONFIG is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_ADLINK is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BAP is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +# CONFIG_VENDOR_ELMEX is not set +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GIZMOSPHERE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_JETWAY is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_LIPPERT is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set CONFIG_VENDOR_RAPTOR_CS=y +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SCALEWAY is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_UP is not set +CONFIG_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_PART_NUMBER="Talos II" +CONFIG_MAINBOARD_DIR="raptor-cs/talos-2" +CONFIG_DIMM_MAX=8 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="src/mainboard/$(CONFIG_MAINBOARD_DIR)/board.fmd" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Raptor CS" +CONFIG_CBFS_SIZE=0x00100000 +CONFIG_CONSOLE_SERIAL=y CONFIG_MAX_CPUS=2 +CONFIG_POST_DEVICE=y +CONFIG_UART_FOR_CONSOLE=0 +# CONFIG_VBOOT is not set +CONFIG_DEVICETREE="devicetree.cb" +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_DRAM_SIZE_MB=32768 +# CONFIG_CONSOLE_POST is not set +CONFIG_MEMLAYOUT_LD_FILE="src/mainboard/$(CONFIG_MAINBOARD_DIR)/memlayout.ld" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_DRIVER_TPM_I2C_BUS=0x02 CONFIG_DRIVER_TPM_I2C_ADDR=0x20 +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_BOARD_RAPTOR_CS_TALOS_2=y +# CONFIG_BOOTBLOCK_IN_SEEPROM is not set CONFIG_TALOS_2_INFINEON_TPM_1=y +CONFIG_HEAP_SIZE=0x200000 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_BOARD_ROMSIZE_KB_1024=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +CONFIG_COREBOOT_ROMSIZE_KB_1024=y +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=1024 +CONFIG_ROM_SIZE=0x00100000 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="" +CONFIG_STACK_SIZE=0x0 +CONFIG_CPU_IBM_POWER9=y +# CONFIG_SKIP_INITIAL_ECC_SCRUB is not set +CONFIG_VBT_DATA_SIZE_KB=8 +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +CONFIG_TTYS0_BASE=0x3f8 +CONFIG_TTYS0_LCS=3 CONFIG_UART_PCI_ADDR=0x0 +CONFIG_CBFS_CACHE_ALIGN=8 + +# +# CPU +# +CONFIG_CPU_POWER9=y + +# +# Northbridge +# + +# +# Southbridge +# +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# +CONFIG_SUPERIO_ASPEED_AST2400=y +CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM=y + +# +# Embedded Controllers +# +CONFIG_ARCH_PPC64=y +CONFIG_ARCH_BOOTBLOCK_PPC64=y +CONFIG_ARCH_VERSTAGE_PPC64=y +CONFIG_ARCH_ROMSTAGE_PPC64=y +CONFIG_ARCH_RAMSTAGE_PPC64=y +# end of Chipset + +# +# Devices +# +CONFIG_NO_GFX_INIT=y +# CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +CONFIG_RESOURCE_ALLOCATOR_V4=y +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +CONFIG_IPMI_BT=y +CONFIG_IPMI_BT_ROMSTAGE=y +CONFIG_BMC_BT_BASE=0xe4 +CONFIG_IPMI_BT_TIMEOUT_MS=5000 +CONFIG_TPM_INIT_RAMSTAGE=y +CONFIG_DRIVERS_UART=y +# CONFIG_VPD is not set +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_I2C_TPM=y +CONFIG_DRIVER_TIS_DEFAULT=y +# CONFIG_DRIVER_I2C_TPM_ACPI is not set +# CONFIG_DRIVER_TPM_DISPLAY_TIS_BYTES is not set +CONFIG_INTEL_GMA_OPREGION_2_0=y +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +# CONFIG_NO_TPM is not set +CONFIG_TPM1=y +CONFIG_TPM=y +CONFIG_MAINBOARD_HAS_TPM1=y +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set +CONFIG_TPM_MEASURED_BOOT=y +# CONFIG_TPM_LOG_CB is not set +# CONFIG_TPM_LOG_TPM1 is not set CONFIG_TPM_LOG_TPM2=y +CONFIG_TPM_HASH_SHA1=y +# CONFIG_TPM_HASH_SHA256 is not set +# CONFIG_TPM_HASH_SHA384 is not set +# CONFIG_TPM_HASH_SHA512 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +# end of Trusted Platform Module + +# +# Memory initialization +# +# end of Memory initialization + +CONFIG_BOOTMEDIA_LOCK_NONE=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_BOOT_DEVICE_NOT_SPI_FLASH=y + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y + +# +# I/O mapped, 8250-compatible +# + +# +# Serial port base address = 0x3f8 +# +# CONFIG_CONSOLE_SERIAL_921600 is not set +# CONFIG_CONSOLE_SERIAL_460800 is not set +# CONFIG_CONSOLE_SERIAL_230400 is not set +CONFIG_CONSOLE_SERIAL_115200=y +# CONFIG_CONSOLE_SERIAL_57600 is not set +# CONFIG_CONSOLE_SERIAL_38400 is not set +# CONFIG_CONSOLE_SERIAL_19200 is not set +# CONFIG_CONSOLE_SERIAL_9600 is not set +CONFIG_TTYS0_BAUD=115200 +CONFIG_CONSOLE_CBMEM=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +CONFIG_POST_DEVICE_NONE=y +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_HAVE_MONOTONIC_TIMER=y + +# +# System tables +# +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +# CONFIG_PAYLOAD_ELF is not set CONFIG_PAYLOAD_SKIBOOT=y +CONFIG_PAYLOAD_FILE="payloads/external/skiboot/build/skiboot.elf" +CONFIG_PAYLOAD_OPTIONS="" +CONFIG_SKIBOOT_GIT_REPO="https://github.com/Dasharo/skiboot.git" +CONFIG_SKIBOOT_REVISION="1b14dd0b695b6113805186faad9b2def1d1bfeca" +# CONFIG_COMPRESSED_PAYLOAD_NONE is not set +CONFIG_COMPRESSED_PAYLOAD_LZMA=y +# CONFIG_COMPRESSED_PAYLOAD_LZ4 is not set +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# + +# +# BLOB Debug Settings +# + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_FATAL_ASSERTS is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_RAM_SETUP=y +# CONFIG_DEBUG_RAM_SETUP is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# end of Debugging + +CONFIG_MISSING_BOARD_RESET=y +CONFIG_FLATTENED_DEVICE_TREE=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_NO_XIP_EARLY_STAGES=y +CONFIG_BOOTBLOCK_CUSTOM=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index d1535454f..3d0203766 100644 --- a/config/coreboot-w530-dgpu-K1000m-maximized.config +++ b/config/coreboot-w530-dgpu-K1000m-maximized.config @@ -22,6 +22,7 @@ CONFIG_USE_OPTION_TABLE=y CONFIG_STATIC_OPTION_TABLE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -67,6 +68,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -80,7 +82,9 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -98,7 +102,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -123,7 +126,6 @@ CONFIG_VGA_BIOS_DGPU_ID="10de,0ffc" CONFIG_VGA_BIOS_DGPU_FILE="@BLOB_DIR@/xx30/10de,0ffc.rom" CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="w530" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" CONFIG_VGA_BIOS=y @@ -136,24 +138,28 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_VGA_BIOS_FILE="@BLOB_DIR@/xx30/8086,0106.rom" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad W530" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -201,10 +207,13 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_BOARD_LENOVO_BASEBOARD_T530=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PRE_GRAPHICS_DELAY_MS=0 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -249,29 +258,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set # CONFIG_VGA_BIOS_SECOND is not set CONFIG_S3_VGA_ROM_RUN=y CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -292,12 +301,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -340,7 +348,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -388,9 +395,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -400,6 +408,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -460,8 +469,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -482,11 +490,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -497,21 +500,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -528,18 +528,22 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -568,8 +572,13 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -592,6 +601,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -611,9 +623,9 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set @@ -637,6 +649,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -652,13 +665,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -683,6 +695,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -696,13 +712,13 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_DECOMPRESS_OFAST=y @@ -712,3 +728,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-w530-dgpu-K2000m-maximized.config b/config/coreboot-w530-dgpu-K2000m-maximized.config index 22e79f7a9..8adc787fc 100644 --- a/config/coreboot-w530-dgpu-K2000m-maximized.config +++ b/config/coreboot-w530-dgpu-K2000m-maximized.config @@ -22,6 +22,7 @@ CONFIG_USE_OPTION_TABLE=y CONFIG_STATIC_OPTION_TABLE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -67,6 +68,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -80,7 +82,9 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -98,7 +102,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -123,7 +126,6 @@ CONFIG_VGA_BIOS_DGPU_ID="10de,0ffb" CONFIG_VGA_BIOS_DGPU_FILE="@BLOB_DIR@/xx30/10de,0ffb.rom" CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="w530" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" CONFIG_VGA_BIOS=y @@ -136,24 +138,28 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_VGA_BIOS_FILE="@BLOB_DIR@/xx30/8086,0106.rom" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad W530" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -201,10 +207,13 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_BOARD_LENOVO_BASEBOARD_T530=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PRE_GRAPHICS_DELAY_MS=0 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -249,29 +258,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set # CONFIG_VGA_BIOS_SECOND is not set CONFIG_S3_VGA_ROM_RUN=y CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -292,12 +301,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -340,7 +348,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -388,9 +395,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -400,6 +408,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -460,8 +469,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -482,11 +490,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -497,21 +500,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -528,18 +528,22 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -568,8 +572,13 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -592,6 +601,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -611,9 +623,9 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set @@ -637,6 +649,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -652,13 +665,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -683,6 +695,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -696,13 +712,13 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_DECOMPRESS_OFAST=y @@ -712,3 +728,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 39aee49d6..29926b778 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -22,6 +21,7 @@ CONFIG_USE_OPTION_TABLE=y CONFIG_STATIC_OPTION_TABLE=y CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -41,7 +41,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -59,31 +58,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -94,18 +103,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_MAINBOARD_FAMILY="ThinkPad W530" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad W530" CONFIG_MAINBOARD_VERSION="1.0" @@ -121,39 +132,47 @@ CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="w530" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad W530" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad W530" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -161,7 +180,11 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -181,6 +204,7 @@ CONFIG_BOARD_LENOVO_W530=y # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -195,17 +219,19 @@ CONFIG_BOARD_LENOVO_W530=y # CONFIG_BOARD_LENOVO_X230_EDP is not set # CONFIG_BOARD_LENOVO_X60 is not set CONFIG_VBOOT_SLOTS_RW_AB=y -CONFIG_DRIVER_LENOVO_SERIALS=y CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" CONFIG_BOARD_LENOVO_BASEBOARD_T530=y -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_12288=y @@ -220,6 +246,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -248,27 +275,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -289,12 +318,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -314,12 +343,17 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -337,7 +371,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -377,6 +410,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -384,10 +418,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -397,6 +432,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -417,13 +457,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -434,8 +474,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -443,11 +481,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -458,21 +492,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -486,12 +519,16 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVER_LENOVO_SERIALS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -502,11 +539,12 @@ CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -528,15 +566,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -559,6 +603,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -578,18 +625,18 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=5 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y CONFIG_CONSOLE_USE_ANSI_ESCAPES=y -CONFIG_HWBASE_DEBUG_NULL=y +CONFIG_HWBASE_DEBUG_CB=y # end of Console CONFIG_HAVE_ACPI_RESUME=y @@ -604,6 +651,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -612,6 +660,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -619,13 +668,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -650,6 +697,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -657,19 +708,19 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set +# CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 675b54fb5..d9b307a33 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,10 +20,13 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_ROMSTAGE=y @@ -39,7 +41,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -57,31 +58,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -92,18 +103,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_MAINBOARD_FAMILY="ThinkPad W541" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad W541" CONFIG_MAINBOARD_VERSION="1.0" @@ -114,50 +127,62 @@ CONFIG_DIMM_SPD_SIZE=256 CONFIG_FMDFILE="" CONFIG_NO_POST=y CONFIG_MAINBOARD_VENDOR="LENOVO" -CONFIG_CBFS_SIZE=0x800000 +CONFIG_CBFS_SIZE=0xBE4FFF CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 # CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="w541" CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad W541" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xff7c0000 CONFIG_DCACHE_RAM_SIZE=0x10000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x2000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/w541/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/w541/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/w541/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 # CONFIG_ENABLE_DDR_2X_REFRESH is not set CONFIG_PCIEXP_AER=y -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad W541" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set CONFIG_BOARD_LENOVO_THINKPAD_W541=y # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -177,6 +202,7 @@ CONFIG_BOARD_LENOVO_THINKPAD_W541=y # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -196,11 +222,15 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN004A" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="DP3" -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_12288=y @@ -215,6 +245,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -244,12 +275,12 @@ CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xe8000000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 @@ -258,16 +289,17 @@ CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_HAVE_MRC=y CONFIG_MRC_FILE="@BLOB_DIR@/haswell/mrc.bin" CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x30000 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_DISABLE_ME_PCI=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -281,7 +313,6 @@ CONFIG_SET_MSR_AESNI_LOCK_BIT=y CONFIG_CPU_INTEL_COMMON_TIMEBASE=y CONFIG_CPU_INTEL_COMMON_VOLTAGE=y CONFIG_CPU_INTEL_COMMON_SMM=y -CONFIG_MICROCODE_UPDATE_PRE_RAM=y CONFIG_PARALLEL_MP=y CONFIG_XAPIC_ONLY=y # CONFIG_X2APIC_ONLY is not set @@ -290,12 +321,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -310,12 +340,12 @@ CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y # CONFIG_NORTHBRIDGE_INTEL_HASWELL=y # CONFIG_USE_NATIVE_RAMINIT is not set +# CONFIG_USE_BROADWELL_MRC is not set CONFIG_HASWELL_HIDE_PEG_FROM_MRC=y # # Southbridge # -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_PCIEXP_HOTPLUG is not set CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y CONFIG_SOUTHBRIDGE_INTEL_LYNXPOINT=y @@ -332,7 +362,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI_ICH9=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -358,6 +387,7 @@ CONFIG_H8_FLASH_LEDS_ON_DEATH=y # CONFIG_H8_FN_CTRL_SWAP is not set CONFIG_H8_HAS_BAT_THRESHOLDS_IMPL=y CONFIG_H8_HAS_PRIMARY_FN_KEYS=y +CONFIG_H8_HAS_LEDLOGO=y CONFIG_EC_LENOVO_PMH7=y # @@ -373,6 +403,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -380,8 +411,10 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -391,6 +424,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -411,13 +449,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -425,8 +463,6 @@ CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -434,11 +470,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -449,6 +481,7 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y @@ -458,11 +491,10 @@ CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -479,11 +511,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_DDI=y -# CONFIG_INTEL_INT15 is not set CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Haswell" CONFIG_GFX_GMA_PCH="Lynx_Point" @@ -493,10 +526,11 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" # CONFIG_DRIVERS_PS2_KEYBOARD is not set CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -518,15 +552,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -550,6 +590,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -595,6 +638,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # System tables # CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -603,6 +647,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -610,13 +655,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -641,6 +684,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -648,11 +695,9 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -660,6 +705,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index ab43ccf3d..6eaaa9ed4 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,10 +20,13 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -38,7 +40,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -56,31 +57,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -91,18 +102,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_FAMILY="ThinkPad X220" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X220" @@ -119,40 +132,48 @@ CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 # CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="x220" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X220" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_VBOOT_SLOTS_RW_A=y CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx20/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx20/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx20/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X220" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -160,7 +181,11 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -180,6 +205,7 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -193,16 +219,18 @@ CONFIG_BOARD_LENOVO_X220=y # CONFIG_BOARD_LENOVO_X230S is not set # CONFIG_BOARD_LENOVO_X230_EDP is not set # CONFIG_BOARD_LENOVO_X60 is not set -CONFIG_DRIVER_LENOVO_SERIALS=y CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="IBM0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_8192=y @@ -217,6 +245,7 @@ CONFIG_COREBOOT_ROMSIZE_KB_8192=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=8192 @@ -245,27 +274,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -286,12 +317,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -311,12 +342,17 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -334,7 +370,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -374,6 +409,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -381,10 +417,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -394,6 +431,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -414,13 +456,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -431,8 +473,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -440,11 +480,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -455,21 +491,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -483,12 +518,16 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVER_LENOVO_SERIALS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -498,11 +537,12 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -524,15 +564,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -555,6 +601,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -600,6 +649,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -608,6 +658,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -615,13 +666,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -646,6 +695,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -653,13 +706,11 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -667,6 +718,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-x220.config b/config/coreboot-x220.config index ab43ccf3d..42852d1c5 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.config @@ -21,10 +21,11 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -64,6 +65,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -77,7 +79,9 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -95,7 +99,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -121,7 +124,6 @@ CONFIG_MAX_CPUS=8 # CONFIG_ONBOARD_VGA_IS_PRIMARY is not set CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="x220" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -134,24 +136,28 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_VBOOT_SLOTS_RW_A=y CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_INTEL_WIFI=n CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx20/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx20/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx20/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X220" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -198,9 +204,12 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="IBM0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -245,27 +254,27 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -286,12 +295,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -334,7 +342,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -382,9 +389,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -394,6 +402,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -419,8 +428,7 @@ CONFIG_BOOTSPLASH=y CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -440,11 +448,6 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y CONFIG_USE_DDR3=y # end of Devices @@ -455,21 +458,18 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -486,9 +486,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -498,11 +501,12 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_DRIVERS_WIFI_GENERIC=n # end of Generic Drivers # @@ -531,8 +535,13 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -555,6 +564,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -600,6 +612,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -615,13 +628,12 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -646,6 +658,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -659,7 +675,6 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -667,6 +682,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y @@ -681,3 +697,5 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index a5ffd9eb1..742a62a11 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -21,10 +21,11 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y CONFIG_TIMESTAMPS_ON_CONSOLE=y -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -65,6 +66,7 @@ CONFIG_FW_CONFIG_SOURCE_CBFS=y # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -78,7 +80,9 @@ CONFIG_FW_CONFIG_SOURCE_CBFS=y # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -96,7 +100,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -122,7 +125,6 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="x230" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -135,13 +137,13 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 @@ -149,6 +151,10 @@ CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y # CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X230" # CONFIG_HAVE_IFD_BIN is not set CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -196,10 +202,12 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="" @@ -215,6 +223,7 @@ CONFIG_COREBOOT_ROMSIZE_KB_4096=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=4096 @@ -243,27 +252,28 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -284,12 +294,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -313,8 +322,8 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -332,7 +341,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -371,9 +379,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -383,6 +392,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -403,13 +413,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 # CONFIG_PCI_ALLOW_BUS_MASTER is not set @@ -418,8 +428,6 @@ CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -427,11 +435,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -442,21 +446,19 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -473,9 +475,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -485,10 +490,12 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -517,8 +524,14 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -538,6 +551,9 @@ CONFIG_BOOTMEDIA_LOCK_NONE=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -556,8 +572,8 @@ CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set @@ -565,7 +581,7 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y CONFIG_CONSOLE_USE_ANSI_ESCAPES=y CONFIG_HWBASE_DEBUG_CB=y @@ -583,6 +599,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -598,13 +615,13 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -629,6 +646,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -642,14 +663,12 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set -# CONFIG_DEBUG_RESOURCES is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set -# CONFIG_DEBUG_FUNC is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index 76b49c6eb..b9bbb1852 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -21,10 +21,11 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y CONFIG_TIMESTAMPS_ON_CONSOLE=y -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -65,6 +66,7 @@ CONFIG_FW_CONFIG_SOURCE_CBFS=y # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set @@ -78,7 +80,9 @@ CONFIG_FW_CONFIG_SOURCE_CBFS=y # CONFIG_VENDOR_GOOGLE is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set @@ -96,7 +100,6 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set @@ -122,7 +125,6 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="x230" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -135,13 +137,13 @@ CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 @@ -149,6 +151,10 @@ CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y # CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X230" # CONFIG_HAVE_IFD_BIN is not set CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -196,10 +202,12 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -215,6 +223,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -243,27 +252,28 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -284,12 +294,11 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -313,8 +322,8 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -332,7 +341,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -371,9 +379,10 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -383,6 +392,7 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set # end of Chipset # @@ -403,13 +413,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 # CONFIG_PCI_ALLOW_BUS_MASTER is not set @@ -418,8 +428,6 @@ CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -427,11 +435,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -442,21 +446,19 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -473,9 +475,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -485,10 +490,12 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -517,8 +524,14 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -539,6 +552,9 @@ CONFIG_BOOTMEDIA_LOCK_NONE=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -584,6 +600,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -599,13 +616,13 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -630,6 +647,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -643,12 +664,12 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 251d206ee..7c2453e77 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,10 +20,13 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y CONFIG_TIMESTAMPS_ON_CONSOLE=y -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -38,7 +40,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -56,31 +57,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -91,18 +102,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_FAMILY="ThinkPad X230" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" @@ -119,28 +132,33 @@ CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="x230" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/x230_edp/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X230" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 @@ -151,7 +169,10 @@ CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X230" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -159,7 +180,11 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -179,6 +204,7 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -193,16 +219,19 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 CONFIG_BOARD_LENOVO_X230_EDP=y # CONFIG_BOARD_LENOVO_X60 is not set CONFIG_VBOOT_SLOTS_RW_AB=y -CONFIG_DRIVER_LENOVO_SERIALS=y CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_12288=y @@ -217,6 +246,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -245,27 +275,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -286,12 +318,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -311,12 +343,17 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -334,7 +371,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -374,6 +410,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -381,10 +418,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -394,6 +432,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -414,13 +457,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -431,8 +474,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -440,11 +481,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -455,21 +492,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -483,12 +519,15 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVER_LENOVO_SERIALS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -498,10 +537,12 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -523,15 +564,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -554,6 +601,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -599,6 +649,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -607,6 +658,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -614,13 +666,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -645,6 +695,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -652,13 +706,11 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -666,6 +718,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index ae2cd583e..ea9f5c9a1 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,10 +20,13 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y CONFIG_TIMESTAMPS_ON_CONSOLE=y -# CONFIG_USE_BLOBS is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -38,7 +40,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -56,31 +57,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set # CONFIG_VENDOR_HP is not set # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -91,18 +102,20 @@ CONFIG_VENDOR_LENOVO=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_FAMILY="ThinkPad X230" CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" @@ -119,28 +132,33 @@ CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=1600 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=2560 CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="x230" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X230" CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 @@ -151,7 +169,10 @@ CONFIG_IFD_BIN_PATH="@BLOB_DIR@/xx30/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/xx30/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="ThinkPad X230" +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -159,7 +180,11 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set # CONFIG_BOARD_LENOVO_THINKPAD_W541 is not set # CONFIG_BOARD_LENOVO_L520 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M900_TINY is not set +# CONFIG_BOARD_LENOVO_M920Q is not set # CONFIG_BOARD_LENOVO_S230U is not set +# CONFIG_BOARD_LENOVO_T480 is not set +# CONFIG_BOARD_LENOVO_T480S is not set # CONFIG_BOARD_LENOVO_T400 is not set # CONFIG_BOARD_LENOVO_T500 is not set # CONFIG_BOARD_LENOVO_R400 is not set @@ -179,6 +204,7 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 # CONFIG_BOARD_LENOVO_Z61T is not set # CONFIG_BOARD_LENOVO_R60 is not set # CONFIG_BOARD_LENOVO_THINKCENTRE_A58 is not set +# CONFIG_BOARD_LENOVO_THINKCENTRE_M710S is not set # CONFIG_BOARD_LENOVO_X131E is not set # CONFIG_BOARD_LENOVO_X1_CARBON_GEN1 is not set # CONFIG_BOARD_LENOVO_X200 is not set @@ -193,16 +219,18 @@ CONFIG_BOARD_LENOVO_X230=y # CONFIG_BOARD_LENOVO_X230_EDP is not set # CONFIG_BOARD_LENOVO_X60 is not set CONFIG_VBOOT_SLOTS_RW_AB=y -CONFIG_DRIVER_LENOVO_SERIALS=y CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_12288=y @@ -217,6 +245,7 @@ CONFIG_BOARD_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set CONFIG_COREBOOT_ROMSIZE_KB_12288=y # CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=12288 @@ -245,27 +274,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -286,12 +317,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -311,12 +342,17 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set # CONFIG_RAMINIT_ENABLE_ECC is not set +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_C216=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -334,7 +370,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -374,6 +409,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -381,10 +417,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -394,6 +431,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -414,13 +456,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 # CONFIG_PCI_ALLOW_BUS_MASTER is not set @@ -429,8 +471,6 @@ CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -438,11 +478,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -453,21 +489,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_NO_UART_ON_SUPERIO=y @@ -481,12 +516,16 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVER_LENOVO_SERIALS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA=y CONFIG_GFX_GMA_PANEL_1_ON_LVDS=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -496,10 +535,12 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_DAC" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 CONFIG_DRIVERS_RICOH_RCE822=y # CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -521,15 +562,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -# CONFIG_TPM_RDRESP_NEED_DELAY is not set -CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -552,6 +599,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -597,6 +647,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # CONFIG_GENERATE_SMBIOS_TABLES=y CONFIG_SMBIOS_PROVIDED_BY_MOBO=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -605,6 +656,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -612,13 +664,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -643,6 +693,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -650,13 +704,11 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # General Debug Settings # -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set @@ -664,6 +716,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 0b14b62a7..c21ed9e22 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -6,14 +6,13 @@ # # General setup # -CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set +# CONFIG_LTO is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set @@ -21,6 +20,7 @@ CONFIG_OPTION_BACKEND_NONE=y # CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y CONFIG_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -40,7 +40,6 @@ CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set -# CONFIG_FW_CONFIG is not set # # Software Bill Of Materials (SBOM) @@ -58,31 +57,41 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # # CONFIG_VENDOR_51NB is not set # CONFIG_VENDOR_ACER is not set -# CONFIG_VENDOR_ADLINK is not set # CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOOSTAR is not set # CONFIG_VENDOR_AOPEN is not set # CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ARM is not set # CONFIG_VENDOR_ASROCK is not set # CONFIG_VENDOR_ASUS is not set # CONFIG_VENDOR_BIOSTAR is not set # CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set # CONFIG_VENDOR_CAVIUM is not set # CONFIG_VENDOR_CLEVO is not set # CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_CWWK is not set # CONFIG_VENDOR_DELL is not set # CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_ERYING is not set # CONFIG_VENDOR_EXAMPLE is not set # CONFIG_VENDOR_FACEBOOK is not set # CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_FRAMEWORK is not set # CONFIG_VENDOR_GETAC is not set # CONFIG_VENDOR_GIGABYTE is not set # CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HARDKERNEL is not set CONFIG_VENDOR_HP=y # CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set # CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set # CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LATTEPANDA is not set # CONFIG_VENDOR_LENOVO is not set # CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MITAC_COMPUTING is not set # CONFIG_VENDOR_MSI is not set # CONFIG_VENDOR_OCP is not set # CONFIG_VENDOR_OPENCELLULAR is not set @@ -93,21 +102,23 @@ CONFIG_VENDOR_HP=y # CONFIG_VENDOR_PRODRIVE is not set # CONFIG_VENDOR_PROTECTLI is not set # CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAPTOR_CS is not set # CONFIG_VENDOR_RAZER is not set # CONFIG_VENDOR_RODA is not set # CONFIG_VENDOR_SAMSUNG is not set # CONFIG_VENDOR_SAPPHIRE is not set -# CONFIG_VENDOR_SCALEWAY is not set # CONFIG_VENDOR_SIEMENS is not set # CONFIG_VENDOR_SIFIVE is not set # CONFIG_VENDOR_STARLABS is not set # CONFIG_VENDOR_SUPERMICRO is not set # CONFIG_VENDOR_SYSTEM76 is not set # CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_TOPTON is not set # CONFIG_VENDOR_UP is not set +# CONFIG_VENDOR_VIA is not set CONFIG_MAINBOARD_PART_NUMBER="HP Z220 CMT Workstation" CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="hp/z220_series" +CONFIG_MAINBOARD_DIR="hp/snb_ivb_desktops" CONFIG_VGA_BIOS_ID="8086,0106" CONFIG_DIMM_MAX=4 CONFIG_DIMM_SPD_SIZE=256 @@ -115,64 +126,78 @@ CONFIG_FMDFILE="" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="HP" CONFIG_CBFS_SIZE=0xFE4FFF -CONFIG_CONSOLE_SERIAL=y +# CONFIG_CONSOLE_SERIAL is not set CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_POST_DEVICE=y CONFIG_POST_IO=y -CONFIG_UART_FOR_CONSOLE=0 -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VBOOT_VBNV_OFFSET=0x2a CONFIG_VARIANT_DIR="z220_cmt_workstation" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set # CONFIG_VGA_BIOS is not set +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Hewlett-Packard" CONFIG_DRAM_RESET_GATE_GPIO=60 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=64 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_FATAL_ASSERTS is not set +CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(CONFIG_VARIANT_DIR)/data.vbt" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Hewlett-Packard Z220 CMT Workstation" +# CONFIG_CONSOLE_POST is not set CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -# CONFIG_CONSOLE_POST is not set CONFIG_TPM_PIRQ=0x0 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfefe0000 CONFIG_DCACHE_RAM_SIZE=0x20000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 CONFIG_DCACHE_BSP_STACK_SIZE=0x10000 -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_IFD_BIN_PATH="@BLOB_DIR@/z220/ifd.bin" CONFIG_ME_BIN_PATH="@BLOB_DIR@/z220/me.bin" CONFIG_GBE_BIN_PATH="@BLOB_DIR@/xx30/gbe.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_PCIEXP_DEFAULT_MAX_RESIZABLE_BAR_BITS=63 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_STMICRO=y # CONFIG_BOARD_HP_280_G2 is not set -# CONFIG_BOARD_HP_COMPAQ_8200_ELITE_SFF_PC is not set +# CONFIG_BOARD_HP_ELITEBOOK_820_G2 is not set # CONFIG_BOARD_HP_FOLIO_9480M is not set +# CONFIG_BOARD_HP_PRO_3500_SERIES is not set +# CONFIG_BOARD_HP_COMPAQ_8200_ELITE_SFF_PC is not set +# CONFIG_BOARD_HP_COMPAQ_8200_ELITE_USDT is not set +# CONFIG_BOARD_HP_COMPAQ_8300_ELITE_SFF is not set +# CONFIG_BOARD_HP_COMPAQ_ELITE_8300_USDT is not set +CONFIG_BOARD_HP_Z220_CMT_WORKSTATION=y +# CONFIG_BOARD_HP_Z220_SFF_WORKSTATION is not set +# CONFIG_BOARD_HP_2170P is not set # CONFIG_BOARD_HP_2560P is not set # CONFIG_BOARD_HP_2570P is not set # CONFIG_BOARD_HP_2760P is not set # CONFIG_BOARD_HP_8460P is not set # CONFIG_BOARD_HP_8470P is not set +# CONFIG_BOARD_HP_8560W is not set # CONFIG_BOARD_HP_8770W is not set # CONFIG_BOARD_HP_FOLIO_9470M is not set # CONFIG_BOARD_HP_PROBOOK_6360B is not set # CONFIG_BOARD_HP_REVOLVE_810_G1 is not set -CONFIG_BOARD_HP_Z220_CMT_WORKSTATION=y -# CONFIG_BOARD_HP_Z220_SFF_WORKSTATION is not set -CONFIG_BOARD_HP_Z220_SERIES_COMMON=y -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Hewlett-Packard Z220 CMT Workstation" +CONFIG_BOARD_HP_SNB_IVB_DESKTOPS_COMMON=y +# CONFIG_DEBUG_SMI is not set CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -180,12 +205,15 @@ CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -CONFIG_TTYS0_BAUD=115200 -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y CONFIG_DRIVERS_UART_8250IO=y -CONFIG_HEAP_SIZE=0x4000 +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x100000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EC_STARLABS_BATTERY_MODEL="Unknown" +CONFIG_EC_STARLABS_BATTERY_TYPE="LION" +CONFIG_EC_STARLABS_BATTERY_OEM="Unknown" CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="nohz=off quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y @@ -200,6 +228,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -226,29 +255,29 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_TSEG_SIZE=0x800000 CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_ACPI_CPU_STRING="\\_SB.CP%02X" +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 -CONFIG_CPU_SPECIFIC_OPTIONS=y CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_VBT_DATA_SIZE_KB=8 CONFIG_INTEL_GMA_BCLV_OFFSET=0x48254 CONFIG_INTEL_GMA_BCLV_WIDTH=16 CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 CONFIG_INTEL_GMA_BCLM_WIDTH=16 CONFIG_BOOTBLOCK_IN_CBFS=y CONFIG_DCACHE_RAM_MRC_VAR_SIZE=0x0 +CONFIG_HPET_MIN_TICKS=0x80 CONFIG_FIXED_MCHBAR_MMIO_BASE=0xfed10000 CONFIG_FIXED_DMIBAR_MMIO_BASE=0xfed18000 CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_TTYS0_BASE=0x3f8 -CONFIG_TTYS0_LCS=3 -CONFIG_HPET_MIN_TICKS=0x80 -CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 # # CPU @@ -269,12 +298,12 @@ CONFIG_XAPIC_ONLY=y CONFIG_UDELAY_TSC=y CONFIG_TSC_MONOTONIC_TIMER=y CONFIG_TSC_SYNC_MFENCE=y -CONFIG_LOGICAL_CPUS=y CONFIG_HAVE_SMI_HANDLER=y +CONFIG_NEED_SMALL_2MB_PAGE_TABLES=y CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y -CONFIG_MMX=y CONFIG_SSE=y CONFIG_SSE2=y CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y @@ -294,12 +323,17 @@ CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE=y # CONFIG_NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE is not set # CONFIG_RAMINIT_ALWAYS_ALLOW_DLL_OFF is not set CONFIG_RAMINIT_ENABLE_ECC=y +CONFIG_IGD_DEFAULT_UMA_SIZE_32MB=y +# CONFIG_IGD_DEFAULT_UMA_SIZE_64MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_96MB is not set +# CONFIG_IGD_DEFAULT_UMA_SIZE_128MB is not set +CONFIG_IGD_DEFAULT_UMA_INDEX=0 # # Southbridge # +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y CONFIG_SOUTHBRIDGE_INTEL_BD82X6X=y -CONFIG_SOUTH_BRIDGE_OPTIONS=y # CONFIG_HIDE_MEI_ON_ERROR is not set CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y @@ -317,7 +351,6 @@ CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_ACPI_MADT=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_FINALIZE=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -351,6 +384,7 @@ CONFIG_HAVE_GBE_BIN=y # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_ACPI_FNKEY_GEN_SCANCODE=0 CONFIG_ARCH_X86=y CONFIG_ARCH_BOOTBLOCK_X86_32=y CONFIG_ARCH_VERSTAGE_X86_32=y @@ -358,10 +392,11 @@ CONFIG_ARCH_ROMSTAGE_X86_32=y CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y -CONFIG_HAVE_EXP_X86_64_SUPPORT=y -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +CONFIG_HAVE_X86_64_SUPPORT=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_NUM_IPI_STARTS=2 +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -371,6 +406,11 @@ CONFIG_COLLECT_TIMESTAMPS_TSC=y CONFIG_HAVE_CF9_RESET=y CONFIG_DEBUG_HW_BREAKPOINTS=y CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +CONFIG_X86_BOOTBLOCK_EXTRA_PROGRAM_SZ=0 +CONFIG_DEFAULT_EBDA_LOWMEM=0x100000 +CONFIG_DEFAULT_EBDA_SEGMENT=0xF600 +CONFIG_DEFAULT_EBDA_SIZE=0x400 # end of Chipset # @@ -391,13 +431,13 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y CONFIG_ECAM_MMCONF_SUPPORT=y CONFIG_PCIX_PLUGIN_SUPPORT=y -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_AZALIA_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y CONFIG_ECAM_MMCONF_LENGTH=0x04000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -408,8 +448,6 @@ CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G=y # CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -417,11 +455,7 @@ CONFIG_INTEL_GMA_HAVE_VBT=y CONFIG_INTEL_GMA_ADD_VBT=y # CONFIG_SOFTWARE_I2C is not set CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set -CONFIG_NO_DDR5=y -CONFIG_NO_LPDDR4=y -CONFIG_NO_DDR4=y -CONFIG_NO_DDR2=y +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y CONFIG_USE_DDR3=y # end of Devices @@ -432,21 +466,20 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y # CONFIG_MRC_SETTINGS_PROTECT is not set -CONFIG_MRC_STASH_TO_CBMEM=y +# CONFIG_DRIVERS_OPTION_CFR is not set # CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y -CONFIG_BOOT_DEVICE_SPI_FLASH_NO_EARLY_WRITES=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_SPI_FLASH_ADESTO=y CONFIG_SPI_FLASH_AMIC=y CONFIG_SPI_FLASH_ATMEL=y CONFIG_SPI_FLASH_EON=y -CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_SST=y -CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_ISSI=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set CONFIG_DRIVERS_UART=y @@ -463,10 +496,12 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_DRIVERS_I2C_MAX98396 is not set CONFIG_INTEL_INT15=y CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" CONFIG_GFX_GMA_ANALOG_I2C_HDMI_B=y CONFIG_GFX_GMA=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -CONFIG_INTEL_GMA_OPREGION_2_0=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Ironlake" CONFIG_GFX_GMA_PCH="Cougar_Point" @@ -476,10 +511,11 @@ CONFIG_GFX_GMA_ANALOG_I2C_PORT="PCH_HDMI_B" CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_DRIVERS_MC146818=y CONFIG_USE_PC_CMOS_ALTCENTURY=y +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # @@ -501,15 +537,21 @@ CONFIG_VBOOT_LIB=y # # Trusted Platform Module # -# CONFIG_NO_TPM is not set CONFIG_TPM1=y +# CONFIG_TPM2 is not set CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_TPM_DEACTIVATE is not set # CONFIG_DEBUG_TPM is not set -CONFIG_TPM_RDRESP_NEED_DELAY=y CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set +# CONFIG_TPM_LOG_TPM2 is not set CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 +CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -532,6 +574,9 @@ CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y CONFIG_ACPI_HAVE_PCAT_8259=y CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -544,29 +589,14 @@ CONFIG_RTC=y CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y - -# -# I/O mapped, 8250-compatible -# - -# -# Serial port base address = 0x3f8 -# -# CONFIG_CONSOLE_SERIAL_921600 is not set -# CONFIG_CONSOLE_SERIAL_460800 is not set -# CONFIG_CONSOLE_SERIAL_230400 is not set -CONFIG_CONSOLE_SERIAL_115200=y -# CONFIG_CONSOLE_SERIAL_57600 is not set -# CONFIG_CONSOLE_SERIAL_38400 is not set -# CONFIG_CONSOLE_SERIAL_19200 is not set -# CONFIG_CONSOLE_SERIAL_9600 is not set # CONFIG_SPKMODEM is not set # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set @@ -574,7 +604,7 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y CONFIG_CONSOLE_USE_ANSI_ESCAPES=y # CONFIG_CMOS_POST is not set @@ -596,6 +626,7 @@ CONFIG_USE_WATCHDOG_ON_BOOT=y # System tables # CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # end of System tables @@ -604,6 +635,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # # CONFIG_PAYLOAD_NONE is not set # CONFIG_PAYLOAD_ELF is not set +# CONFIG_PAYLOAD_FLAT_BINARY is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -611,13 +643,11 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # CONFIG_PAYLOAD_LINUXBOOT is not set # CONFIG_PAYLOAD_SEABIOS is not set # CONFIG_PAYLOAD_UBOOT is not set -# CONFIG_PAYLOAD_YABITS is not set # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -642,6 +672,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -650,23 +684,19 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # General Debug Settings # # CONFIG_GDB_STUB is not set -# CONFIG_FATAL_ASSERTS is not set # CONFIG_DEBUG_CBFS is not set CONFIG_HAVE_DEBUG_RAM_SETUP=y # CONFIG_DEBUG_RAM_SETUP is not set CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS is not set -# CONFIG_DEBUG_SMI is not set # CONFIG_DEBUG_MALLOC is not set -# CONFIG_DEBUG_RESOURCES is not set # CONFIG_DEBUG_CONSOLE_INIT is not set # CONFIG_DEBUG_SPI_FLASH is not set -# CONFIG_DEBUG_INTEL_ME is not set -# CONFIG_DEBUG_FUNC is not set # CONFIG_DEBUG_BOOT_STATE is not set # CONFIG_DEBUG_ADA_CODE is not set CONFIG_HAVE_EM100_SUPPORT=y # CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set # end of Debugging CONFIG_RAMSTAGE_ADA=y diff --git a/config/linux-c216.config b/config/linux-c216.config index 68383a4f8..63ac0b751 100644 --- a/config/linux-c216.config +++ b/config/linux-c216.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -62,6 +66,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -78,6 +83,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -89,11 +96,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -117,7 +139,6 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 @@ -134,12 +155,15 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -154,12 +178,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -167,7 +192,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -183,10 +207,8 @@ CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -199,17 +221,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -231,17 +242,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -252,12 +256,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -292,22 +294,23 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=64 +CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -319,7 +322,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -328,16 +330,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set -# CONFIG_X86_UMIP is not set +CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -355,22 +355,32 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -385,13 +395,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -419,9 +429,11 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -445,6 +457,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -474,56 +488,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_SMI is not set -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - -# -# EFI (Extensible Firmware Interface) Support -# -# CONFIG_EFI_VARS is not set -CONFIG_EFI_ESRT=y -CONFIG_EFI_RUNTIME_MAP=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -538,8 +511,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -551,8 +522,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -561,9 +535,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -574,6 +550,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -585,36 +562,65 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -623,6 +629,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -633,19 +641,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -659,6 +669,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -698,38 +710,71 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -741,6 +786,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -757,6 +803,7 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -775,10 +822,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -798,12 +843,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -818,8 +864,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -830,7 +876,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -841,7 +886,11 @@ CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set -# CONFIG_PCIEASPM is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y @@ -859,6 +908,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -896,6 +947,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -905,6 +957,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -915,6 +968,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -934,9 +988,54 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -954,21 +1053,17 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support @@ -976,44 +1071,31 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # # Misc devices # -# CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # # EEPROM support # -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set @@ -1023,29 +1105,30 @@ CONFIG_BLK_DEV_NVME=y # # end of Texas Instruments shared transport line discipline -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set +# +# Altera FPGA firmware download module (requires I2C) +# CONFIG_INTEL_MEI=m CONFIG_INTEL_MEI_ME=m CONFIG_INTEL_MEI_TXE=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1057,6 +1140,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1073,7 +1157,57 @@ CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports -# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=y +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_VMWARE_PVSCSI is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_ISCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support @@ -1091,6 +1225,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1141,6 +1276,7 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y +CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set @@ -1161,12 +1297,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1178,21 +1308,23 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1211,24 +1343,28 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1236,9 +1372,9 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -1246,6 +1382,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1253,6 +1390,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1262,27 +1400,71 @@ CONFIG_E1000E_HWTS=y # CONFIG_PPP is not set # CONFIG_SLIP is not set -# CONFIG_USB_NET_DRIVERS is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1299,20 +1481,8 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set @@ -1325,7 +1495,6 @@ CONFIG_MOUSE_PS2=y # CONFIG_MOUSE_PS2_BYD is not set # CONFIG_MOUSE_PS2_LOGIPS2PP is not set CONFIG_MOUSE_PS2_SYNAPTICS=y -# CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS is not set # CONFIG_MOUSE_PS2_CYPRESS is not set # CONFIG_MOUSE_PS2_LIFEBOOK is not set # CONFIG_MOUSE_PS2_TRACKPOINT is not set @@ -1336,10 +1505,7 @@ CONFIG_MOUSE_PS2_SYNAPTICS=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -# CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1377,7 +1543,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_LDISC_AUTOLOAD is not set +CONFIG_LDISC_AUTOLOAD=y # # Serial drivers @@ -1396,6 +1562,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1405,7 +1572,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set @@ -1419,13 +1585,11 @@ CONFIG_SERIAL_CORE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set -# CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=y @@ -1436,9 +1600,7 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1446,104 +1608,22 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_NSC is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_INFINEON is not set # CONFIG_TCG_CRB is not set # CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support # -CONFIG_I2C=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_COMPAT is not set -# CONFIG_I2C_CHARDEV is not set -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_SMBUS is not set - -# -# I2C Algorithms -# -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALGOPCA is not set -# end of I2C Algorithms - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_AMD_MP2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# ACPI drivers -# -# CONFIG_I2C_SCMI is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_MLXCPLD is not set -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -CONFIG_I2C_SLAVE=y -# CONFIG_I2C_SLAVE_EEPROM is not set -# CONFIG_I2C_SLAVE_TESTUNIT is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C is not set # end of I2C support # CONFIG_I3C is not set @@ -1556,6 +1636,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1570,22 +1651,12 @@ CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_GOLDFISH is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1605,6 +1676,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1615,6 +1687,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1626,94 +1701,46 @@ CONFIG_BCMA_POSSIBLE=y # # Multifunction device drivers # -# CONFIG_MFD_AS3711 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1790,12 +1817,6 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support # @@ -1806,6 +1827,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1831,7 +1853,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1858,6 +1879,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1866,9 +1889,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1881,11 +1906,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1895,6 +1924,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -1920,17 +1950,17 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID is not set -# end of I2C HID support - # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2017,7 +2047,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2053,9 +2083,6 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set @@ -2063,7 +2090,6 @@ CONFIG_USB_STORAGE=m # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_ISP1301 is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set @@ -2094,6 +2120,7 @@ CONFIG_MMC_CQHCI=m # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2122,46 +2149,14 @@ CONFIG_RTC_INTF_DEV=y # # I2C RTC drivers # -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # -CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers @@ -2190,16 +2185,18 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2216,21 +2213,66 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2254,7 +2296,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2288,11 +2334,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2303,11 +2344,21 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2318,7 +2369,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2327,7 +2377,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2343,7 +2392,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2363,16 +2419,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y # CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2382,11 +2438,12 @@ CONFIG_NVMEM=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2412,10 +2469,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2454,6 +2509,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2461,21 +2517,18 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2544,13 +2597,10 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITYFS is not set -# CONFIG_PAGE_TABLE_ISOLATION is not set -CONFIG_INTEL_TXT=y +CONFIG_SECURITYFS=y +# CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set @@ -2565,9 +2615,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2600,7 +2658,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2608,114 +2666,90 @@ CONFIG_CRYPTO_GLUE_HELPER_X86=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -# CONFIG_CRYPTO_AES is not set -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2726,13 +2760,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2740,19 +2780,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2768,7 +2836,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2777,9 +2844,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2800,6 +2884,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2817,6 +2902,7 @@ CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2838,7 +2924,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2850,6 +2935,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2860,19 +2946,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2891,22 +2984,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -2918,11 +3017,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -2936,16 +3040,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -2979,6 +3080,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -2991,6 +3093,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3002,36 +3105,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3040,8 +3147,8 @@ CONFIG_EARLY_PRINTK=y # CONFIG_DEBUG_TLBFLUSH is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_0X80 is not set +CONFIG_IO_DELAY_0XED=y # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set # CONFIG_CPA_DEBUG is not set @@ -3064,6 +3171,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-kgpe-d16_server-whiptail.config b/config/linux-kgpe-d16_server-whiptail.config index 99e9b2716..e3f763aaa 100644 --- a/config/linux-kgpe-d16_server-whiptail.config +++ b/config/linux-kgpe-d16_server-whiptail.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -80,6 +84,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -91,11 +97,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -119,12 +140,12 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +# CONFIG_PRINTK_INDEX is not set CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # @@ -136,6 +157,9 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set @@ -157,12 +181,13 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -170,7 +195,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -189,10 +213,8 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y @@ -206,17 +228,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -238,17 +249,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y @@ -258,12 +262,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -294,11 +296,13 @@ CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y # CONFIG_GART_IOMMU is not set +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=64 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_X86_LOCAL_APIC=y @@ -316,11 +320,12 @@ CONFIG_X86_MCE_THRESHOLD=y # # CONFIG_PERF_EVENTS_INTEL_RAPL is not set # CONFIG_PERF_EVENTS_AMD_POWER is not set +CONFIG_PERF_EVENTS_AMD_UNCORE=y +# CONFIG_PERF_EVENTS_AMD_BRS is not set # end of Performance monitoring # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -331,16 +336,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set # CONFIG_EFI is not set # CONFIG_HZ_100 is not set @@ -360,17 +363,23 @@ CONFIG_DYNAMIC_MEMORY_LAYOUT=y CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set CONFIG_LEGACY_VSYSCALL_XONLY=y # CONFIG_LEGACY_VSYSCALL_NONE is not set # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_UNRET_ENTRY=y +CONFIG_CPU_IBPB_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -385,13 +394,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -418,9 +427,10 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -446,6 +456,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CONFIG_X86_INTEL_PSTATE is not set # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -475,34 +487,15 @@ CONFIG_MMCONF_FAM10H=y # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -517,8 +510,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -530,8 +521,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -540,9 +534,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -553,6 +549,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -564,27 +561,47 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y @@ -594,7 +611,15 @@ CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -604,6 +629,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -614,17 +641,20 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -CONFIG_UNUSED_SYMBOLS=y +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set @@ -639,6 +669,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -678,38 +710,68 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set +# CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -721,6 +783,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -737,6 +800,7 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -755,10 +819,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -778,12 +840,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -798,8 +861,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -810,7 +873,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -845,6 +907,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -882,6 +946,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -891,6 +956,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -901,6 +967,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -920,9 +987,37 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -940,27 +1035,28 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -983,9 +1079,9 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # @@ -1014,21 +1110,21 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y CONFIG_RAID_ATTRS=y +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1040,6 +1136,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1074,7 +1171,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set @@ -1085,8 +1181,8 @@ CONFIG_SCSI_MPT3SAS=y CONFIG_SCSI_MPT2SAS_MAX_SGE=128 CONFIG_SCSI_MPT3SAS_MAX_SGE=128 # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set @@ -1095,7 +1191,6 @@ CONFIG_SCSI_MPT3SAS_MAX_SGE=128 # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set @@ -1128,6 +1223,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1198,12 +1294,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1217,23 +1307,26 @@ CONFIG_NET_VENDOR_ALACRITECH=y CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -CONFIG_NET_VENDOR_AURORA=y -# CONFIG_AURORA_NB8800 is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_CX_ECAT is not set +CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +CONFIG_NET_VENDOR_ENGLEDER=y +# CONFIG_TSNEP is not set # CONFIG_NET_VENDOR_EZCHIP is not set +CONFIG_NET_VENDOR_FUNGIBLE=y +# CONFIG_FUN_ETH is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HUAWEI=y @@ -1254,22 +1347,26 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +CONFIG_NET_VENDOR_WANGXUN=y +# CONFIG_NGBE is not set +# CONFIG_TXGBE is not set # CONFIG_JME is not set +CONFIG_NET_VENDOR_LITEX=y # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_LAN743X is not set CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set -# CONFIG_VXGE is not set # CONFIG_NET_VENDOR_NETRONOME is not set -CONFIG_NET_VENDOR_NI=y -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set @@ -1279,6 +1376,7 @@ CONFIG_NET_VENDOR_PACKET_ENGINES=y CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_IONIC is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1286,11 +1384,11 @@ CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_NET_VENDOR_STMICRO is not set @@ -1298,15 +1396,18 @@ CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1318,26 +1419,28 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_SLIP is not set # CONFIG_USB_NET_DRIVERS is not set # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1371,6 +1474,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1428,6 +1532,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1452,7 +1557,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 @@ -1469,9 +1573,7 @@ CONFIG_HW_RANDOM_AMD=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1479,6 +1581,8 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set @@ -1490,10 +1594,10 @@ CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1570,6 +1674,8 @@ CONFIG_I2C_ALGOBIT=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1578,6 +1684,7 @@ CONFIG_I2C_ALGOBIT=y # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1599,6 +1706,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1612,12 +1720,14 @@ CONFIG_I2C_SLAVE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1625,10 +1735,14 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1656,6 +1770,8 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1688,6 +1804,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set @@ -1702,19 +1819,21 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set @@ -1728,7 +1847,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1740,34 +1858,37 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set CONFIG_DRM=y -# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set +CONFIG_DRM_USE_DYNAMIC_DEBUG=y CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set -# CONFIG_DRM_DP_CEC is not set CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_DMA_PAGE_POOL=y CONFIG_DRM_VRAM_HELPER=y CONFIG_DRM_TTM_HELPER=y @@ -1797,7 +1918,7 @@ CONFIG_DRM_TTM_HELPER=y CONFIG_DRM_AST=y # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_QXL is not set -# CONFIG_DRM_BOCHS is not set +# CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y # @@ -1815,11 +1936,16 @@ CONFIG_DRM_PANEL_BRIDGE=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_SIMPLEDRM is not set # CONFIG_DRM_VBOXVIDEO is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_DRM_NOMODESET=y # # Frame buffer Devices @@ -1828,7 +1954,6 @@ CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_BOOT_VESA_SUPPORT=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y @@ -1912,6 +2037,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1937,7 +2063,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1964,6 +2089,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1972,9 +2099,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1987,11 +2116,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -2001,6 +2134,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -2029,7 +2163,7 @@ CONFIG_USB_HID=m # # I2C HID support # -# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_ACPI is not set # end of I2C HID support # @@ -2037,6 +2171,12 @@ CONFIG_USB_HID=m # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2123,7 +2263,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2176,6 +2316,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2244,6 +2385,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2272,6 +2414,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2279,10 +2422,11 @@ CONFIG_RTC_DRV_CMOS=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2302,13 +2446,67 @@ CONFIG_VHOST_MENU=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_AMD_HSMP is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_THINKPAD_ACPI is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set @@ -2317,6 +2515,7 @@ CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2337,9 +2536,12 @@ CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # +CONFIG_IOMMU_IO_PGTABLE=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y CONFIG_AMD_IOMMU=y @@ -2371,11 +2573,6 @@ CONFIG_AMD_IOMMU_V2=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2386,11 +2583,21 @@ CONFIG_AMD_IOMMU_V2=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2401,7 +2608,6 @@ CONFIG_AMD_IOMMU_V2=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2410,7 +2616,6 @@ CONFIG_AMD_IOMMU_V2=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2426,7 +2631,14 @@ CONFIG_AMD_IOMMU_V2=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2446,16 +2658,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2466,11 +2678,12 @@ CONFIG_NVMEM_SYSFS=y # CONFIG_FPGA is not set # CONFIG_TEE is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2496,10 +2709,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2538,6 +2749,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2545,18 +2757,15 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -2628,11 +2837,8 @@ CONFIG_IO_WQ=y # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITYFS=y -CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y @@ -2646,9 +2852,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2680,6 +2894,8 @@ CONFIG_CRYPTO_NULL2=y CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_SIMD=y +# end of Crypto core or helper # # Public-key cryptography @@ -2687,114 +2903,90 @@ CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_AES_NI_INTEL is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2805,13 +2997,19 @@ CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2819,19 +3017,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2847,7 +3073,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2856,9 +3081,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2873,6 +3115,7 @@ CONFIG_LIBCRC32C=y CONFIG_CRC8=m CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y @@ -2881,6 +3124,7 @@ CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2898,7 +3142,9 @@ CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2918,8 +3164,8 @@ CONFIG_MEMREGION=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y +CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2931,6 +3177,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2941,25 +3188,31 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y +CONFIG_AS_HAS_NON_CONST_LEB128=y +# CONFIG_DEBUG_INFO_NONE is not set +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +CONFIG_DEBUG_INFO_DWARF4=y +# CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set -CONFIG_DEBUG_INFO_DWARF4=y -# CONFIG_DEBUG_INFO_BTF is not set CONFIG_GDB_SCRIPTS=y -# CONFIG_ENABLE_MUST_CHECK is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2981,15 +3234,23 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y @@ -2997,7 +3258,7 @@ CONFIG_ARCH_HAS_DEBUG_WX=y CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set +# CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -3009,11 +3270,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -3027,16 +3293,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -3070,6 +3333,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3082,6 +3346,7 @@ CONFIG_STACKTRACE=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3093,36 +3358,40 @@ CONFIG_STACKTRACE=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3142,7 +3411,6 @@ CONFIG_IO_DELAY_0XED=y # CONFIG_PUNIT_ATOM_DEBUG is not set CONFIG_UNWINDER_ORC=y # CONFIG_UNWINDER_FRAME_POINTER is not set -# CONFIG_UNWINDER_GUESS is not set # end of x86 Debugging # @@ -3156,26 +3424,28 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_SORT is not set +# CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set +# CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set +# CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set @@ -3185,14 +3455,22 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set +# CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_STACKINIT is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set # CONFIG_TEST_FPU is not set +# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-kgpe-d16_server.config b/config/linux-kgpe-d16_server.config index 99e9b2716..e3f763aaa 100644 --- a/config/linux-kgpe-d16_server.config +++ b/config/linux-kgpe-d16_server.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -80,6 +84,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -91,11 +97,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -119,12 +140,12 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +# CONFIG_PRINTK_INDEX is not set CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # @@ -136,6 +157,9 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set @@ -157,12 +181,13 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -170,7 +195,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -189,10 +213,8 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y @@ -206,17 +228,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -238,17 +249,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y @@ -258,12 +262,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -294,11 +296,13 @@ CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y # CONFIG_GART_IOMMU is not set +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=64 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_X86_LOCAL_APIC=y @@ -316,11 +320,12 @@ CONFIG_X86_MCE_THRESHOLD=y # # CONFIG_PERF_EVENTS_INTEL_RAPL is not set # CONFIG_PERF_EVENTS_AMD_POWER is not set +CONFIG_PERF_EVENTS_AMD_UNCORE=y +# CONFIG_PERF_EVENTS_AMD_BRS is not set # end of Performance monitoring # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -331,16 +336,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set # CONFIG_EFI is not set # CONFIG_HZ_100 is not set @@ -360,17 +363,23 @@ CONFIG_DYNAMIC_MEMORY_LAYOUT=y CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set CONFIG_LEGACY_VSYSCALL_XONLY=y # CONFIG_LEGACY_VSYSCALL_NONE is not set # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_UNRET_ENTRY=y +CONFIG_CPU_IBPB_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -385,13 +394,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -418,9 +427,10 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -446,6 +456,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CONFIG_X86_INTEL_PSTATE is not set # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -475,34 +487,15 @@ CONFIG_MMCONF_FAM10H=y # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -517,8 +510,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -530,8 +521,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -540,9 +534,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -553,6 +549,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -564,27 +561,47 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y @@ -594,7 +611,15 @@ CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -604,6 +629,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -614,17 +641,20 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -CONFIG_UNUSED_SYMBOLS=y +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set @@ -639,6 +669,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -678,38 +710,68 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set +# CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -721,6 +783,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -737,6 +800,7 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -755,10 +819,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -778,12 +840,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -798,8 +861,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -810,7 +873,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -845,6 +907,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -882,6 +946,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -891,6 +956,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -901,6 +967,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -920,9 +987,37 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -940,27 +1035,28 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -983,9 +1079,9 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # @@ -1014,21 +1110,21 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y CONFIG_RAID_ATTRS=y +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1040,6 +1136,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1074,7 +1171,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set @@ -1085,8 +1181,8 @@ CONFIG_SCSI_MPT3SAS=y CONFIG_SCSI_MPT2SAS_MAX_SGE=128 CONFIG_SCSI_MPT3SAS_MAX_SGE=128 # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set @@ -1095,7 +1191,6 @@ CONFIG_SCSI_MPT3SAS_MAX_SGE=128 # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set @@ -1128,6 +1223,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1198,12 +1294,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1217,23 +1307,26 @@ CONFIG_NET_VENDOR_ALACRITECH=y CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -CONFIG_NET_VENDOR_AURORA=y -# CONFIG_AURORA_NB8800 is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_CX_ECAT is not set +CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +CONFIG_NET_VENDOR_ENGLEDER=y +# CONFIG_TSNEP is not set # CONFIG_NET_VENDOR_EZCHIP is not set +CONFIG_NET_VENDOR_FUNGIBLE=y +# CONFIG_FUN_ETH is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HUAWEI=y @@ -1254,22 +1347,26 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +CONFIG_NET_VENDOR_WANGXUN=y +# CONFIG_NGBE is not set +# CONFIG_TXGBE is not set # CONFIG_JME is not set +CONFIG_NET_VENDOR_LITEX=y # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_LAN743X is not set CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set -# CONFIG_VXGE is not set # CONFIG_NET_VENDOR_NETRONOME is not set -CONFIG_NET_VENDOR_NI=y -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set @@ -1279,6 +1376,7 @@ CONFIG_NET_VENDOR_PACKET_ENGINES=y CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_IONIC is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1286,11 +1384,11 @@ CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_NET_VENDOR_STMICRO is not set @@ -1298,15 +1396,18 @@ CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1318,26 +1419,28 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_SLIP is not set # CONFIG_USB_NET_DRIVERS is not set # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1371,6 +1474,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1428,6 +1532,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1452,7 +1557,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 @@ -1469,9 +1573,7 @@ CONFIG_HW_RANDOM_AMD=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1479,6 +1581,8 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set @@ -1490,10 +1594,10 @@ CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1570,6 +1674,8 @@ CONFIG_I2C_ALGOBIT=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1578,6 +1684,7 @@ CONFIG_I2C_ALGOBIT=y # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1599,6 +1706,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1612,12 +1720,14 @@ CONFIG_I2C_SLAVE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1625,10 +1735,14 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1656,6 +1770,8 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1688,6 +1804,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set @@ -1702,19 +1819,21 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set @@ -1728,7 +1847,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1740,34 +1858,37 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set CONFIG_DRM=y -# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set +CONFIG_DRM_USE_DYNAMIC_DEBUG=y CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set -# CONFIG_DRM_DP_CEC is not set CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_DMA_PAGE_POOL=y CONFIG_DRM_VRAM_HELPER=y CONFIG_DRM_TTM_HELPER=y @@ -1797,7 +1918,7 @@ CONFIG_DRM_TTM_HELPER=y CONFIG_DRM_AST=y # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_QXL is not set -# CONFIG_DRM_BOCHS is not set +# CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y # @@ -1815,11 +1936,16 @@ CONFIG_DRM_PANEL_BRIDGE=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_SIMPLEDRM is not set # CONFIG_DRM_VBOXVIDEO is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_DRM_NOMODESET=y # # Frame buffer Devices @@ -1828,7 +1954,6 @@ CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_BOOT_VESA_SUPPORT=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y @@ -1912,6 +2037,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1937,7 +2063,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1964,6 +2089,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1972,9 +2099,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1987,11 +2116,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -2001,6 +2134,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -2029,7 +2163,7 @@ CONFIG_USB_HID=m # # I2C HID support # -# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_ACPI is not set # end of I2C HID support # @@ -2037,6 +2171,12 @@ CONFIG_USB_HID=m # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2123,7 +2263,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2176,6 +2316,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2244,6 +2385,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2272,6 +2414,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2279,10 +2422,11 @@ CONFIG_RTC_DRV_CMOS=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2302,13 +2446,67 @@ CONFIG_VHOST_MENU=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_AMD_HSMP is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_THINKPAD_ACPI is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set @@ -2317,6 +2515,7 @@ CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2337,9 +2536,12 @@ CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # +CONFIG_IOMMU_IO_PGTABLE=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y CONFIG_AMD_IOMMU=y @@ -2371,11 +2573,6 @@ CONFIG_AMD_IOMMU_V2=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2386,11 +2583,21 @@ CONFIG_AMD_IOMMU_V2=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2401,7 +2608,6 @@ CONFIG_AMD_IOMMU_V2=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2410,7 +2616,6 @@ CONFIG_AMD_IOMMU_V2=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2426,7 +2631,14 @@ CONFIG_AMD_IOMMU_V2=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2446,16 +2658,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2466,11 +2678,12 @@ CONFIG_NVMEM_SYSFS=y # CONFIG_FPGA is not set # CONFIG_TEE is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2496,10 +2709,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2538,6 +2749,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2545,18 +2757,15 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -2628,11 +2837,8 @@ CONFIG_IO_WQ=y # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITYFS=y -CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y @@ -2646,9 +2852,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2680,6 +2894,8 @@ CONFIG_CRYPTO_NULL2=y CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_SIMD=y +# end of Crypto core or helper # # Public-key cryptography @@ -2687,114 +2903,90 @@ CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_AES_NI_INTEL is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2805,13 +2997,19 @@ CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2819,19 +3017,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2847,7 +3073,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2856,9 +3081,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2873,6 +3115,7 @@ CONFIG_LIBCRC32C=y CONFIG_CRC8=m CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y @@ -2881,6 +3124,7 @@ CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2898,7 +3142,9 @@ CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2918,8 +3164,8 @@ CONFIG_MEMREGION=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y +CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2931,6 +3177,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2941,25 +3188,31 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y +CONFIG_AS_HAS_NON_CONST_LEB128=y +# CONFIG_DEBUG_INFO_NONE is not set +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +CONFIG_DEBUG_INFO_DWARF4=y +# CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set -CONFIG_DEBUG_INFO_DWARF4=y -# CONFIG_DEBUG_INFO_BTF is not set CONFIG_GDB_SCRIPTS=y -# CONFIG_ENABLE_MUST_CHECK is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2981,15 +3234,23 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y @@ -2997,7 +3258,7 @@ CONFIG_ARCH_HAS_DEBUG_WX=y CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set +# CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -3009,11 +3270,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -3027,16 +3293,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -3070,6 +3333,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3082,6 +3346,7 @@ CONFIG_STACKTRACE=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3093,36 +3358,40 @@ CONFIG_STACKTRACE=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3142,7 +3411,6 @@ CONFIG_IO_DELAY_0XED=y # CONFIG_PUNIT_ATOM_DEBUG is not set CONFIG_UNWINDER_ORC=y # CONFIG_UNWINDER_FRAME_POINTER is not set -# CONFIG_UNWINDER_GUESS is not set # end of x86 Debugging # @@ -3156,26 +3424,28 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_SORT is not set +# CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set +# CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set +# CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set @@ -3185,14 +3455,22 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set +# CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_STACKINIT is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set # CONFIG_TEST_FPU is not set +# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-kgpe-d16_workstation.config b/config/linux-kgpe-d16_workstation.config index 3d6a8c4f9..8b8ae60b0 100644 --- a/config/linux-kgpe-d16_workstation.config +++ b/config/linux-kgpe-d16_workstation.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -80,6 +84,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -91,11 +97,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -119,12 +140,12 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +# CONFIG_PRINTK_INDEX is not set CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # @@ -136,6 +157,9 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set @@ -157,12 +181,13 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -170,7 +195,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -189,10 +213,8 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y @@ -206,17 +228,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -238,17 +249,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y @@ -258,12 +262,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -294,11 +296,13 @@ CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y # CONFIG_GART_IOMMU is not set +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=64 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_X86_LOCAL_APIC=y @@ -316,11 +320,12 @@ CONFIG_X86_MCE_THRESHOLD=y # # CONFIG_PERF_EVENTS_INTEL_RAPL is not set # CONFIG_PERF_EVENTS_AMD_POWER is not set +CONFIG_PERF_EVENTS_AMD_UNCORE=y +# CONFIG_PERF_EVENTS_AMD_BRS is not set # end of Performance monitoring # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -331,16 +336,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set # CONFIG_EFI is not set # CONFIG_HZ_100 is not set @@ -360,17 +363,23 @@ CONFIG_DYNAMIC_MEMORY_LAYOUT=y CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set CONFIG_LEGACY_VSYSCALL_XONLY=y # CONFIG_LEGACY_VSYSCALL_NONE is not set # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_UNRET_ENTRY=y +CONFIG_CPU_IBPB_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -385,6 +394,7 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set @@ -418,9 +428,10 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -446,6 +457,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CONFIG_X86_INTEL_PSTATE is not set # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -475,34 +488,15 @@ CONFIG_MMCONF_FAM10H=y # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -517,8 +511,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -530,8 +522,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -540,9 +535,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -553,6 +550,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -564,27 +562,47 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y @@ -594,7 +612,15 @@ CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -604,6 +630,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -614,17 +642,20 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -CONFIG_UNUSED_SYMBOLS=y +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set @@ -639,6 +670,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -678,38 +711,68 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set +# CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -721,6 +784,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -737,6 +801,7 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -755,10 +820,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -778,12 +841,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -798,8 +862,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -810,7 +874,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -845,6 +908,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -882,6 +947,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -891,6 +957,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -901,6 +968,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -920,9 +988,37 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -940,27 +1036,29 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +# CONFIG_NVME_VERBOSE_ERRORS is not set +CONFIG_NVME_HWMON=y # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -983,9 +1081,9 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # @@ -1014,21 +1112,21 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y CONFIG_RAID_ATTRS=y +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1040,6 +1138,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1074,7 +1173,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set @@ -1085,8 +1183,8 @@ CONFIG_SCSI_MPT3SAS=y CONFIG_SCSI_MPT2SAS_MAX_SGE=128 CONFIG_SCSI_MPT3SAS_MAX_SGE=128 # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set @@ -1095,7 +1193,6 @@ CONFIG_SCSI_MPT3SAS_MAX_SGE=128 # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set @@ -1128,6 +1225,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1198,12 +1296,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1217,23 +1309,26 @@ CONFIG_NET_VENDOR_ALACRITECH=y CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -CONFIG_NET_VENDOR_AURORA=y -# CONFIG_AURORA_NB8800 is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_CX_ECAT is not set +CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +CONFIG_NET_VENDOR_ENGLEDER=y +# CONFIG_TSNEP is not set # CONFIG_NET_VENDOR_EZCHIP is not set +CONFIG_NET_VENDOR_FUNGIBLE=y +# CONFIG_FUN_ETH is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HUAWEI=y @@ -1254,22 +1349,26 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +CONFIG_NET_VENDOR_WANGXUN=y +# CONFIG_NGBE is not set +# CONFIG_TXGBE is not set # CONFIG_JME is not set +CONFIG_NET_VENDOR_LITEX=y # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_LAN743X is not set CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set -# CONFIG_VXGE is not set # CONFIG_NET_VENDOR_NETRONOME is not set -CONFIG_NET_VENDOR_NI=y -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set @@ -1279,6 +1378,7 @@ CONFIG_NET_VENDOR_PACKET_ENGINES=y CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_IONIC is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1286,11 +1386,11 @@ CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_NET_VENDOR_STMICRO is not set @@ -1298,15 +1398,18 @@ CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_AXI_EMAC is not set # CONFIG_XILINX_LL_TEMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1318,26 +1421,28 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_SLIP is not set # CONFIG_USB_NET_DRIVERS is not set # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1371,6 +1476,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1428,6 +1534,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1452,7 +1559,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 @@ -1469,9 +1575,7 @@ CONFIG_HW_RANDOM_AMD=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1479,6 +1583,8 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set @@ -1490,10 +1596,10 @@ CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1570,6 +1676,8 @@ CONFIG_I2C_ALGOBIT=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1578,6 +1686,7 @@ CONFIG_I2C_ALGOBIT=y # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1599,6 +1708,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1613,12 +1723,14 @@ CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1626,10 +1738,14 @@ CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set @@ -1652,18 +1768,19 @@ CONFIG_HWMON=y # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AHT10 is not set +# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_K8TEMP is not set # CONFIG_SENSORS_K10TEMP is not set # CONFIG_SENSORS_FAM15H_POWER is not set -# CONFIG_SENSORS_AMD_ENERGY is not set # CONFIG_SENSORS_APPLESMC is not set # CONFIG_SENSORS_ASB100 is not set -# CONFIG_SENSORS_ASPEED is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set @@ -1693,11 +1810,14 @@ CONFIG_HWMON=y # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX31760 is not set +# CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set @@ -1706,6 +1826,7 @@ CONFIG_HWMON=y # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM73 is not set @@ -1724,20 +1845,26 @@ CONFIG_HWMON=y # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_NZXT_KRAKEN2 is not set +# CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set +# CONFIG_SENSORS_SBTSI is not set +# CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set @@ -1749,6 +1876,7 @@ CONFIG_HWMON=y # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set @@ -1757,6 +1885,7 @@ CONFIG_HWMON=y # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA_CPUTEMP is not set # CONFIG_SENSORS_VIA686A is not set @@ -1779,6 +1908,8 @@ CONFIG_HWMON=y # # CONFIG_SENSORS_ACPI_POWER is not set # CONFIG_SENSORS_ATK0110 is not set +# CONFIG_SENSORS_ASUS_WMI is not set +# CONFIG_SENSORS_ASUS_EC is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set # CONFIG_THERMAL_STATISTICS is not set @@ -1806,6 +1937,8 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1853,19 +1986,21 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set @@ -1879,7 +2014,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1891,37 +2025,45 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set CONFIG_DRM=y -# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set +CONFIG_DRM_USE_DYNAMIC_DEBUG=y CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +CONFIG_DRM_DISPLAY_HELPER=y +CONFIG_DRM_DISPLAY_DP_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_HELPER=y +# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_DMA_PAGE_POOL=y +CONFIG_DRM_BUDDY=y CONFIG_DRM_VRAM_HELPER=y CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VM=y CONFIG_DRM_SCHED=y # @@ -1944,7 +2086,6 @@ CONFIG_DRM_AMDGPU=y # CONFIG_DRM_AMDGPU_SI is not set # CONFIG_DRM_AMDGPU_CIK is not set # CONFIG_DRM_AMDGPU_USERPTR is not set -# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set # # ACP (Audio CoProcessor) Configuration @@ -1957,9 +2098,8 @@ CONFIG_DRM_AMDGPU=y # CONFIG_DRM_AMD_DC=y CONFIG_DRM_AMD_DC_DCN=y -# CONFIG_DRM_AMD_DC_DCN3_0 is not set # CONFIG_DRM_AMD_DC_HDCP is not set -# CONFIG_DRM_AMD_DC_SI is not set +# CONFIG_DRM_AMD_SECURE_DISPLAY is not set # end of Display Engine Configuration # CONFIG_HSA_AMD is not set @@ -1979,7 +2119,7 @@ CONFIG_DRM_NOUVEAU_BACKLIGHT=y CONFIG_DRM_AST=y # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_QXL is not set -# CONFIG_DRM_BOCHS is not set +# CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y # @@ -1997,9 +2137,13 @@ CONFIG_DRM_PANEL_BRIDGE=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_SIMPLEDRM is not set # CONFIG_DRM_VBOXVIDEO is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set CONFIG_DRM_LEGACY=y # CONFIG_DRM_TDFX is not set # CONFIG_DRM_R128 is not set @@ -2007,6 +2151,7 @@ CONFIG_DRM_LEGACY=y # CONFIG_DRM_VIA is not set # CONFIG_DRM_SAVAGE is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_DRM_NOMODESET=y # # Frame buffer Devices @@ -2015,7 +2160,6 @@ CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_BOOT_VESA_SUPPORT=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y @@ -2099,6 +2243,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -2124,7 +2269,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -2151,6 +2295,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -2159,9 +2305,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -2174,11 +2322,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -2188,6 +2340,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -2216,7 +2369,7 @@ CONFIG_USB_HID=m # # I2C HID support # -# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_ACPI is not set # end of I2C HID support # @@ -2224,6 +2377,12 @@ CONFIG_USB_HID=m # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2310,7 +2469,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2363,6 +2522,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2431,6 +2591,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2459,6 +2620,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2466,10 +2628,11 @@ CONFIG_RTC_DRV_CMOS=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2489,41 +2652,66 @@ CONFIG_VHOST_MENU=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ACPI_WMI=y -CONFIG_WMI_BMOF=y +# CONFIG_WMI_BMOF is not set # CONFIG_HUAWEI_WMI is not set -# CONFIG_INTEL_WMI_SBL_FW_UPDATE is not set -# CONFIG_INTEL_WMI_THUNDERBOLT is not set CONFIG_MXM_WMI=y # CONFIG_PEAQ_WMI is not set +# CONFIG_NVIDIA_WMI_EC_BACKLIGHT is not set # CONFIG_XIAOMI_WMI is not set +# CONFIG_GIGABYTE_WMI is not set +# CONFIG_YOGABOOK_WMI is not set # CONFIG_ACERHDF is not set # CONFIG_ACER_WIRELESS is not set # CONFIG_ACER_WMI is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_AMD_HSMP is not set +# CONFIG_ADV_SWBUTTON is not set # CONFIG_APPLE_GMUX is not set # CONFIG_ASUS_LAPTOP is not set # CONFIG_ASUS_WIRELESS is not set -# CONFIG_DCDBAS is not set -# CONFIG_DELL_SMBIOS is not set -# CONFIG_DELL_RBU is not set -# CONFIG_DELL_SMO8800 is not set -# CONFIG_DELL_WMI_AIO is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set # CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_GPD_POCKET_FAN is not set # CONFIG_HP_ACCEL is not set -# CONFIG_HP_WIRELESS is not set +# CONFIG_WIRELESS_HOTKEY is not set # CONFIG_HP_WMI is not set # CONFIG_IBM_RTL is not set # CONFIG_SENSORS_HDAPS is not set # CONFIG_THINKPAD_ACPI is not set +# CONFIG_THINKPAD_LMI is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# CONFIG_INTEL_WMI_SBL_FW_UPDATE is not set +# CONFIG_INTEL_WMI_THUNDERBOLT is not set + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + # CONFIG_INTEL_HID_EVENT is not set -# CONFIG_INTEL_MENLOW is not set # CONFIG_INTEL_VBTN is not set -# CONFIG_SURFACE_3_POWER_OPREGION is not set -# CONFIG_SURFACE_PRO3_BUTTON is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_VSEC is not set # CONFIG_MSI_WMI is not set # CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set @@ -2535,28 +2723,14 @@ CONFIG_MXM_WMI=y # CONFIG_PANASONIC_LAPTOP is not set # CONFIG_SYSTEM76_ACPI is not set # CONFIG_TOPSTAR_LAPTOP is not set -# CONFIG_I2C_MULTI_INSTANTIATE is not set # CONFIG_MLX_PLATFORM is not set # CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_RST is not set -# CONFIG_INTEL_SMARTCONNECT is not set - -# -# Intel Speed Select Technology interface support -# -# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set -# end of Intel Speed Select Technology interface support - -# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set -# CONFIG_INTEL_PMC_CORE is not set -# CONFIG_INTEL_PUNIT_IPC is not set # CONFIG_INTEL_SCU_PCI is not set # CONFIG_INTEL_SCU_PLATFORM is not set -CONFIG_PMC_ATOM=y -# CONFIG_CHROME_PLATFORMS is not set -# CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set @@ -2565,6 +2739,7 @@ CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2585,9 +2760,12 @@ CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # +CONFIG_IOMMU_IO_PGTABLE=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y CONFIG_AMD_IOMMU=y @@ -2619,11 +2797,6 @@ CONFIG_AMD_IOMMU_V2=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2634,11 +2807,21 @@ CONFIG_AMD_IOMMU_V2=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2649,7 +2832,6 @@ CONFIG_AMD_IOMMU_V2=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2658,7 +2840,6 @@ CONFIG_AMD_IOMMU_V2=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2674,7 +2855,14 @@ CONFIG_AMD_IOMMU_V2=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2694,16 +2882,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2714,11 +2902,12 @@ CONFIG_NVMEM_SYSFS=y # CONFIG_FPGA is not set # CONFIG_TEE is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2744,10 +2933,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2786,6 +2973,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2793,18 +2981,15 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -2876,11 +3061,8 @@ CONFIG_IO_WQ=y # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITYFS=y -CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y @@ -2894,9 +3076,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2928,6 +3118,8 @@ CONFIG_CRYPTO_NULL2=y CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_SIMD=y +# end of Crypto core or helper # # Public-key cryptography @@ -2935,114 +3127,90 @@ CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_AES_NI_INTEL is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -3053,13 +3221,19 @@ CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -3067,19 +3241,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -3095,7 +3297,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -3104,9 +3305,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -3121,6 +3339,7 @@ CONFIG_LIBCRC32C=y CONFIG_CRC8=m CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y @@ -3129,6 +3348,7 @@ CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -3146,7 +3366,9 @@ CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -3166,8 +3388,8 @@ CONFIG_MEMREGION=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y +CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -3179,6 +3401,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -3189,25 +3412,31 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y +CONFIG_AS_HAS_NON_CONST_LEB128=y +# CONFIG_DEBUG_INFO_NONE is not set +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +CONFIG_DEBUG_INFO_DWARF4=y +# CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set -CONFIG_DEBUG_INFO_DWARF4=y -# CONFIG_DEBUG_INFO_BTF is not set CONFIG_GDB_SCRIPTS=y -# CONFIG_ENABLE_MUST_CHECK is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -3229,15 +3458,23 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y @@ -3245,7 +3482,7 @@ CONFIG_ARCH_HAS_DEBUG_WX=y CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set +# CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -3257,11 +3494,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -3275,16 +3517,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -3318,6 +3557,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3330,6 +3570,7 @@ CONFIG_STACKTRACE=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3341,36 +3582,40 @@ CONFIG_STACKTRACE=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3390,7 +3635,6 @@ CONFIG_IO_DELAY_0XED=y # CONFIG_PUNIT_ATOM_DEBUG is not set CONFIG_UNWINDER_ORC=y # CONFIG_UNWINDER_FRAME_POINTER is not set -# CONFIG_UNWINDER_GUESS is not set # end of x86 Debugging # @@ -3404,26 +3648,28 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_SORT is not set +# CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set +# CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set +# CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set @@ -3433,14 +3679,22 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set +# CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_STACKINIT is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set # CONFIG_TEST_FPU is not set +# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-librem_common-6.1.8.config b/config/linux-librem_common-6.1.8.config index 1e482862c..b7b2d58ce 100644 --- a/config/linux-librem_common-6.1.8.config +++ b/config/linux-librem_common-6.1.8.config @@ -71,7 +71,6 @@ CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_CLOCKSOURCE_WATCHDOG=y @@ -111,13 +110,11 @@ CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # CONFIG_BPF_JIT is not set # end of BPF subsystem -CONFIG_PREEMPT_BUILD=y -# CONFIG_PREEMPT_NONE is not set -CONFIG_PREEMPT_VOLUNTARY=y +CONFIG_PREEMPT_NONE_BUILD=y +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set -CONFIG_PREEMPT_COUNT=y -CONFIG_PREEMPTION=y -CONFIG_PREEMPT_DYNAMIC=y +# CONFIG_PREEMPT_DYNAMIC is not set # CONFIG_SCHED_CORE is not set # @@ -126,18 +123,15 @@ CONFIG_PREEMPT_DYNAMIC=y CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set -# CONFIG_BSD_PROCESS_ACCT is not set -# CONFIG_TASKSTATS is not set # CONFIG_PSI is not set # end of CPU/Task time and stats accounting -CONFIG_CPU_ISOLATION=y +# CONFIG_CPU_ISOLATION is not set # # RCU Subsystem # CONFIG_TREE_RCU=y -CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y @@ -150,7 +144,6 @@ CONFIG_RCU_NEED_SEGCBLIST=y CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 -# CONFIG_PRINTK_INDEX is not set CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # @@ -167,7 +160,6 @@ CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set -# CONFIG_NAMESPACES is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set @@ -182,19 +174,19 @@ CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_XZ=y # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set -CONFIG_RD_ZSTD=y +# CONFIG_RD_ZSTD is not set CONFIG_INITRAMFS_COMPRESSION_XZ=y -# CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set -CONFIG_INITRAMFS_PRESERVE_MTIME=y +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y CONFIG_EXPERT=y -CONFIG_MULTIUSER=y +# CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set # CONFIG_SYSFS_SYSCALL is not set # CONFIG_FHANDLE is not set @@ -214,14 +206,10 @@ CONFIG_SHMEM=y CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y -CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set -CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y -CONFIG_KALLSYMS_BASE_RELATIVE=y +# CONFIG_KALLSYMS is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -# CONFIG_KCMP is not set -CONFIG_RSEQ=y -# CONFIG_DEBUG_RSEQ is not set +CONFIG_KCMP=y +# CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set @@ -262,7 +250,7 @@ CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y -CONFIG_PGTABLE_LEVELS=5 +CONFIG_PGTABLE_LEVELS=4 CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # @@ -270,23 +258,26 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y -CONFIG_X86_MPPARSE=y +# CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set # CONFIG_X86_AMD_PLATFORM_DEVICE is not set -# CONFIG_IOSF_MBI is not set +CONFIG_IOSF_MBI=y CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_HYPERVISOR_GUEST is not set # CONFIG_MK8 is not set # CONFIG_MPSC is not set -# CONFIG_MCORE2 is not set +CONFIG_MCORE2=y # CONFIG_MATOM is not set -CONFIG_GENERIC_CPU=y +# CONFIG_GENERIC_CPU is not set CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_P6_NOP=y CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y @@ -296,54 +287,46 @@ CONFIG_IA32_FEAT_CTL=y CONFIG_X86_VMX_FEATURE_NAMES=y CONFIG_PROCESSOR_SELECT=y CONFIG_CPU_SUP_INTEL=y -CONFIG_CPU_SUP_AMD=y -CONFIG_CPU_SUP_HYGON=y +# CONFIG_CPU_SUP_AMD is not set +# CONFIG_CPU_SUP_HYGON is not set # CONFIG_CPU_SUP_CENTAUR is not set -CONFIG_CPU_SUP_ZHAOXIN=y +# CONFIG_CPU_SUP_ZHAOXIN is not set CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y -# CONFIG_GART_IOMMU is not set CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=64 +CONFIG_NR_CPUS=32 CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y -# CONFIG_X86_MCE_AMD is not set CONFIG_X86_MCE_THRESHOLD=y -# CONFIG_X86_MCE_INJECT is not set # # Performance monitoring # -CONFIG_PERF_EVENTS_INTEL_UNCORE=y +# CONFIG_PERF_EVENTS_INTEL_UNCORE is not set # CONFIG_PERF_EVENTS_INTEL_RAPL is not set -CONFIG_PERF_EVENTS_INTEL_CSTATE=y -# CONFIG_PERF_EVENTS_AMD_POWER is not set -CONFIG_PERF_EVENTS_AMD_UNCORE=y -# CONFIG_PERF_EVENTS_AMD_BRS is not set +# CONFIG_PERF_EVENTS_INTEL_CSTATE is not set # end of Performance monitoring -CONFIG_X86_VSYSCALL_EMULATION=y +# CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set -CONFIG_X86_5LEVEL=y +# CONFIG_X86_5LEVEL is not set CONFIG_X86_DIRECT_GBPAGES=y -# CONFIG_X86_CPA_STATISTICS is not set -# CONFIG_AMD_MEM_ENCRYPT is not set # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y @@ -372,14 +355,18 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -CONFIG_LEGACY_VSYSCALL_XONLY=y -# CONFIG_LEGACY_VSYSCALL_NONE is not set +# CONFIG_LEGACY_VSYSCALL_XONLY is not set +CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set # CONFIG_STRICT_SIGALTSTACK_SIZE is not set @@ -390,7 +377,6 @@ CONFIG_CC_HAS_RETURN_THUNK=y CONFIG_SPECULATION_MITIGATIONS=y CONFIG_PAGE_TABLE_ISOLATION=y # CONFIG_RETPOLINE is not set -CONFIG_CPU_IBPB_ENTRY=y CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y @@ -434,7 +420,6 @@ CONFIG_ACPI_CONTAINER=y CONFIG_ACPI_HOTPLUG_IOAPIC=y # CONFIG_ACPI_SBS is not set # CONFIG_ACPI_HED is not set -# CONFIG_ACPI_CUSTOM_METHOD is not set # CONFIG_ACPI_BGRT is not set # CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set # CONFIG_ACPI_NFIT is not set @@ -455,10 +440,10 @@ CONFIG_X86_PM_TIMER=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y # CONFIG_CPU_FREQ_STAT is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set @@ -498,12 +483,10 @@ CONFIG_CPU_IDLE_GOV_MENU=y # Bus options (PCI etc.) # CONFIG_PCI_DIRECT=y -CONFIG_PCI_MMCONFIG=y -CONFIG_MMCONF_FAM10H=y +# CONFIG_PCI_MMCONFIG is not set # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -CONFIG_AMD_NB=y # end of Bus options (PCI etc.) # @@ -625,7 +608,6 @@ CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y -# CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y @@ -642,7 +624,6 @@ CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling # -# CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling @@ -665,7 +646,8 @@ CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" -# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_TRIM_UNUSED_KSYMS=y +CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y @@ -674,7 +656,6 @@ CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set # CONFIG_BLK_WBT is not set -CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -694,12 +675,15 @@ CONFIG_BLK_MQ_STACKING=y # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y -CONFIG_MQ_IOSCHED_KYBER=y +# CONFIG_MQ_IOSCHED_KYBER is not set # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers -CONFIG_ASN1=m -CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y +CONFIG_INLINE_READ_UNLOCK=y +CONFIG_INLINE_READ_UNLOCK_IRQ=y +CONFIG_INLINE_WRITE_UNLOCK=y +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y @@ -773,11 +757,14 @@ CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y -CONFIG_ZONE_DMA=y +# CONFIG_ZONE_DMA is not set CONFIG_ZONE_DMA32=y # CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_TEST is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set @@ -824,7 +811,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_IPV6 is not set # CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set -CONFIG_NET_PTP_CLASSIFY=y # CONFIG_NETWORK_PHY_TIMESTAMPING is not set # CONFIG_NETFILTER is not set # CONFIG_BPFILTER is not set @@ -909,12 +895,10 @@ CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set # CONFIG_PCI_STUB is not set -# CONFIG_PCI_PF_STUB is not set CONFIG_PCI_ATS=y CONFIG_PCI_LOCKLESS_CONFIG=y -CONFIG_PCI_IOV=y +# CONFIG_PCI_IOV is not set CONFIG_PCI_PRI=y CONFIG_PCI_PASID=y CONFIG_PCI_LABEL=y @@ -995,6 +979,8 @@ CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_MMIO=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set # end of Generic Driver Options # @@ -1023,7 +1009,7 @@ CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y # CONFIG_ISCSI_IBFT is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_SYSFB=y -# CONFIG_SYSFB_SIMPLEFB is not set +CONFIG_SYSFB_SIMPLEFB=y # CONFIG_GOOGLE_FIRMWARE is not set # @@ -1055,7 +1041,7 @@ CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_PNP=y -CONFIG_PNP_DEBUG_MESSAGES=y +# CONFIG_PNP_DEBUG_MESSAGES is not set # # Protocols @@ -1066,7 +1052,6 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set @@ -1109,7 +1094,7 @@ CONFIG_BLK_DEV_NVME=y # # EEPROM support # -CONFIG_EEPROM_93CX6=m +# CONFIG_EEPROM_93CX6 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set @@ -1122,9 +1107,9 @@ CONFIG_EEPROM_93CX6=m # # Altera FPGA firmware download module (requires I2C) # -CONFIG_INTEL_MEI=m -CONFIG_INTEL_MEI_ME=m -CONFIG_INTEL_MEI_TXE=m +# CONFIG_INTEL_MEI is not set +# CONFIG_INTEL_MEI_ME is not set +# CONFIG_INTEL_MEI_TXE is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set @@ -1228,7 +1213,7 @@ CONFIG_ISCSI_TCP=y CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_PATA_TIMINGS=y -CONFIG_ATA_VERBOSE_ERROR=y +# CONFIG_ATA_VERBOSE_ERROR is not set CONFIG_ATA_FORCE=y CONFIG_ATA_ACPI=y CONFIG_SATA_PMP=y @@ -1252,10 +1237,12 @@ CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=y # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=y +CONFIG_DM_PERSISTENT_DATA=y # CONFIG_DM_UNSTRIPED is not set CONFIG_DM_CRYPT=y -# CONFIG_DM_SNAPSHOT is not set -# CONFIG_DM_THIN_PROVISIONING is not set +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_THIN_PROVISIONING=y # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set @@ -1288,6 +1275,7 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y +CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set @@ -1312,39 +1300,32 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set -CONFIG_NET_VENDOR_ALACRITECH=y -# CONFIG_SLICOSS is not set +# CONFIG_NET_VENDOR_ALACRITECH is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set # CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set -CONFIG_NET_VENDOR_AQUANTIA=y -# CONFIG_AQTION is not set +# CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set -CONFIG_NET_VENDOR_ASIX=y +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -CONFIG_NET_VENDOR_CADENCE=y -# CONFIG_MACB is not set +# CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set -CONFIG_NET_VENDOR_CORTINA=y -CONFIG_NET_VENDOR_DAVICOM=y +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set -CONFIG_NET_VENDOR_ENGLEDER=y -# CONFIG_TSNEP is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set -CONFIG_NET_VENDOR_FUNGIBLE=y -# CONFIG_FUN_ETH is not set -CONFIG_NET_VENDOR_GOOGLE=y -# CONFIG_GVE is not set -CONFIG_NET_VENDOR_HUAWEI=y -# CONFIG_HINIC is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set +# CONFIG_NET_VENDOR_GOOGLE is not set +# CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set @@ -1361,34 +1342,26 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set -CONFIG_NET_VENDOR_WANGXUN=y -# CONFIG_NGBE is not set -# CONFIG_TXGBE is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set -CONFIG_NET_VENDOR_LITEX=y +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set -CONFIG_NET_VENDOR_MICROCHIP=y -# CONFIG_LAN743X is not set -CONFIG_NET_VENDOR_MICROSEMI=y -CONFIG_NET_VENDOR_MICROSOFT=y +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set -CONFIG_NET_VENDOR_NI=y -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set -CONFIG_NET_VENDOR_NETERION=y -# CONFIG_S2IO is not set +# CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set -CONFIG_NET_VENDOR_PACKET_ENGINES=y -# CONFIG_HAMACHI is not set -# CONFIG_YELLOWFIN is not set -CONFIG_NET_VENDOR_PENSANDO=y -# CONFIG_IONIC is not set +# CONFIG_NET_VENDOR_PACKET_ENGINES is not set +# CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set # CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set @@ -1400,24 +1373,18 @@ CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set -CONFIG_NET_VENDOR_SOLARFLARE=y -# CONFIG_SFC is not set -# CONFIG_SFC_FALCON is not set -# CONFIG_SFC_SIENA is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set -CONFIG_NET_VENDOR_SOCIONEXT=y +# CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set -CONFIG_NET_VENDOR_VERTEXCOM=y +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set -CONFIG_NET_VENDOR_XILINX=y -# CONFIG_XILINX_EMACLITE is not set -# CONFIG_XILINX_AXI_EMAC is not set -# CONFIG_XILINX_LL_TEMAC is not set +# CONFIG_NET_VENDOR_XILINX is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set @@ -1432,7 +1399,49 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_PPP is not set # CONFIG_SLIP is not set -# CONFIG_USB_NET_DRIVERS is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set # CONFIG_WAN is not set @@ -1444,7 +1453,6 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set -# CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set @@ -1533,7 +1541,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set -CONFIG_SERIAL_8250_PERICOM=y +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1562,11 +1570,11 @@ CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_TIMERIOMEM=m +# CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=y -CONFIG_HW_RANDOM_AMD=m +# CONFIG_HW_RANDOM_AMD is not set # CONFIG_HW_RANDOM_BA431 is not set -CONFIG_HW_RANDOM_VIA=m +# CONFIG_HW_RANDOM_VIA is not set # CONFIG_HW_RANDOM_XIPHERA is not set # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set @@ -1601,24 +1609,12 @@ CONFIG_RANDOM_TRUST_CPU=y # CONFIG_SPI is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set -CONFIG_PPS=y -# CONFIG_PPS_DEBUG is not set - -# -# PPS clients support -# -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_GPIO is not set - -# -# PPS generators support -# +# CONFIG_PPS is not set # # PTP clock support # -CONFIG_PTP_1588_CLOCK=y +# CONFIG_PTP_1588_CLOCK is not set CONFIG_PTP_1588_CLOCK_OPTIONAL=y # @@ -1756,7 +1752,7 @@ CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set -CONFIG_FB_VESA=y +# CONFIG_FB_VESA is not set CONFIG_FB_EFI=y # CONFIG_FB_N411 is not set # CONFIG_FB_HGA is not set @@ -1796,7 +1792,10 @@ CONFIG_FB_EFI=y # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set -# CONFIG_BACKLIGHT_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_APPLE is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_SAHARA is not set # end of Backlight & LCD device support # @@ -1808,7 +1807,7 @@ CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support @@ -2145,20 +2144,21 @@ CONFIG_RTC_DRV_CMOS=y # # DMABUF options # -# CONFIG_SYNC_FILE is not set +CONFIG_SYNC_FILE=y +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set -CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_PCI is not set -# CONFIG_VIRTIO_MMIO is not set +# CONFIG_VIRTIO_MENU is not set # CONFIG_VDPA is not set -CONFIG_VHOST_MENU=y -# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set +# CONFIG_VHOST_MENU is not set # # Microsoft Hyper-V guest support @@ -2170,19 +2170,19 @@ CONFIG_VHOST_MENU=y # CONFIG_STAGING is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set -CONFIG_SURFACE_PLATFORMS=y -# CONFIG_SURFACE_GPE is not set -# CONFIG_SURFACE_PRO3_BUTTON is not set +# CONFIG_SURFACE_PLATFORMS is not set CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_ACPI_WMI is not set # CONFIG_ACERHDF is not set # CONFIG_ACER_WIRELESS is not set # CONFIG_AMD_PMF is not set # CONFIG_AMD_PMC is not set -# CONFIG_AMD_HSMP is not set # CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set # CONFIG_ASUS_WIRELESS is not set # CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_GPD_POCKET_FAN is not set # CONFIG_HP_ACCEL is not set @@ -2209,10 +2209,12 @@ CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_INTEL_SMARTCONNECT is not set # CONFIG_INTEL_TURBO_MAX_3 is not set # CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_TOSHIBA_BT_RFKILL is not set # CONFIG_TOSHIBA_HAPS is not set # CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_INTEL_IPS is not set # CONFIG_INTEL_SCU_PCI is not set @@ -2247,7 +2249,6 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support -# CONFIG_IOMMU_DEBUGFS is not set # CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set @@ -2379,7 +2380,7 @@ CONFIG_LIBNVDIMM=y # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set # CONFIG_NVMEM_RMEM is not set # @@ -2390,7 +2391,6 @@ CONFIG_NVMEM_SYSFS=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_TEE is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set @@ -2470,7 +2470,7 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y @@ -2481,15 +2481,13 @@ CONFIG_SYSFS=y CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set CONFIG_NETWORK_FILESYSTEMS=y -# CONFIG_NFS_FS is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set -# CONFIG_SMB_SERVER is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y @@ -2552,7 +2550,6 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITY is not set CONFIG_SECURITYFS=y # CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y @@ -2601,14 +2598,12 @@ CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_AKCIPHER=m CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set @@ -2621,7 +2616,7 @@ CONFIG_CRYPTO_SIMD=y # # Public-key cryptography # -CONFIG_CRYPTO_RSA=m +# CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set # CONFIG_CRYPTO_ECDSA is not set @@ -2633,43 +2628,35 @@ CONFIG_CRYPTO_RSA=m # # Block ciphers # -CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_ANUBIS=m # CONFIG_CRYPTO_ARIA is not set -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_BLOWFISH_COMMON=m -CONFIG_CRYPTO_CAMELLIA=m -CONFIG_CRYPTO_CAST_COMMON=m -CONFIG_CRYPTO_CAST5=m -CONFIG_CRYPTO_CAST6=m +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_DES is not set -CONFIG_CRYPTO_FCRYPT=m -CONFIG_CRYPTO_KHAZAD=m -CONFIG_CRYPTO_SEED=m -CONFIG_CRYPTO_SERPENT=m +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set -CONFIG_CRYPTO_TEA=m -CONFIG_CRYPTO_TWOFISH=m -CONFIG_CRYPTO_TWOFISH_COMMON=m +# CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ARC4=m -CONFIG_CRYPTO_CHACHA20=m +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set -CONFIG_CRYPTO_CTR=m -CONFIG_CRYPTO_CTS=m +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set -CONFIG_CRYPTO_KEYWRAP=m -CONFIG_CRYPTO_LRW=y +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set -CONFIG_CRYPTO_PCBC=m +# CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # end of Length-preserving ciphers and modes @@ -2677,9 +2664,9 @@ CONFIG_CRYPTO_XTS=y # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set -CONFIG_CRYPTO_CHACHA20POLY1305=m -CONFIG_CRYPTO_CCM=m -CONFIG_CRYPTO_GCM=m +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # CONFIG_CRYPTO_ECHAINIV is not set CONFIG_CRYPTO_ESSIV=y @@ -2689,23 +2676,23 @@ CONFIG_CRYPTO_ESSIV=y # Hashes, digests, and MACs # # CONFIG_CRYPTO_BLAKE2B is not set -CONFIG_CRYPTO_CMAC=m -CONFIG_CRYPTO_GHASH=m +# CONFIG_CRYPTO_CMAC is not set +# CONFIG_CRYPTO_GHASH is not set CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_MD4=m +# CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MICHAEL_MIC=m -CONFIG_CRYPTO_POLY1305=m -CONFIG_CRYPTO_RMD160=m +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -CONFIG_CRYPTO_VMAC=m -CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_XCBC=m +# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_XXHASH is not set # end of Hashes, digests, and MACs @@ -2713,25 +2700,25 @@ CONFIG_CRYPTO_XCBC=m # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32=m -CONFIG_CRYPTO_CRCT10DIF=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # -CONFIG_CRYPTO_DEFLATE=m -CONFIG_CRYPTO_LZO=y -CONFIG_CRYPTO_842=m -CONFIG_CRYPTO_LZ4=m -CONFIG_CRYPTO_LZ4HC=m +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # -CONFIG_CRYPTO_ANSI_CPRNG=m +# CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set # end of Random number generation @@ -2744,7 +2731,7 @@ CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y -CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y +# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set # end of Userspace interface @@ -2755,37 +2742,36 @@ CONFIG_CRYPTO_HASH_INFO=y # # CONFIG_CRYPTO_CURVE25519_X86 is not set CONFIG_CRYPTO_AES_NI_INTEL=y -CONFIG_CRYPTO_BLOWFISH_X86_64=m -CONFIG_CRYPTO_CAMELLIA_X86_64=m -CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m -CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=m -CONFIG_CRYPTO_CAST5_AVX_X86_64=m -CONFIG_CRYPTO_CAST6_AVX_X86_64=m -CONFIG_CRYPTO_DES3_EDE_X86_64=m -CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m -CONFIG_CRYPTO_SERPENT_AVX_X86_64=m -CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set -CONFIG_CRYPTO_TWOFISH_X86_64=m -CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m -CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set # CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set -CONFIG_CRYPTO_CHACHA20_X86_64=m +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set # CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set # CONFIG_CRYPTO_BLAKE2S_X86 is not set # CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set -CONFIG_CRYPTO_POLY1305_X86_64=m +# CONFIG_CRYPTO_POLY1305_X86_64 is not set CONFIG_CRYPTO_SHA1_SSSE3=y CONFIG_CRYPTO_SHA256_SSSE3=y CONFIG_CRYPTO_SHA512_SSSE3=y # CONFIG_CRYPTO_SM3_AVX_X86_64 is not set -CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set CONFIG_CRYPTO_CRC32C_INTEL=y -CONFIG_CRYPTO_CRC32_PCLMUL=m -CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m +# CONFIG_CRYPTO_CRC32_PCLMUL is not set # end of Accelerated Cryptographic Algorithms for CPU (x86) # CONFIG_CRYPTO_HW is not set @@ -2803,7 +2789,7 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_CORDIC=m +# CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y @@ -2817,27 +2803,21 @@ CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m # CONFIG_CRYPTO_LIB_CHACHA is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_DES=m CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m # CONFIG_CRYPTO_LIB_POLY1305 is not set # CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines -CONFIG_CRC_CCITT=m +# CONFIG_CRC_CCITT is not set CONFIG_CRC16=y -CONFIG_CRC_T10DIF=y +# CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set -CONFIG_CRC_ITU_T=m +# CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y @@ -2846,34 +2826,21 @@ CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set -CONFIG_CRC7=m -CONFIG_LIBCRC32C=m -CONFIG_CRC8=m -CONFIG_XXHASH=y +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set # CONFIG_RANDOM32_SELFTEST is not set -CONFIG_842_COMPRESS=m -CONFIG_842_DECOMPRESS=m -CONFIG_ZLIB_INFLATE=m -CONFIG_ZLIB_DEFLATE=m -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_LZ4_COMPRESS=m -CONFIG_LZ4HC_COMPRESS=m -CONFIG_LZ4_DECOMPRESS=m -CONFIG_ZSTD_COMMON=y -CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y -CONFIG_XZ_DEC_POWERPC=y -CONFIG_XZ_DEC_IA64=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y -CONFIG_XZ_DEC_SPARC=y +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_IA64 is not set +# CONFIG_XZ_DEC_ARM is not set +# CONFIG_XZ_DEC_ARMTHUMB is not set +# CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y -CONFIG_XZ_DEC_TEST=m +# CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y -CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_DEC8=y @@ -2887,7 +2854,6 @@ CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set -# CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y @@ -2895,9 +2861,7 @@ CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y -CONFIG_CLZ_TAB=y -CONFIG_IRQ_POLL=y -CONFIG_MPILIB=m +# CONFIG_IRQ_POLL is not set CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y @@ -2929,28 +2893,23 @@ CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 CONFIG_BOOT_PRINTK_DELAY=y -CONFIG_DYNAMIC_DEBUG=y -CONFIG_DYNAMIC_DEBUG_CORE=y +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DYNAMIC_DEBUG_CORE is not set CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_MISC=y +# CONFIG_DEBUG_MISC is not set # # Compile-time checks and compiler options # -CONFIG_DEBUG_INFO=y CONFIG_AS_HAS_NON_CONST_LEB128=y -# CONFIG_DEBUG_INFO_NONE is not set +CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set -CONFIG_DEBUG_INFO_DWARF4=y +# CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set -# CONFIG_DEBUG_INFO_REDUCED is not set -# CONFIG_DEBUG_INFO_COMPRESSED is not set -# CONFIG_DEBUG_INFO_SPLIT is not set -CONFIG_GDB_SCRIPTS=y CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set @@ -2970,10 +2929,7 @@ CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_FS_ALLOW_ALL=y -# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set -# CONFIG_DEBUG_FS_ALLOW_NONE is not set +# CONFIG_DEBUG_FS is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y @@ -3002,9 +2958,7 @@ CONFIG_HAVE_ARCH_KCSAN=y CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y -# CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -3058,7 +3012,6 @@ CONFIG_WQ_WATCHDOG=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set -CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) @@ -3081,7 +3034,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set -CONFIG_STACKTRACE=y +# CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3151,7 +3104,6 @@ CONFIG_HAVE_MMIOTRACE_SUPPORT=y CONFIG_IO_DELAY_0XED=y # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set -# CONFIG_DEBUG_BOOT_PARAMS is not set # CONFIG_CPA_DEBUG is not set # CONFIG_DEBUG_ENTRY is not set # CONFIG_DEBUG_NMI_SELFTEST is not set @@ -3171,48 +3123,7 @@ CONFIG_UNWINDER_ORC=y CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set -CONFIG_RUNTIME_TESTING_MENU=y -# CONFIG_LKDTM is not set -# CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_DIV64 is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_TEST_REF_TRACKER is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_REED_SOLOMON_TEST is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_STRING_SELFTEST is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_SCANF is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_MAPLE_TREE is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_SIPHASH is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_BITOPS is not set -# CONFIG_TEST_VMALLOC is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_BPF is not set -# CONFIG_TEST_BLACKHOLE_DEV is not set -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_DYNAMIC_DEBUG is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_FREE_PAGES is not set -# CONFIG_TEST_FPU is not set -# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +# CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage diff --git a/config/linux-librem_common.config b/config/linux-librem_common.config index c201f9716..cdcb218b4 100644 --- a/config/linux-librem_common.config +++ b/config/linux-librem_common.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -62,6 +66,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -78,6 +83,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -89,11 +96,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -117,7 +139,6 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 @@ -134,6 +155,9 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set @@ -154,12 +178,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -167,7 +192,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -183,10 +207,8 @@ CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -199,17 +221,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -231,17 +242,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -252,12 +256,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -# CONFIG_RETPOLINE is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -292,11 +294,13 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y @@ -307,7 +311,6 @@ CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -319,7 +322,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -328,16 +330,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -354,27 +354,38 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options # # CONFIG_SUSPEND is not set +# CONFIG_HIBERNATION is not set # CONFIG_PM is not set # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUPPORTS_ACPI=y @@ -384,6 +395,7 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set @@ -417,9 +429,10 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -443,6 +456,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -472,34 +487,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -514,8 +510,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -527,8 +521,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -537,9 +534,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -550,6 +549,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -561,27 +561,47 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y @@ -590,7 +610,15 @@ CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -599,6 +627,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -609,19 +639,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -635,6 +667,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -674,39 +708,73 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SWAP=y +# CONFIG_ZSWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +CONFIG_COMPAT_BRK=y CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y CONFIG_VMAP_PFN=y +CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -718,6 +786,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -728,12 +797,13 @@ CONFIG_INET=y # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set -# CONFIG_SYN_COOKIES is not set +CONFIG_SYN_COOKIES=y # CONFIG_NET_IPVTI is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -752,10 +822,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -775,12 +843,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -795,8 +864,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -807,7 +876,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -840,6 +908,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -877,15 +947,18 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # +CONFIG_AUXILIARY_BUS=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -896,6 +969,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -915,9 +989,37 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -935,21 +1037,17 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support @@ -957,8 +1055,10 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -981,9 +1081,9 @@ CONFIG_BLK_DEV_NVME=y # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # @@ -1009,25 +1109,27 @@ CONFIG_BLK_DEV_NVME=y CONFIG_INTEL_MEI=m CONFIG_INTEL_MEI_ME=m CONFIG_INTEL_MEI_TXE=m +# CONFIG_INTEL_MEI_GSC is not set # CONFIG_INTEL_MEI_HDCP is not set +# CONFIG_INTEL_MEI_PXP is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1039,6 +1141,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1073,7 +1176,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set @@ -1082,8 +1184,8 @@ CONFIG_ISCSI_TCP=y # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set @@ -1092,7 +1194,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set @@ -1125,6 +1226,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1175,6 +1277,7 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y +CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set @@ -1195,12 +1298,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1212,21 +1309,23 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1245,24 +1344,28 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1270,9 +1373,9 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -1280,6 +1383,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1287,6 +1391,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1296,27 +1401,71 @@ CONFIG_E1000E_HWTS=y # CONFIG_PPP is not set # CONFIG_SLIP is not set -# CONFIG_USB_NET_DRIVERS is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1350,6 +1499,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1406,6 +1556,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1429,7 +1580,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 @@ -1446,16 +1596,16 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set CONFIG_TCG_TPM=y -CONFIG_HW_RANDOM_TPM=n +# CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set @@ -1467,10 +1617,10 @@ CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1547,6 +1697,8 @@ CONFIG_I2C_ALGOBIT=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1555,6 +1707,7 @@ CONFIG_I2C_ALGOBIT=y # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1576,6 +1729,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1589,12 +1743,14 @@ CONFIG_I2C_SLAVE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1602,10 +1758,14 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1625,6 +1785,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1635,6 +1796,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1667,6 +1831,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set @@ -1681,19 +1846,21 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set @@ -1707,7 +1874,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1719,36 +1885,45 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set CONFIG_INTEL_GTT=y -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set CONFIG_DRM=y CONFIG_DRM_MIPI_DSI=y -# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM=y # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +CONFIG_DRM_DISPLAY_HELPER=y +CONFIG_DRM_DISPLAY_DP_HELPER=y +CONFIG_DRM_DISPLAY_HDCP_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_HELPER=y +# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_DMA_PAGE_POOL=y +CONFIG_DRM_BUDDY=y CONFIG_DRM_VRAM_HELPER=y CONFIG_DRM_TTM_HELPER=y @@ -1774,7 +1949,6 @@ CONFIG_DRM_I915_FORCE_PROBE="" CONFIG_DRM_I915_CAPTURE_ERROR=y CONFIG_DRM_I915_COMPRESS_ERROR=y CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_GVT is not set # # drm/i915 Debugging @@ -1794,6 +1968,7 @@ CONFIG_DRM_I915_USERPTR=y # # drm/i915 Profile Guided Optimisation # +CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 CONFIG_DRM_I915_FENCE_TIMEOUT=10000 CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 @@ -1811,7 +1986,6 @@ CONFIG_DRM_I915_TIMESLICE_DURATION=1 CONFIG_DRM_AST=y # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_QXL is not set -# CONFIG_DRM_BOCHS is not set CONFIG_DRM_PANEL=y # @@ -1830,11 +2004,16 @@ CONFIG_DRM_PANEL_BRIDGE=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_SIMPLEDRM is not set # CONFIG_DRM_VBOXVIDEO is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_DRM_NOMODESET=y # # Frame buffer Devices @@ -1843,7 +2022,6 @@ CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_BOOT_VESA_SUPPORT=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y @@ -1927,6 +2105,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1952,7 +2131,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1979,6 +2157,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1987,9 +2167,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -2002,11 +2184,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -2016,6 +2202,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -2044,7 +2231,7 @@ CONFIG_USB_HID=m # # I2C HID support # -# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_ACPI is not set # end of I2C HID support # @@ -2052,6 +2239,12 @@ CONFIG_USB_HID=m # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2136,7 +2329,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2189,6 +2382,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2257,6 +2451,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2285,6 +2480,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2293,8 +2489,10 @@ CONFIG_RTC_DRV_CMOS=y CONFIG_SYNC_FILE=y # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2311,13 +2509,83 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +CONFIG_ACPI_WMI=y +# CONFIG_WMI_BMOF is not set +# CONFIG_HUAWEI_WMI is not set +# CONFIG_MXM_WMI is not set +# CONFIG_PEAQ_WMI is not set +# CONFIG_NVIDIA_WMI_EC_BACKLIGHT is not set +# CONFIG_XIAOMI_WMI is not set +# CONFIG_YOGABOOK_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_ACER_WMI is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_HP_WMI is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_THINKPAD_ACPI is not set +# CONFIG_THINKPAD_LMI is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# CONFIG_INTEL_WMI_SBL_FW_UPDATE is not set +# CONFIG_INTEL_WMI_THUNDERBOLT is not set + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_MSI_WMI is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_TOSHIBA_WMI is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_LG_LAPTOP is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set @@ -2326,6 +2594,7 @@ CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2349,7 +2618,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2383,11 +2656,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2398,11 +2666,21 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2413,7 +2691,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2422,7 +2699,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2438,7 +2714,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2458,16 +2741,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2477,11 +2760,12 @@ CONFIG_NVMEM_SYSFS=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2507,10 +2791,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2549,6 +2831,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2556,7 +2839,7 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y @@ -2567,6 +2850,7 @@ CONFIG_TMPFS=y # CONFIG_TMPFS_XATTR is not set # CONFIG_TMPFS_INODE64 is not set # CONFIG_HUGETLBFS is not set +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set @@ -2639,12 +2923,9 @@ CONFIG_IO_WQ=y # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITYFS=y -CONFIG_PAGE_TABLE_ISOLATION=y # CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y @@ -2658,9 +2939,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2693,7 +2982,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2701,114 +2990,90 @@ CONFIG_CRYPTO_GLUE_HELPER_X86=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -# CONFIG_CRYPTO_AES is not set -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2819,13 +3084,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2833,19 +3104,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2861,7 +3160,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2870,9 +3168,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2894,6 +3209,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2911,6 +3227,7 @@ CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2931,7 +3248,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2943,6 +3259,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2953,19 +3270,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2984,22 +3308,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -3011,11 +3341,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -3029,16 +3364,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -3072,6 +3404,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3084,6 +3417,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3095,36 +3429,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3156,6 +3494,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-linuxboot.config b/config/linux-linuxboot.config index 0ff8541bb..66e78f978 100644 --- a/config/linux-linuxboot.config +++ b/config/linux-linuxboot.config @@ -1,4 +1,4 @@ -CONFIG_LOCALVERSION="-heads" +CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_KERNEL_XZ=y CONFIG_DEFAULT_HOSTNAME="linuxboot" @@ -99,6 +99,7 @@ CONFIG_CGROUP_NET_CLASSID=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set # CONFIG_FIRMWARE_IN_KERNEL is not set # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -187,6 +188,7 @@ CONFIG_MLX4_EN=m # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set @@ -264,9 +266,9 @@ CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set -CONFIG_TMPFS=y +CONFIG_TMPFS=n CONFIG_HUGETLBFS=y CONFIG_EFIVAR_FS=y # CONFIG_MISC_FILESYSTEMS is not set diff --git a/config/linux-nitropad-x.config b/config/linux-novacustom-common.config similarity index 90% rename from config/linux-nitropad-x.config rename to config/linux-novacustom-common.config index 8592d579d..01bc65f65 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-novacustom-common.config @@ -2,14 +2,14 @@ # Automatically generated file; DO NOT EDIT. # Linux/x86 6.1.8 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" +CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 9.4.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=80300 +CONFIG_GCC_VERSION=90400 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23200 +CONFIG_AS_VERSION=23301 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23200 +CONFIG_LD_VERSION=23301 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -110,13 +110,11 @@ CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # CONFIG_BPF_JIT is not set # end of BPF subsystem -CONFIG_PREEMPT_BUILD=y -# CONFIG_PREEMPT_NONE is not set -CONFIG_PREEMPT_VOLUNTARY=y +CONFIG_PREEMPT_NONE_BUILD=y +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set -CONFIG_PREEMPT_COUNT=y -CONFIG_PREEMPTION=y -CONFIG_PREEMPT_DYNAMIC=y +# CONFIG_PREEMPT_DYNAMIC is not set # CONFIG_SCHED_CORE is not set # @@ -134,7 +132,6 @@ CONFIG_TICK_CPU_ACCOUNTING=y # RCU Subsystem # CONFIG_TREE_RCU=y -CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y @@ -166,7 +163,7 @@ CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -181,10 +178,11 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set -CONFIG_INITRAMFS_PRESERVE_MTIME=y +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y CONFIG_EXPERT=y @@ -196,7 +194,7 @@ CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y -# CONFIG_BASE_FULL is not set +CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y @@ -212,7 +210,7 @@ CONFIG_MEMBARRIER=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y # CONFIG_RSEQ is not set -CONFIG_EMBEDDED=y +# CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set @@ -260,7 +258,8 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y -CONFIG_X86_MPPARSE=y +CONFIG_X86_X2APIC=y +# CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set @@ -272,11 +271,14 @@ CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_HYPERVISOR_GUEST is not set # CONFIG_MK8 is not set # CONFIG_MPSC is not set -# CONFIG_MCORE2 is not set +CONFIG_MCORE2=y # CONFIG_MATOM is not set -CONFIG_GENERIC_CPU=y +# CONFIG_GENERIC_CPU is not set CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_P6_NOP=y CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y @@ -298,7 +300,7 @@ CONFIG_BOOT_VESA_SUPPORT=y CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=64 +CONFIG_NR_CPUS=32 CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y @@ -314,14 +316,16 @@ CONFIG_X86_MCE_THRESHOLD=y # # Performance monitoring # -CONFIG_PERF_EVENTS_INTEL_UNCORE=y +# CONFIG_PERF_EVENTS_INTEL_UNCORE is not set # CONFIG_PERF_EVENTS_INTEL_RAPL is not set -CONFIG_PERF_EVENTS_INTEL_CSTATE=y +# CONFIG_PERF_EVENTS_INTEL_CSTATE is not set # end of Performance monitoring # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_MICROCODE is not set +CONFIG_MICROCODE=y +CONFIG_MICROCODE_INTEL=y +# CONFIG_MICROCODE_LATE_LOADING is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set # CONFIG_X86_5LEVEL is not set @@ -341,6 +345,7 @@ CONFIG_CC_HAS_IBT=y CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set # CONFIG_X86_INTEL_TSX_MODE_AUTO is not set +# CONFIG_X86_SGX is not set CONFIG_EFI=y # CONFIG_EFI_STUB is not set # CONFIG_HZ_100 is not set @@ -354,8 +359,13 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set @@ -370,7 +380,8 @@ CONFIG_HAVE_LIVEPATCH=y CONFIG_CC_HAS_RETURN_THUNK=y CONFIG_SPECULATION_MITIGATIONS=y CONFIG_PAGE_TABLE_ISOLATION=y -# CONFIG_RETPOLINE is not set +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y @@ -434,10 +445,10 @@ CONFIG_X86_PM_TIMER=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y # CONFIG_CPU_FREQ_STAT is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set @@ -477,8 +488,7 @@ CONFIG_CPU_IDLE_GOV_MENU=y # Bus options (PCI etc.) # CONFIG_PCI_DIRECT=y -CONFIG_PCI_MMCONFIG=y -CONFIG_MMCONF_FAM10H=y +# CONFIG_PCI_MMCONFIG is not set # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y @@ -628,7 +638,7 @@ CONFIG_GCC_PLUGINS=y # end of General architecture-dependent options CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=1 +CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set # CONFIG_MODULE_UNLOAD is not set @@ -641,7 +651,8 @@ CONFIG_MODULE_COMPRESS_NONE=y # CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" -# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_TRIM_UNUSED_KSYMS=y +CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y @@ -673,8 +684,11 @@ CONFIG_MQ_IOSCHED_DEADLINE=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers -CONFIG_ASN1=m -CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y +CONFIG_INLINE_READ_UNLOCK=y +CONFIG_INLINE_READ_UNLOCK_IRQ=y +CONFIG_INLINE_WRITE_UNLOCK=y +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y @@ -757,6 +771,7 @@ CONFIG_ZONE_DMA32=y # GUP_TEST needs to have DEBUG_FS enabled # CONFIG_ARCH_HAS_PTE_SPECIAL=y +CONFIG_SECRETMEM=y # CONFIG_USERFAULTFD is not set # CONFIG_LRU_GEN is not set @@ -787,7 +802,7 @@ CONFIG_INET=y # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set -# CONFIG_SYN_COOKIES is not set +CONFIG_SYN_COOKIES=y # CONFIG_NET_IPVTI is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set @@ -886,12 +901,10 @@ CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set # CONFIG_PCI_STUB is not set -# CONFIG_PCI_PF_STUB is not set CONFIG_PCI_ATS=y CONFIG_PCI_LOCKLESS_CONFIG=y -CONFIG_PCI_IOV=y +# CONFIG_PCI_IOV is not set CONFIG_PCI_PRI=y CONFIG_PCI_PASID=y CONFIG_PCI_LABEL=y @@ -1002,7 +1015,7 @@ CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y # CONFIG_ISCSI_IBFT is not set # CONFIG_FW_CFG_SYSFS is not set CONFIG_SYSFB=y -# CONFIG_SYSFB_SIMPLEFB is not set +CONFIG_SYSFB_SIMPLEFB=y # CONFIG_GOOGLE_FIRMWARE is not set # @@ -1017,6 +1030,7 @@ CONFIG_EFI_RUNTIME_WRAPPERS=y # CONFIG_EFI_TEST is not set # CONFIG_EFI_RCI2_TABLE is not set # CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_EARLYCON=y CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y # CONFIG_EFI_DISABLE_RUNTIME is not set # CONFIG_EFI_COCO_SECRET is not set @@ -1034,7 +1048,7 @@ CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y # CONFIG_PARPORT is not set CONFIG_PNP=y -CONFIG_PNP_DEBUG_MESSAGES=y +# CONFIG_PNP_DEBUG_MESSAGES is not set # # Protocols @@ -1045,7 +1059,6 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set @@ -1101,7 +1114,7 @@ CONFIG_BLK_DEV_NVME=y # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set -CONFIG_EEPROM_93CX6=m +# CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support @@ -1115,9 +1128,9 @@ CONFIG_EEPROM_93CX6=m # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set -CONFIG_INTEL_MEI=m -CONFIG_INTEL_MEI_ME=m -CONFIG_INTEL_MEI_TXE=m +# CONFIG_INTEL_MEI is not set +# CONFIG_INTEL_MEI_ME is not set +# CONFIG_INTEL_MEI_TXE is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set @@ -1221,7 +1234,7 @@ CONFIG_ISCSI_TCP=y CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_PATA_TIMINGS=y -CONFIG_ATA_VERBOSE_ERROR=y +# CONFIG_ATA_VERBOSE_ERROR is not set CONFIG_ATA_FORCE=y CONFIG_ATA_ACPI=y CONFIG_SATA_PMP=y @@ -1245,10 +1258,12 @@ CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=y # CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=y +CONFIG_DM_PERSISTENT_DATA=y # CONFIG_DM_UNSTRIPED is not set CONFIG_DM_CRYPT=y -# CONFIG_DM_SNAPSHOT is not set -# CONFIG_DM_THIN_PROVISIONING is not set +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_THIN_PROVISIONING=y # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set @@ -1281,6 +1296,7 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y +CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set @@ -1312,7 +1328,7 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set -CONFIG_NET_VENDOR_ASIX=y +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set @@ -1321,16 +1337,14 @@ CONFIG_NET_VENDOR_ASIX=y # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -CONFIG_NET_VENDOR_DAVICOM=y +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set -CONFIG_NET_VENDOR_ENGLEDER=y -# CONFIG_TSNEP is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set -CONFIG_NET_VENDOR_FUNGIBLE=y -# CONFIG_FUN_ETH is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1349,17 +1363,15 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set -CONFIG_NET_VENDOR_WANGXUN=y -# CONFIG_NGBE is not set -# CONFIG_TXGBE is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set -CONFIG_NET_VENDOR_LITEX=y +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set -CONFIG_NET_VENDOR_MICROSOFT=y +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NI is not set @@ -1390,7 +1402,7 @@ CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set -CONFIG_NET_VENDOR_VERTEXCOM=y +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1408,7 +1420,49 @@ CONFIG_NET_VENDOR_VERTEXCOM=y # CONFIG_PPP is not set # CONFIG_SLIP is not set -# CONFIG_USB_NET_DRIVERS is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set # CONFIG_WAN is not set @@ -1460,6 +1514,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set @@ -1506,27 +1561,35 @@ CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # +CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set -# CONFIG_SERIAL_8250_PNP is not set +CONFIG_SERIAL_8250_PNP=y # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # CONFIG_SERIAL_8250_FINTEK is not set -# CONFIG_SERIAL_8250_CONSOLE is not set -# CONFIG_SERIAL_8250_PCI is not set -CONFIG_SERIAL_8250_NR_UARTS=4 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_DW is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_EXAR=y +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RUNTIME_UARTS=32 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_RSA is not set +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set -# CONFIG_SERIAL_8250_LPSS is not set +CONFIG_SERIAL_8250_LPSS=y # CONFIG_SERIAL_8250_MID is not set -CONFIG_SERIAL_8250_PERICOM=y +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support # # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set @@ -1537,6 +1600,7 @@ CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_SPRD is not set # end of Serial drivers # CONFIG_SERIAL_NONSTANDARD is not set @@ -1550,11 +1614,11 @@ CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_TIMERIOMEM=m +# CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=y -CONFIG_HW_RANDOM_AMD=m +# CONFIG_HW_RANDOM_AMD is not set # CONFIG_HW_RANDOM_BA431 is not set -CONFIG_HW_RANDOM_VIA=m +# CONFIG_HW_RANDOM_VIA is not set # CONFIG_HW_RANDOM_XIPHERA is not set # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set @@ -1582,7 +1646,7 @@ CONFIG_TCG_TIS=y # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set +CONFIG_RANDOM_TRUST_BOOTLOADER=y # end of Character devices # @@ -1648,7 +1712,9 @@ CONFIG_I2C_ALGOBIT=y # # I2C system bus drivers (mostly embedded / system-on-chip) # +# CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set +# CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_SIMTEC is not set @@ -1787,6 +1853,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set @@ -1899,7 +1966,7 @@ CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set -CONFIG_FB_VESA=y +# CONFIG_FB_VESA is not set CONFIG_FB_EFI=y # CONFIG_FB_N411 is not set # CONFIG_FB_HGA is not set @@ -1939,7 +2006,16 @@ CONFIG_FB_EFI=y # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set -# CONFIG_BACKLIGHT_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_APPLE is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_SAHARA is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support # @@ -1951,7 +2027,7 @@ CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support @@ -2130,10 +2206,8 @@ CONFIG_USB_EHCI_HCD_PLATFORM=m # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set -CONFIG_USB_OHCI_HCD=m -CONFIG_USB_OHCI_HCD_PCI=m -# CONFIG_USB_OHCI_HCD_PLATFORM is not set -CONFIG_USB_UHCI_HCD=m +# CONFIG_USB_OHCI_HCD is not set +# CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set @@ -2334,7 +2408,6 @@ CONFIG_RTC_DRV_CMOS=y # DMABUF options # CONFIG_SYNC_FILE=y -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set @@ -2360,10 +2433,7 @@ CONFIG_SYNC_FILE=y # CONFIG_STAGING is not set # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set -CONFIG_SURFACE_PLATFORMS=y -# CONFIG_SURFACE_3_POWER_OPREGION is not set -# CONFIG_SURFACE_GPE is not set -# CONFIG_SURFACE_PRO3_BUTTON is not set +# CONFIG_SURFACE_PLATFORMS is not set CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_ACPI_WMI is not set # CONFIG_ACERHDF is not set @@ -2371,8 +2441,11 @@ CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_AMD_PMF is not set # CONFIG_AMD_PMC is not set # CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set # CONFIG_ASUS_WIRELESS is not set # CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_GPD_POCKET_FAN is not set # CONFIG_HP_ACCEL is not set @@ -2401,10 +2474,12 @@ CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_INTEL_SMARTCONNECT is not set # CONFIG_INTEL_TURBO_MAX_3 is not set # CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_TOSHIBA_BT_RFKILL is not set # CONFIG_TOSHIBA_HAPS is not set # CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_MLX_PLATFORM is not set # CONFIG_INTEL_IPS is not set @@ -2413,7 +2488,16 @@ CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_SIEMENS_SIMATIC_IPC is not set # CONFIG_WINMATE_FM07_KEYS is not set # CONFIG_P2SB is not set -# CONFIG_COMMON_CLK is not set +CONFIG_HAVE_CLK=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2449,7 +2533,7 @@ CONFIG_INTEL_IOMMU_SVM=y CONFIG_INTEL_IOMMU_DEFAULT_ON=y CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set -# CONFIG_IRQ_REMAP is not set +CONFIG_IRQ_REMAP=y # # Remoteproc drivers @@ -2568,7 +2652,7 @@ CONFIG_LIBNVDIMM=y # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set # CONFIG_NVMEM_RMEM is not set # @@ -2658,22 +2742,18 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y -CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2750,7 +2830,7 @@ CONFIG_HARDENED_USERCOPY=y # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,integrity,bpf" +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # # Kernel hardening options @@ -2789,15 +2869,15 @@ CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_AKCIPHER=m CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set @@ -2810,9 +2890,10 @@ CONFIG_CRYPTO_SIMD=y # # Public-key cryptography # -CONFIG_CRYPTO_RSA=m +# CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set -# CONFIG_CRYPTO_ECDH is not set +CONFIG_CRYPTO_ECC=y +CONFIG_CRYPTO_ECDH=y # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set @@ -2822,43 +2903,35 @@ CONFIG_CRYPTO_RSA=m # # Block ciphers # -CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_ANUBIS=m # CONFIG_CRYPTO_ARIA is not set -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_BLOWFISH_COMMON=m -CONFIG_CRYPTO_CAMELLIA=m -CONFIG_CRYPTO_CAST_COMMON=m -CONFIG_CRYPTO_CAST5=m -CONFIG_CRYPTO_CAST6=m +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_DES is not set -CONFIG_CRYPTO_FCRYPT=m -CONFIG_CRYPTO_KHAZAD=m -CONFIG_CRYPTO_SEED=m -CONFIG_CRYPTO_SERPENT=m +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set -CONFIG_CRYPTO_TEA=m -CONFIG_CRYPTO_TWOFISH=m -CONFIG_CRYPTO_TWOFISH_COMMON=m +# CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ARC4=m -CONFIG_CRYPTO_CHACHA20=m +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set -CONFIG_CRYPTO_CTR=m -CONFIG_CRYPTO_CTS=m +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set -CONFIG_CRYPTO_KEYWRAP=m -CONFIG_CRYPTO_LRW=y +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set -CONFIG_CRYPTO_PCBC=m +# CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # end of Length-preserving ciphers and modes @@ -2866,9 +2939,9 @@ CONFIG_CRYPTO_XTS=y # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set -CONFIG_CRYPTO_CHACHA20POLY1305=m -CONFIG_CRYPTO_CCM=m -CONFIG_CRYPTO_GCM=m +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # CONFIG_CRYPTO_ECHAINIV is not set CONFIG_CRYPTO_ESSIV=y @@ -2878,23 +2951,23 @@ CONFIG_CRYPTO_ESSIV=y # Hashes, digests, and MACs # # CONFIG_CRYPTO_BLAKE2B is not set -CONFIG_CRYPTO_CMAC=m -CONFIG_CRYPTO_GHASH=m +# CONFIG_CRYPTO_CMAC is not set +# CONFIG_CRYPTO_GHASH is not set CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_MD4=m +# CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MICHAEL_MIC=m -CONFIG_CRYPTO_POLY1305=m -CONFIG_CRYPTO_RMD160=m +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y -# CONFIG_CRYPTO_SHA3 is not set +CONFIG_CRYPTO_SHA3=y # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -CONFIG_CRYPTO_VMAC=m -CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_XCBC=m +# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_XXHASH is not set # end of Hashes, digests, and MACs @@ -2902,27 +2975,31 @@ CONFIG_CRYPTO_XCBC=m # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32=m -CONFIG_CRYPTO_CRCT10DIF=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set # end of CRCs (cyclic redundancy checks) # # Compression # -CONFIG_CRYPTO_DEFLATE=m -CONFIG_CRYPTO_LZO=y -CONFIG_CRYPTO_842=m -CONFIG_CRYPTO_LZ4=m -CONFIG_CRYPTO_LZ4HC=m +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # -CONFIG_CRYPTO_ANSI_CPRNG=m -# CONFIG_CRYPTO_DRBG_MENU is not set -# CONFIG_CRYPTO_JITTERENTROPY is not set +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +# CONFIG_CRYPTO_DRBG_HASH is not set +# CONFIG_CRYPTO_DRBG_CTR is not set +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y # end of Random number generation # @@ -2932,8 +3009,9 @@ CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=y +# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set CONFIG_CRYPTO_USER_API_AEAD=y -CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y +# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set # end of Userspace interface @@ -2944,37 +3022,36 @@ CONFIG_CRYPTO_HASH_INFO=y # # CONFIG_CRYPTO_CURVE25519_X86 is not set CONFIG_CRYPTO_AES_NI_INTEL=y -CONFIG_CRYPTO_BLOWFISH_X86_64=m -CONFIG_CRYPTO_CAMELLIA_X86_64=m -CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m -CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=m -CONFIG_CRYPTO_CAST5_AVX_X86_64=m -CONFIG_CRYPTO_CAST6_AVX_X86_64=m -CONFIG_CRYPTO_DES3_EDE_X86_64=m -CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m -CONFIG_CRYPTO_SERPENT_AVX_X86_64=m -CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set -CONFIG_CRYPTO_TWOFISH_X86_64=m -CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m -CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set # CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set -CONFIG_CRYPTO_CHACHA20_X86_64=m +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set # CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set # CONFIG_CRYPTO_BLAKE2S_X86 is not set # CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set -CONFIG_CRYPTO_POLY1305_X86_64=m +# CONFIG_CRYPTO_POLY1305_X86_64 is not set CONFIG_CRYPTO_SHA1_SSSE3=y CONFIG_CRYPTO_SHA256_SSSE3=y CONFIG_CRYPTO_SHA512_SSSE3=y # CONFIG_CRYPTO_SM3_AVX_X86_64 is not set -CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set CONFIG_CRYPTO_CRC32C_INTEL=y -CONFIG_CRYPTO_CRC32_PCLMUL=m -CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m +# CONFIG_CRYPTO_CRC32_PCLMUL is not set # end of Accelerated Cryptographic Algorithms for CPU (x86) # CONFIG_CRYPTO_HW is not set @@ -2992,8 +3069,9 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_CORDIC=m +# CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y @@ -3005,27 +3083,21 @@ CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m # CONFIG_CRYPTO_LIB_CHACHA is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_DES=m CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m # CONFIG_CRYPTO_LIB_POLY1305 is not set # CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines -CONFIG_CRC_CCITT=m +# CONFIG_CRC_CCITT is not set CONFIG_CRC16=y -CONFIG_CRC_T10DIF=y +# CONFIG_CRC_T10DIF is not set # CONFIG_CRC64_ROCKSOFT is not set -CONFIG_CRC_ITU_T=m +# CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y @@ -3034,29 +3106,20 @@ CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_BIT is not set # CONFIG_CRC64 is not set # CONFIG_CRC4 is not set -CONFIG_CRC7=m -# CONFIG_LIBCRC32C is not set -CONFIG_CRC8=m +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set # CONFIG_RANDOM32_SELFTEST is not set -CONFIG_842_COMPRESS=m -CONFIG_842_DECOMPRESS=m -CONFIG_ZLIB_INFLATE=m -CONFIG_ZLIB_DEFLATE=m -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_LZ4_COMPRESS=m -CONFIG_LZ4HC_COMPRESS=m -CONFIG_LZ4_DECOMPRESS=m CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_POWERPC is not set -# CONFIG_XZ_DEC_IA64 is not set +CONFIG_XZ_DEC_IA64=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y -CONFIG_XZ_DEC_TEST=m +# CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y @@ -3078,9 +3141,7 @@ CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y -CONFIG_CLZ_TAB=y -CONFIG_IRQ_POLL=y -CONFIG_MPILIB=m +# CONFIG_IRQ_POLL is not set CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y @@ -3119,7 +3180,7 @@ CONFIG_SYMBOLIC_ERRNAME=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_MISC=y +# CONFIG_DEBUG_MISC is not set # # Compile-time checks and compiler options @@ -3226,12 +3287,11 @@ CONFIG_WQ_WATCHDOG=y # # Scheduler Debugging # -# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHED_DEBUG=y # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set -CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) @@ -3343,46 +3403,7 @@ CONFIG_UNWINDER_ORC=y CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set -CONFIG_RUNTIME_TESTING_MENU=y -# CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_DIV64 is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_TEST_REF_TRACKER is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_REED_SOLOMON_TEST is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_STRING_SELFTEST is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_SCANF is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_MAPLE_TREE is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_SIPHASH is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_BITOPS is not set -# CONFIG_TEST_VMALLOC is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_BPF is not set -# CONFIG_TEST_BLACKHOLE_DEV is not set -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_FREE_PAGES is not set -# CONFIG_TEST_FPU is not set -# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +# CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage diff --git a/config/linux-qemu.config b/config/linux-qemu.config index a5145bb0c..a660b1639 100644 --- a/config/linux-qemu.config +++ b/config/linux-qemu.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -80,6 +84,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -91,11 +97,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -119,12 +140,12 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +# CONFIG_PRINTK_INDEX is not set CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # @@ -136,9 +157,13 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y +# CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y @@ -155,6 +180,7 @@ CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y +# CONFIG_CGROUP_MISC is not set CONFIG_CGROUP_DEBUG=y # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set @@ -174,12 +200,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -187,7 +214,6 @@ CONFIG_EXPERT=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -206,10 +232,8 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +# CONFIG_KCMP is not set CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_EMBEDDED=y @@ -223,18 +247,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_SLUB_MEMCG_SYSFS_ON is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -256,17 +268,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -277,13 +282,11 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_X2APIC is not set # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -317,11 +320,13 @@ CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y # CONFIG_GART_IOMMU is not set +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=64 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y @@ -334,7 +339,6 @@ CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_AMD=y CONFIG_X86_MCE_THRESHOLD=y # CONFIG_X86_MCE_INJECT is not set -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -343,15 +347,16 @@ CONFIG_PERF_EVENTS_INTEL_UNCORE=y # CONFIG_PERF_EVENTS_INTEL_RAPL is not set CONFIG_PERF_EVENTS_INTEL_CSTATE=y # CONFIG_PERF_EVENTS_AMD_POWER is not set +CONFIG_PERF_EVENTS_AMD_UNCORE=y +# CONFIG_PERF_EVENTS_AMD_BRS is not set # end of Performance monitoring # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set CONFIG_MICROCODE=y CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_AMD=y -# CONFIG_MICROCODE_OLD_INTERFACE is not set +# CONFIG_MICROCODE_LATE_LOADING is not set CONFIG_X86_MSR=y CONFIG_X86_CPUID=y # CONFIG_X86_5LEVEL is not set @@ -361,21 +366,19 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 CONFIG_MTRR=y CONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=y CONFIG_ARCH_USES_PG_UNCACHED=y -CONFIG_ARCH_RANDOM=y -CONFIG_X86_SMAP=y CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -393,27 +396,40 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_UNRET_ENTRY=y +CONFIG_CPU_IBPB_ENTRY=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options # # CONFIG_SUSPEND is not set +# CONFIG_HIBERNATION is not set # CONFIG_PM is not set # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUPPORTS_ACPI=y @@ -423,6 +439,7 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set @@ -457,9 +474,11 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set CONFIG_ACPI_CONFIGFS=y +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -483,6 +502,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -513,58 +534,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -CONFIG_FIRMWARE_MEMMAP=y -# CONFIG_DMIID is not set -CONFIG_DMI_SYSFS=y -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_SMI is not set -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - -# -# EFI (Extensible Firmware Interface) Support -# -# CONFIG_EFI_VARS is not set -CONFIG_EFI_ESRT=y -CONFIG_EFI_RUNTIME_MAP=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -579,8 +557,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -592,8 +568,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -602,9 +581,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -615,6 +596,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -626,27 +608,47 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y @@ -657,7 +659,15 @@ CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -667,6 +677,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -677,21 +689,25 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -CONFIG_UNUSED_SYMBOLS=y +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set # CONFIG_BLK_DEV_THROTTLING is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set +# CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -706,6 +722,8 @@ CONFIG_EFI_PARTITION=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -746,40 +764,72 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SWAP=y +# CONFIG_ZSWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -# CONFIG_SPARSEMEM_VMEMMAP is not set +CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_ARCH_HAS_PKEYS=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set +# CONFIG_GUP_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_ANON_VMA_NAME is not set +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -791,6 +841,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -807,6 +858,7 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -825,10 +877,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -848,14 +898,15 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -870,8 +921,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -882,7 +933,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -917,6 +967,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -954,6 +1006,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -963,6 +1016,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -973,6 +1027,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -992,9 +1047,55 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_EARLYCON=y +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -1012,14 +1113,10 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 @@ -1027,13 +1124,14 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_ATA_OVER_ETH is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set # CONFIG_NVME_TARGET is not set # end of NVME Support @@ -1057,9 +1155,9 @@ CONFIG_VIRTIO_BLK=y # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # @@ -1088,21 +1186,21 @@ CONFIG_INTEL_MEI_TXE=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y CONFIG_RAID_ATTRS=y +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y CONFIG_SCSI_PROC_FS=y @@ -1114,6 +1212,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -1150,19 +1249,16 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set -CONFIG_MEGARAID_NEWGEN=y -CONFIG_MEGARAID_MM=m -CONFIG_MEGARAID_MAILBOX=m +# CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set -CONFIG_MEGARAID_SAS=m +# CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set @@ -1171,8 +1267,7 @@ CONFIG_MEGARAID_SAS=m # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -CONFIG_SCSI_GDTH=m -CONFIG_SCSI_ISCI=m +# CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set @@ -1188,11 +1283,7 @@ CONFIG_SCSI_ISCI=m # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_VIRTIO is not set -CONFIG_SCSI_DH=y -# CONFIG_SCSI_DH_RDAC is not set -# CONFIG_SCSI_DH_HP_SW is not set -# CONFIG_SCSI_DH_EMC is not set -# CONFIG_SCSI_DH_ALUA is not set +# CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y @@ -1209,6 +1300,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=y +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1280,12 +1372,6 @@ CONFIG_NET_CORE=y # CONFIG_VIRTIO_NET is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1297,21 +1383,23 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1330,24 +1418,28 @@ CONFIG_IGB=m # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1355,9 +1447,9 @@ CONFIG_IGB=m # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -1365,6 +1457,7 @@ CONFIG_IGB=m # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1372,6 +1465,7 @@ CONFIG_IGB=m # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1383,26 +1477,28 @@ CONFIG_IGB=m # CONFIG_SLIP is not set # CONFIG_USB_NET_DRIVERS is not set # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1436,6 +1532,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1473,7 +1570,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_LDISC_AUTOLOAD is not set +CONFIG_LDISC_AUTOLOAD=y # # Serial drivers @@ -1497,6 +1594,7 @@ CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1521,7 +1619,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set CONFIG_HVC_DRIVER=y # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y @@ -1540,9 +1637,7 @@ CONFIG_HW_RANDOM_VIRTIO=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set CONFIG_NVRAM=y -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1550,6 +1645,8 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set CONFIG_TCG_TIS_I2C_ATMEL=y CONFIG_TCG_TIS_I2C_INFINEON=y CONFIG_TCG_TIS_I2C_NUVOTON=y @@ -1562,10 +1659,10 @@ CONFIG_TCG_TIS_ST33ZP24=y CONFIG_TCG_TIS_ST33ZP24_I2C=y # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1632,6 +1729,8 @@ CONFIG_I2C_SCMI=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1640,6 +1739,7 @@ CONFIG_I2C_SCMI=y # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1661,6 +1761,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1674,12 +1775,14 @@ CONFIG_I2C_SLAVE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1687,10 +1790,14 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1710,6 +1817,7 @@ CONFIG_THERMAL_GOV_USER_SPACE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y CONFIG_X86_PKG_TEMP_THERMAL=y CONFIG_INTEL_SOC_DTS_IOSF_CORE=y # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1722,6 +1830,9 @@ CONFIG_ACPI_THERMAL_REL=y # end of ACPI INT340X thermal drivers CONFIG_INTEL_PCH_THERMAL=y +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1754,6 +1865,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set @@ -1768,19 +1880,21 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set @@ -1794,7 +1908,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1806,20 +1919,28 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -# CONFIG_VGA_ARB is not set # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1903,6 +2024,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1928,7 +2050,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1955,6 +2076,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1963,9 +2086,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1978,11 +2103,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1992,6 +2121,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -2020,7 +2150,7 @@ CONFIG_USB_HID=m # # I2C HID support # -# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_ACPI is not set # end of I2C HID support # @@ -2028,6 +2158,12 @@ CONFIG_USB_HID=m # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2114,7 +2250,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2167,6 +2303,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2235,6 +2372,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2263,6 +2401,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2270,17 +2409,21 @@ CONFIG_RTC_DRV_CMOS=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y +CONFIG_VIRTIO_PCI_LIB=y +CONFIG_VIRTIO_PCI_LIB_LEGACY=y CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI_LEGACY=y @@ -2300,13 +2443,62 @@ CONFIG_VHOST_MENU=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_AMD_HSMP is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +CONFIG_P2SB=y CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set @@ -2315,6 +2507,7 @@ CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2336,9 +2529,12 @@ CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # +CONFIG_IOMMU_IO_PGTABLE=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y CONFIG_AMD_IOMMU=y @@ -2350,6 +2546,7 @@ CONFIG_INTEL_IOMMU_DEFAULT_ON=y CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set CONFIG_IRQ_REMAP=y +# CONFIG_VIRTIO_IOMMU is not set # # Remoteproc drivers @@ -2375,11 +2572,6 @@ CONFIG_IRQ_REMAP=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2390,11 +2582,21 @@ CONFIG_IRQ_REMAP=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2405,7 +2607,6 @@ CONFIG_IRQ_REMAP=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2414,7 +2615,6 @@ CONFIG_IRQ_REMAP=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2430,7 +2630,14 @@ CONFIG_IRQ_REMAP=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2450,16 +2657,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set CONFIG_DAX=y CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2470,12 +2677,13 @@ CONFIG_NVMEM_SYSFS=y # CONFIG_FPGA is not set # CONFIG_TEE is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2509,11 +2717,9 @@ CONFIG_XFS_SUPPORT_V4=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2552,6 +2758,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2559,25 +2766,26 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_EFIVAR_FS=m # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set -# CONFIG_NETWORK_FILESYSTEMS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y @@ -2640,12 +2848,9 @@ CONFIG_IO_WQ=y # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITYFS=y -CONFIG_PAGE_TABLE_ISOLATION=y # CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set @@ -2660,9 +2865,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2695,7 +2908,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2703,114 +2916,90 @@ CONFIG_CRYPTO_GLUE_HELPER_X86=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2821,13 +3010,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2835,19 +3030,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2863,7 +3086,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2872,9 +3094,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2895,6 +3134,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2911,8 +3151,10 @@ CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y CONFIG_CHECK_SIGNATURE=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2934,7 +3176,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2946,6 +3187,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=6 @@ -2956,25 +3198,31 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_MISC=y + # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y +CONFIG_AS_HAS_NON_CONST_LEB128=y +# CONFIG_DEBUG_INFO_NONE is not set +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +CONFIG_DEBUG_INFO_DWARF4=y +# CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_COMPRESSED is not set # CONFIG_DEBUG_INFO_SPLIT is not set -CONFIG_DEBUG_INFO_DWARF4=y -# CONFIG_DEBUG_INFO_BTF is not set CONFIG_GDB_SCRIPTS=y -# CONFIG_ENABLE_MUST_CHECK is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2996,15 +3244,22 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_MISC=y +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y @@ -3012,7 +3267,7 @@ CONFIG_ARCH_HAS_DEBUG_WX=y CONFIG_GENERIC_PTDUMP=y # CONFIG_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set +# CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -3024,11 +3279,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -3042,16 +3302,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -3085,6 +3342,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3097,6 +3355,7 @@ CONFIG_STACKTRACE=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3108,36 +3367,40 @@ CONFIG_STACKTRACE=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3172,26 +3435,28 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_SORT is not set +# CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set +# CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set +# CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set @@ -3201,14 +3466,22 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set +# CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_STACKINIT is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set # CONFIG_TEST_FPU is not set +# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-t440p.config b/config/linux-t440p.config index fd144e3e0..3f5cc9cb0 100644 --- a/config/linux-t440p.config +++ b/config/linux-t440p.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -62,6 +66,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -78,6 +83,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -89,11 +96,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -117,7 +139,6 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 @@ -134,12 +155,15 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -154,12 +178,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -167,7 +192,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -183,10 +207,8 @@ CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -199,17 +221,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -231,17 +242,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -252,12 +256,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -# CONFIG_RETPOLINE is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -292,11 +294,13 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y @@ -307,7 +311,6 @@ CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -319,7 +322,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -328,16 +330,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -355,22 +355,32 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -385,13 +395,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -419,9 +429,11 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -445,6 +457,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -474,57 +488,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_SMI is not set -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - -# -# EFI (Extensible Firmware Interface) Support -# -# CONFIG_EFI_VARS is not set -CONFIG_EFI_ESRT=y -CONFIG_EFI_RUNTIME_MAP=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -539,8 +511,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -552,8 +522,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -562,9 +535,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -575,6 +550,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -586,36 +562,65 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -624,6 +629,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -634,19 +641,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -660,6 +669,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -699,38 +710,71 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -742,6 +786,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -752,12 +797,13 @@ CONFIG_INET=y # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set -# CONFIG_SYN_COOKIES is not set +CONFIG_SYN_COOKIES=y # CONFIG_NET_IPVTI is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -776,10 +822,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -799,12 +843,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -819,8 +864,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -831,7 +876,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -864,6 +908,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -901,6 +947,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -910,6 +957,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -920,6 +968,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -939,9 +988,54 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -959,27 +1053,28 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -1002,9 +1097,9 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # @@ -1033,21 +1128,21 @@ CONFIG_INTEL_MEI_TXE=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1059,6 +1154,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1093,7 +1189,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set @@ -1102,8 +1197,8 @@ CONFIG_ISCSI_TCP=y # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set @@ -1112,7 +1207,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set @@ -1145,6 +1239,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1195,6 +1290,7 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y +CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set @@ -1215,12 +1311,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1232,21 +1322,23 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1265,24 +1357,28 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1290,9 +1386,9 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -1300,6 +1396,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1307,6 +1404,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1316,27 +1414,71 @@ CONFIG_E1000E_HWTS=y # CONFIG_PPP is not set # CONFIG_SLIP is not set -# CONFIG_USB_NET_DRIVERS is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1370,6 +1512,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1426,6 +1569,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1449,7 +1593,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 @@ -1466,9 +1609,7 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1476,6 +1617,8 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set @@ -1487,10 +1630,10 @@ CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1567,6 +1710,8 @@ CONFIG_I2C_ALGOBIT=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1575,6 +1720,7 @@ CONFIG_I2C_ALGOBIT=y # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1596,6 +1742,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1609,12 +1756,14 @@ CONFIG_I2C_SLAVE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1622,10 +1771,14 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1645,6 +1798,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1655,6 +1809,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1687,6 +1844,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set @@ -1701,19 +1859,21 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set @@ -1727,7 +1887,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1739,21 +1898,28 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1846,6 +2012,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1871,7 +2038,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1898,6 +2064,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1906,9 +2074,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1921,11 +2091,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1935,6 +2109,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -1963,7 +2138,7 @@ CONFIG_USB_HID=m # # I2C HID support # -# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_ACPI is not set # end of I2C HID support # @@ -1971,6 +2146,12 @@ CONFIG_USB_HID=m # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2055,7 +2236,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2108,6 +2289,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2176,6 +2358,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2204,16 +2387,18 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2230,13 +2415,66 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set @@ -2245,6 +2483,7 @@ CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2268,7 +2507,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2302,11 +2545,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2317,11 +2555,21 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2332,7 +2580,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2341,7 +2588,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2357,7 +2603,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2377,16 +2630,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2396,11 +2649,12 @@ CONFIG_NVMEM_SYSFS=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2426,10 +2680,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2468,6 +2720,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2475,21 +2728,18 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2559,12 +2809,9 @@ CONFIG_IO_WQ=y # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITYFS=y -CONFIG_PAGE_TABLE_ISOLATION=y # CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set @@ -2579,9 +2826,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2614,7 +2869,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2622,114 +2877,90 @@ CONFIG_CRYPTO_GLUE_HELPER_X86=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -# CONFIG_CRYPTO_AES is not set -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2740,13 +2971,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2754,19 +2991,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2782,7 +3047,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2791,9 +3055,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2814,6 +3095,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2831,6 +3113,7 @@ CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2852,7 +3135,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2864,6 +3146,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2874,19 +3157,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2905,22 +3195,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -2932,11 +3228,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -2950,16 +3251,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -2993,6 +3291,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3005,6 +3304,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3016,36 +3316,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3078,6 +3382,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-t480.config b/config/linux-t480.config new file mode 100644 index 000000000..b7b2d58ce --- /dev/null +++ b/config/linux-t480.config @@ -0,0 +1,3135 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/x86 6.1.8 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=80300 +CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 +CONFIG_LLD_VERSION=0 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_CAN_LINK_STATIC=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set +CONFIG_LOCALVERSION="-@BRAND_NAME@" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_HAVE_KERNEL_ZSTD=y +# CONFIG_KERNEL_GZIP is not set +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +CONFIG_KERNEL_XZ=y +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +# CONFIG_KERNEL_ZSTD is not set +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +# CONFIG_SYSVIPC is not set +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_WATCH_QUEUE is not set +# CONFIG_CROSS_MEMORY_ATTACH is not set +# CONFIG_USELIB is not set +# CONFIG_AUDIT is not set +CONFIG_HAVE_ARCH_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y +CONFIG_GENERIC_IRQ_RESERVATION_MODE=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# end of IRQ subsystem + +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_ARCH_CLOCKSOURCE_INIT=y +CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 +# end of Timers subsystem + +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_PSI is not set +# end of CPU/Task time and stats accounting + +# CONFIG_CPU_ISOLATION is not set + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +# CONFIG_IKCONFIG is not set +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_UCLAMP_TASK is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y +CONFIG_ARCH_SUPPORTS_INT128=y +# CONFIG_CGROUPS is not set +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" +CONFIG_INITRAMFS_ROOT_UID=0 +CONFIG_INITRAMFS_ROOT_GID=0 +# CONFIG_RD_GZIP is not set +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +CONFIG_RD_XZ=y +# CONFIG_RD_LZO is not set +# CONFIG_RD_LZ4 is not set +# CONFIG_RD_ZSTD is not set +CONFIG_INITRAMFS_COMPRESSION_XZ=y +# CONFIG_INITRAMFS_COMPRESSION_NONE is not set +# CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set +# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_HAVE_PCSPKR_PLATFORM=y +CONFIG_EXPERT=y +# CONFIG_MULTIUSER is not set +# CONFIG_SGETMASK_SYSCALL is not set +# CONFIG_SYSFS_SYSCALL is not set +# CONFIG_FHANDLE is not set +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_PCSPKR_PLATFORM=y +# CONFIG_BASE_FULL is not set +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +# CONFIG_SIGNALFD is not set +# CONFIG_TIMERFD is not set +# CONFIG_EVENTFD is not set +CONFIG_SHMEM=y +# CONFIG_AIO is not set +CONFIG_IO_URING=y +# CONFIG_ADVISE_SYSCALLS is not set +CONFIG_MEMBARRIER=y +# CONFIG_KALLSYMS is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y +# CONFIG_RSEQ is not set +CONFIG_EMBEDDED=y +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +# CONFIG_PROFILING is not set +# end of General setup + +CONFIG_64BIT=y +CONFIG_X86_64=y +CONFIG_X86=y +CONFIG_INSTRUCTION_DECODER=y +CONFIG_OUTPUT_FORMAT="elf64-x86-64" +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=28 +CONFIG_ARCH_MMAP_RND_BITS_MAX=32 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_HAS_CPU_RELAX=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_AUDIT_ARCH=y +CONFIG_HAVE_INTEL_TXT=y +CONFIG_X86_64_SMP=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_CC_HAS_SANE_STACKPROTECTOR=y + +# +# Processor type and features +# +CONFIG_SMP=y +CONFIG_X86_FEATURE_NAMES=y +# CONFIG_X86_MPPARSE is not set +# CONFIG_GOLDFISH is not set +# CONFIG_X86_CPU_RESCTRL is not set +# CONFIG_X86_EXTENDED_PLATFORM is not set +# CONFIG_X86_INTEL_LPSS is not set +# CONFIG_X86_AMD_PLATFORM_DEVICE is not set +CONFIG_IOSF_MBI=y +CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y +# CONFIG_HYPERVISOR_GUEST is not set +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +CONFIG_MCORE2=y +# CONFIG_MATOM is not set +# CONFIG_GENERIC_CPU is not set +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_P6_NOP=y +CONFIG_X86_TSC=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_CMOV=y +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_IA32_FEAT_CTL=y +CONFIG_X86_VMX_FEATURE_NAMES=y +CONFIG_PROCESSOR_SELECT=y +CONFIG_CPU_SUP_INTEL=y +# CONFIG_CPU_SUP_AMD is not set +# CONFIG_CPU_SUP_HYGON is not set +# CONFIG_CPU_SUP_CENTAUR is not set +# CONFIG_CPU_SUP_ZHAOXIN is not set +CONFIG_HPET_TIMER=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y +# CONFIG_MAXSMP is not set +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=512 +CONFIG_NR_CPUS_DEFAULT=64 +CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y +CONFIG_SCHED_SMT=y +CONFIG_SCHED_MC=y +CONFIG_SCHED_MC_PRIO=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set +CONFIG_X86_MCE=y +# CONFIG_X86_MCELOG_LEGACY is not set +CONFIG_X86_MCE_INTEL=y +CONFIG_X86_MCE_THRESHOLD=y + +# +# Performance monitoring +# +# CONFIG_PERF_EVENTS_INTEL_UNCORE is not set +# CONFIG_PERF_EVENTS_INTEL_RAPL is not set +# CONFIG_PERF_EVENTS_INTEL_CSTATE is not set +# end of Performance monitoring + +# CONFIG_X86_VSYSCALL_EMULATION is not set +CONFIG_X86_IOPL_IOPERM=y +# CONFIG_MICROCODE is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_CPUID is not set +# CONFIG_X86_5LEVEL is not set +CONFIG_X86_DIRECT_GBPAGES=y +# CONFIG_NUMA is not set +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_X86_PMEM_LEGACY_DEVICE=y +CONFIG_X86_PMEM_LEGACY=y +# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set +# CONFIG_MTRR is not set +CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set +# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set +CONFIG_X86_INTEL_TSX_MODE_OFF=y +# CONFIG_X86_INTEL_TSX_MODE_ON is not set +# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set +CONFIG_EFI=y +# CONFIG_EFI_STUB is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_KEXEC=y +CONFIG_KEXEC_FILE=y +CONFIG_ARCH_HAS_KEXEC_PURGATORY=y +# CONFIG_KEXEC_SIG is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_PHYSICAL_START=0x1000000 +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y +CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 +CONFIG_HOTPLUG_CPU=y +# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set +# CONFIG_DEBUG_HOTPLUG_CPU0 is not set +# CONFIG_LEGACY_VSYSCALL_XONLY is not set +CONFIG_LEGACY_VSYSCALL_NONE=y +# CONFIG_CMDLINE_BOOL is not set +# CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set +CONFIG_HAVE_LIVEPATCH=y +# end of Processor type and features + +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +# CONFIG_RETPOLINE is not set +CONFIG_CPU_IBRS_ENTRY=y +CONFIG_ARCH_HAS_ADD_PAGES=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y + +# +# Power management and ACPI options +# +# CONFIG_SUSPEND is not set +# CONFIG_PM is not set +# CONFIG_ENERGY_MODEL is not set +CONFIG_ARCH_SUPPORTS_ACPI=y +CONFIG_ACPI=y +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +# CONFIG_ACPI_DEBUGGER is not set +CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set +CONFIG_ACPI_LPIT=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +# CONFIG_ACPI_EC_DEBUGFS is not set +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +CONFIG_ACPI_FAN=y +# CONFIG_ACPI_DOCK is not set +CONFIG_ACPI_CPU_FREQ_PSS=y +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_CPPC_LIB=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_HOTPLUG_CPU=y +# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_CUSTOM_DSDT_FILE="" +CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y +CONFIG_ACPI_TABLE_UPGRADE=y +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_PCI_SLOT is not set +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +# CONFIG_ACPI_SBS is not set +# CONFIG_ACPI_HED is not set +# CONFIG_ACPI_BGRT is not set +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set +# CONFIG_ACPI_NFIT is not set +CONFIG_HAVE_ACPI_APEI=y +CONFIG_HAVE_ACPI_APEI_NMI=y +# CONFIG_ACPI_APEI is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y +# CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y +CONFIG_X86_PM_TIMER=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +# CONFIG_CPU_FREQ_STAT is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_X86_INTEL_PSTATE=y +# CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set +# CONFIG_X86_ACPI_CPUFREQ is not set +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +# CONFIG_X86_P4_CLOCKMOD is not set + +# +# shared options +# +# end of CPU Frequency scaling + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +# CONFIG_CPU_IDLE_GOV_LADDER is not set +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set +# end of CPU Idle + +# CONFIG_INTEL_IDLE is not set +# end of Power management and ACPI options + +# +# Bus options (PCI etc.) +# +CONFIG_PCI_DIRECT=y +# CONFIG_PCI_MMCONFIG is not set +# CONFIG_PCI_CNB20LE_QUIRK is not set +# CONFIG_ISA_BUS is not set +CONFIG_ISA_DMA_API=y +# end of Bus options (PCI etc.) + +# +# Binary Emulations +# +# CONFIG_IA32_EMULATION is not set +# CONFIG_X86_X32_ABI is not set +# end of Binary Emulations + +CONFIG_HAVE_KVM=y +# CONFIG_VIRTUALIZATION is not set +CONFIG_AS_AVX512=y +CONFIG_AS_SHA1_NI=y +CONFIG_AS_SHA256_NI=y +CONFIG_AS_TPAUSE=y + +# +# General architecture-dependent options +# +CONFIG_CRASH_CORE=y +CONFIG_KEXEC_CORE=y +CONFIG_HOTPLUG_SMT=y +CONFIG_GENERIC_ENTRY=y +# CONFIG_KPROBES is not set +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +# CONFIG_STATIC_CALL_SELFTEST is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y +CONFIG_HAVE_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_PERF_EVENTS_NMI=y +CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +# CONFIG_SECCOMP is not set +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y +CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_HAVE_ARCH_SOFT_DIRTY=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y +CONFIG_HAVE_STACK_VALIDATION=y +CONFIG_HAVE_RELIABLE_STACKTRACE=y +# CONFIG_COMPAT_32BIT_TIME is not set +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +CONFIG_HAVE_STATIC_CALL=y +CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y + +# +# GCOV-based kernel profiling +# +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=1 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +# CONFIG_MODULE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" +CONFIG_TRIM_UNUSED_KSYMS=y +CONFIG_UNUSED_KSYMS_WHITELIST="" +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y +CONFIG_BLK_DEV_BSGLIB=y +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_ZONED is not set +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y +# end of Partition Types + +CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +# CONFIG_MQ_IOSCHED_KYBER is not set +# CONFIG_IOSCHED_BFQ is not set +# end of IO Schedulers + +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y +CONFIG_INLINE_READ_UNLOCK=y +CONFIG_INLINE_READ_UNLOCK_IRQ=y +CONFIG_INLINE_WRITE_UNLOCK=y +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_ELFCORE=y +CONFIG_BINFMT_SCRIPT=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_COREDUMP is not set +# end of Executable file formats + +# +# Memory Management options +# +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +# CONFIG_COMPACTION is not set +# CONFIG_PAGE_REPORTING is not set +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_MMU_NOTIFIER=y +# CONFIG_KSM is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +# CONFIG_MEMORY_FAILURE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +CONFIG_ARCH_WANTS_THP_SWAP=y +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y +# CONFIG_CMA is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y +CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set +# CONFIG_PERCPU_STATS is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# +CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring +# end of Memory Management options + +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y +# CONFIG_UNIX_DIAG is not set +# CONFIG_TLS is not set +# CONFIG_XFRM_USER is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +# CONFIG_NET_FOU is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IPV6 is not set +# CONFIG_MPTCP is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +# CONFIG_NETFILTER is not set +# CONFIG_BPFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +# CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_QRTR is not set +# CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_XPS=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set +# CONFIG_WIRELESS is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +# CONFIG_FAILOVER is not set +CONFIG_ETHTOOL_NETLINK=y + +# +# Device Drivers +# +CONFIG_HAVE_EISA=y +# CONFIG_EISA is not set +CONFIG_HAVE_PCI=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +# CONFIG_PCIEPORTBUS is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set +CONFIG_PCI_ATS=y +CONFIG_PCI_LOCKLESS_CONFIG=y +# CONFIG_PCI_IOV is not set +CONFIG_PCI_PRI=y +CONFIG_PCI_PASID=y +CONFIG_PCI_LABEL=y +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +# CONFIG_HOTPLUG_PCI is not set + +# +# PCI controller drivers +# +# CONFIG_VMD is not set + +# +# DesignWare PCI Core Support +# +# CONFIG_PCIE_DW_PLAT_HOST is not set +# CONFIG_PCI_MESON is not set +# end of DesignWare PCI Core Support + +# +# Mobiveil PCIe Core Support +# +# end of Mobiveil PCIe Core Support + +# +# Cadence PCIe controllers support +# +# end of Cadence PCIe controllers support +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +# CONFIG_CXL_BUS is not set +# CONFIG_PCCARD is not set +# CONFIG_RAPIDIO is not set + +# +# Generic Driver Options +# +# CONFIG_UEVENT_HELPER is not set +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set +# CONFIG_STANDALONE is not set +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +# CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set +# end of Firmware loader + +# CONFIG_ALLOW_DEV_COREDUMP is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set +# end of Bus devices + +# CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +# CONFIG_GNSS is not set +# CONFIG_MTD is not set +# CONFIG_OF is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_PARPORT is not set +CONFIG_PNP=y +# CONFIG_PNP_DEBUG_MESSAGES is not set + +# +# Protocols +# +CONFIG_PNPACPI=y +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +# CONFIG_BLK_DEV_FD is not set +CONFIG_CDROM=y +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=65536 +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_BLK_DEV_UBLK is not set + +# +# NVME Support +# +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_DUMMY_IRQ is not set +# CONFIG_IBM_ASM is not set +# CONFIG_PHANTOM is not set +# CONFIG_TIFM_CORE is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set +# end of EEPROM support + +# CONFIG_CB710_CORE is not set + +# +# Texas Instruments shared transport line discipline +# +# end of Texas Instruments shared transport line discipline + +# +# Altera FPGA firmware download module (requires I2C) +# +# CONFIG_INTEL_MEI is not set +# CONFIG_INTEL_MEI_ME is not set +# CONFIG_INTEL_MEI_TXE is not set +# CONFIG_VMWARE_VMCI is not set +# CONFIG_GENWQE is not set +# CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_HABANA_AI is not set +# CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +CONFIG_BLK_DEV_SR=y +CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +CONFIG_SCSI_ISCSI_ATTRS=y +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=y +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_VMWARE_PVSCSI is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_ISCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +CONFIG_ATA=y +CONFIG_SATA_HOST=y +CONFIG_PATA_TIMINGS=y +# CONFIG_ATA_VERBOSE_ERROR is not set +CONFIG_ATA_FORCE=y +CONFIG_ATA_ACPI=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +CONFIG_SATA_AHCI=y +CONFIG_SATA_MOBILE_LPM_POLICY=0 +# CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set +# CONFIG_SATA_INIC162X is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_SIL24 is not set +# CONFIG_ATA_SFF is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +# CONFIG_BCACHE is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=y +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=y +CONFIG_DM_PERSISTENT_DATA=y +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=y +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_THIN_PROVISIONING=y +# CONFIG_DM_CACHE is not set +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_EBS is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_CLONE is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_RAID is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +# CONFIG_DM_DUST is not set +# CONFIG_DM_INIT is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_DM_FLAKEY is not set +CONFIG_DM_VERITY=y +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set +CONFIG_DM_VERITY_FEC=y +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_LOG_WRITES is not set +# CONFIG_DM_INTEGRITY is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +# CONFIG_MACINTOSH_DRIVERS is not set +CONFIG_NETDEVICES=y +CONFIG_MII=m +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +# CONFIG_WIREGUARD is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_IPVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_TUN is not set +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_VETH is not set +# CONFIG_NLMON is not set +# CONFIG_ARCNET is not set +CONFIG_ETHERNET=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_ALTERA_TSE is not set +# CONFIG_NET_VENDOR_AMAZON is not set +# CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_VENDOR_AQUANTIA is not set +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_CX_ECAT is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CADENCE is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_NET_VENDOR_DAVICOM is not set +# CONFIG_DNET is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set +# CONFIG_NET_VENDOR_GOOGLE is not set +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_I825XX is not set +CONFIG_NET_VENDOR_INTEL=y +# CONFIG_E100 is not set +CONFIG_E1000=m +CONFIG_E1000E=m +CONFIG_E1000E_HWTS=y +# CONFIG_IGB is not set +# CONFIG_IGBVF is not set +# CONFIG_IXGB is not set +# CONFIG_IXGBE is not set +# CONFIG_IXGBEVF is not set +# CONFIG_I40E is not set +# CONFIG_I40EVF is not set +# CONFIG_ICE is not set +# CONFIG_FM10K is not set +# CONFIG_IGC is not set +# CONFIG_NET_VENDOR_WANGXUN is not set +# CONFIG_JME is not set +# CONFIG_NET_VENDOR_LITEX is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NETERION is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_ETHOC is not set +# CONFIG_NET_VENDOR_PACKET_ENGINES is not set +# CONFIG_NET_VENDOR_PENSANDO is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_REALTEK is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_NET_VENDOR_XILINX is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_NET_SB1000 is not set +# CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set +# CONFIG_MDIO_DEVICE is not set + +# +# PCS device drivers +# +# end of PCS device drivers + +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m +# CONFIG_WLAN is not set +# CONFIG_WAN is not set + +# +# Wireless WAN +# +# CONFIG_WWAN is not set +# end of Wireless WAN + +# CONFIG_VMXNET3 is not set +# CONFIG_FUJITSU_ES is not set +# CONFIG_NET_FAILOVER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set +# CONFIG_RMI4_CORE is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y +CONFIG_SERIO_I8042=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_USERIO is not set +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_LDISC_AUTOLOAD=y + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +# CONFIG_SERIAL_8250_PNP is not set +# CONFIG_SERIAL_8250_16550A_VARIANTS is not set +# CONFIG_SERIAL_8250_FINTEK is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_PCI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_DW is not set +# CONFIG_SERIAL_8250_RT288X is not set +# CONFIG_SERIAL_8250_LPSS is not set +# CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_LANTIQ is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_NOZOMI is not set +# CONFIG_NULL_TTY is not set +# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_TTY_PRINTK=y +CONFIG_TTY_PRINTK_LEVEL=6 +# CONFIG_VIRTIO_CONSOLE is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +CONFIG_HW_RANDOM_INTEL=y +# CONFIG_HW_RANDOM_AMD is not set +# CONFIG_HW_RANDOM_BA431 is not set +# CONFIG_HW_RANDOM_VIA is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +# CONFIG_APPLICOM is not set +# CONFIG_MWAVE is not set +CONFIG_DEVMEM=y +# CONFIG_NVRAM is not set +CONFIG_DEVPORT=y +# CONFIG_HPET is not set +# CONFIG_HANGCHECK_TIMER is not set +CONFIG_TCG_TPM=y +# CONFIG_HW_RANDOM_TPM is not set +CONFIG_TCG_TIS_CORE=y +CONFIG_TCG_TIS=y +# CONFIG_TCG_NSC is not set +# CONFIG_TCG_ATMEL is not set +# CONFIG_TCG_INFINEON is not set +# CONFIG_TCG_CRB is not set +# CONFIG_TCG_VTPM_PROXY is not set +# CONFIG_TELCLOCK is not set +# CONFIG_XILLYBUS is not set +# CONFIG_XILLYUSB is not set +CONFIG_RANDOM_TRUST_CPU=y +# CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices + +# +# I2C support +# +# CONFIG_I2C is not set +# end of I2C support + +# CONFIG_I3C is not set +# CONFIG_SPI is not set +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +# CONFIG_PPS is not set + +# +# PTP clock support +# +# CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +# end of PTP clock support + +# CONFIG_PINCTRL is not set +# CONFIG_GPIOLIB is not set +# CONFIG_W1 is not set +# CONFIG_POWER_RESET is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_HWMON is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_NETLINK is not set +# CONFIG_THERMAL_STATISTICS is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +# CONFIG_THERMAL_WRITABLE_TRIPS is not set +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +# CONFIG_THERMAL_GOV_BANG_BANG is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +# CONFIG_THERMAL_EMULATION is not set + +# +# Intel thermal drivers +# +# CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y +# CONFIG_X86_PKG_TEMP_THERMAL is not set +# CONFIG_INTEL_SOC_DTS_THERMAL is not set + +# +# ACPI INT340X thermal drivers +# +# CONFIG_INT340X_THERMAL is not set +# end of ACPI INT340X thermal drivers + +# CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set +# end of Intel thermal drivers + +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_MADERA is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_INTEL_LPSS_ACPI is not set +# CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_SM501 is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VX855 is not set +# end of Multifunction device drivers + +# CONFIG_REGULATOR is not set +# CONFIG_RC_CORE is not set + +# +# CEC support +# +# CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + +# CONFIG_MEDIA_SUPPORT is not set + +# +# Graphics support +# +CONFIG_APERTURE_HELPERS=y +# CONFIG_AGP is not set +# CONFIG_VGA_SWITCHEROO is not set +# CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set + +# +# ARM devices +# +# end of ARM devices + +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_VGA16 is not set +# CONFIG_FB_VESA is not set +CONFIG_FB_EFI=y +# CONFIG_FB_N411 is not set +# CONFIG_FB_HGA is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_LE80578 is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SM712 is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_APPLE is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_SAHARA is not set +# end of Backlight & LCD device support + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + +# CONFIG_LOGO is not set +# end of Graphics support + +# CONFIG_SOUND is not set + +# +# HID support +# +CONFIG_HID=y +# CONFIG_HID_BATTERY_STRENGTH is not set +# CONFIG_HIDRAW is not set +# CONFIG_UHID is not set +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +# CONFIG_HID_A4TECH is not set +# CONFIG_HID_ACCUTOUCH is not set +# CONFIG_HID_ACRUX is not set +# CONFIG_HID_APPLEIR is not set +# CONFIG_HID_AUREAL is not set +# CONFIG_HID_BELKIN is not set +# CONFIG_HID_BETOP_FF is not set +# CONFIG_HID_CHERRY is not set +# CONFIG_HID_CHICONY is not set +# CONFIG_HID_COUGAR is not set +# CONFIG_HID_MACALLY is not set +# CONFIG_HID_CMEDIA is not set +# CONFIG_HID_CREATIVE_SB0540 is not set +# CONFIG_HID_CYPRESS is not set +# CONFIG_HID_DRAGONRISE is not set +# CONFIG_HID_EMS_FF is not set +# CONFIG_HID_ELECOM is not set +# CONFIG_HID_ELO is not set +# CONFIG_HID_EZKEY is not set +# CONFIG_HID_GEMBIRD is not set +# CONFIG_HID_GFRM is not set +# CONFIG_HID_GLORIOUS is not set +# CONFIG_HID_HOLTEK is not set +# CONFIG_HID_VIVALDI is not set +# CONFIG_HID_KEYTOUCH is not set +# CONFIG_HID_KYE is not set +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_WALTOP is not set +# CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_ICADE is not set +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +# CONFIG_HID_TWINHAN is not set +# CONFIG_HID_KENSINGTON is not set +# CONFIG_HID_LCPOWER is not set +# CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set +# CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set +# CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set +# CONFIG_HID_REDRAGON is not set +# CONFIG_HID_MICROSOFT is not set +# CONFIG_HID_MONTEREY is not set +# CONFIG_HID_MULTITOUCH is not set +# CONFIG_HID_NTI is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_ORTEK is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PENMOUNT is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set +# CONFIG_HID_PRIMAX is not set +# CONFIG_HID_RETRODE is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_SAITEK is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set +# CONFIG_HID_SPEEDLINK is not set +# CONFIG_HID_STEAM is not set +# CONFIG_HID_STEELSERIES is not set +# CONFIG_HID_SUNPLUS is not set +# CONFIG_HID_RMI is not set +# CONFIG_HID_GREENASIA is not set +# CONFIG_HID_SMARTJOYPLUS is not set +# CONFIG_HID_TIVO is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set +# CONFIG_HID_THRUSTMASTER is not set +# CONFIG_HID_UDRAW_PS3 is not set +# CONFIG_HID_WACOM is not set +# CONFIG_HID_XINMO is not set +# CONFIG_HID_ZEROPLUS is not set +# CONFIG_HID_ZYDACRON is not set +# CONFIG_HID_SENSOR_HUB is not set +# CONFIG_HID_ALPS is not set +# end of Special HID drivers + +# +# USB HID support +# +CONFIG_USB_HID=m +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +# end of USB HID Boot Protocol drivers +# end of USB HID support + +# +# Intel ISH HID support +# +# CONFIG_INTEL_ISH_HID is not set +# end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support +# end of HID support + +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +# CONFIG_USB_ULPI_BUS is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_PCI=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +# CONFIG_USB_MON is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +CONFIG_USB_XHCI_HCD=m +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_USB_XHCI_PCI=m +# CONFIG_USB_XHCI_PCI_RENESAS is not set +CONFIG_USB_XHCI_PLATFORM=m +CONFIG_USB_EHCI_HCD=m +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_PCI=m +# CONFIG_USB_EHCI_FSL is not set +CONFIG_USB_EHCI_HCD_PLATFORM=m +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_FOTG210_HCD is not set +# CONFIG_USB_OHCI_HCD is not set +# CONFIG_USB_UHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +# CONFIG_USB_UAS is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USBIP_CORE is not set +# CONFIG_USB_CDNS_SUPPORT is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_CHAOSKEY is not set + +# +# USB Physical Layer drivers +# +# CONFIG_NOP_USB_XCEIV is not set +# end of USB Physical Layer drivers + +# CONFIG_USB_GADGET is not set +# CONFIG_TYPEC is not set +# CONFIG_USB_ROLE_SWITCH is not set +# CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_MEMSTICK is not set +# CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_MC146818_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# + +# +# SPI RTC drivers +# + +# +# SPI and I2C RTC drivers +# + +# +# Platform RTC drivers +# +CONFIG_RTC_DRV_CMOS=y +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_FTRTC010 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_GOLDFISH is not set +# CONFIG_DMADEVICES is not set + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set +# end of DMABUF options + +# CONFIG_AUXDISPLAY is not set +# CONFIG_UIO is not set +# CONFIG_VFIO is not set +# CONFIG_VIRT_DRIVERS is not set +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VDPA is not set +# CONFIG_VHOST_MENU is not set + +# +# Microsoft Hyper-V guest support +# +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set +# CONFIG_STAGING is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set +CONFIG_HAVE_CLK=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y +# CONFIG_XILINX_VCU is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_CLKEVT_I8253=y +CONFIG_I8253_LOCK=y +CONFIG_CLKBLD_I8253=y +# end of Clock Source drivers + +CONFIG_MAILBOX=y +CONFIG_PCC=y +# CONFIG_ALTERA_MBOX is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOASID=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y +# CONFIG_AMD_IOMMU is not set +CONFIG_DMAR_TABLE=y +CONFIG_INTEL_IOMMU=y +CONFIG_INTEL_IOMMU_SVM=y +CONFIG_INTEL_IOMMU_DEFAULT_ON=y +CONFIG_INTEL_IOMMU_FLOPPY_WA=y +# CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set +# CONFIG_IRQ_REMAP is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# end of NXP/Freescale QorIQ SoC drivers + +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# CONFIG_PM_DEVFREQ is not set +# CONFIG_EXTCON is not set +# CONFIG_MEMORY is not set +# CONFIG_IIO is not set +# CONFIG_NTB is not set +# CONFIG_PWM is not set + +# +# IRQ chip support +# +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +# CONFIG_RESET_CONTROLLER is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +# CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# +# CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_INTEL_LGM_EMMC is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +# end of Performance monitor support + +# CONFIG_RAS is not set +# CONFIG_USB4 is not set + +# +# Android +# +# CONFIG_ANDROID_BINDER_IPC is not set +# end of Android + +CONFIG_LIBNVDIMM=y +# CONFIG_BLK_DEV_PMEM is not set +# CONFIG_BTT is not set +# CONFIG_DAX is not set +CONFIG_NVMEM=y +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_USE_FOR_EXT2=y +# CONFIG_EXT4_FS_POSIX_ACL is not set +# CONFIG_EXT4_FS_SECURITY is not set +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_F2FS_FS is not set +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +# CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_VERITY is not set +# CONFIG_DNOTIFY is not set +# CONFIG_INOTIFY_USER is not set +# CONFIG_FANOTIFY is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_FUSE_FS is not set +# CONFIG_OVERLAY_FS is not set + +# +# Caches +# +# CONFIG_FSCACHE is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_EXFAT_FS=y +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +# CONFIG_PROC_KCORE is not set +CONFIG_PROC_SYSCTL=y +# CONFIG_PROC_PAGE_MONITOR is not set +# CONFIG_PROC_CHILDREN is not set +CONFIG_PROC_PID_ARCH_STATUS=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +# CONFIG_TMPFS is not set +# CONFIG_HUGETLBFS is not set +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +# CONFIG_CONFIGFS_FS is not set +# CONFIG_EFIVAR_FS is not set +# end of Pseudo filesystems + +# CONFIG_MISC_FILESYSTEMS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_UNICODE is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_SECURITYFS=y +# CONFIG_INTEL_TXT is not set +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +CONFIG_HARDENED_USERCOPY=y +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set +# end of Kernel hardening options +# end of Security options + +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +# CONFIG_CRYPTO_PCRYPT is not set +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_AUTHENC=y +# CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_SIMD=y +# end of Crypto core or helper + +# +# Public-key cryptography +# +# CONFIG_CRYPTO_RSA is not set +# CONFIG_CRYPTO_DH is not set +# CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_SM2 is not set +# CONFIG_CRYPTO_CURVE25519 is not set +# end of Public-key cryptography + +# +# Block ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers + +# +# Length-preserving ciphers and modes +# +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CFB is not set +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_OFB is not set +# CONFIG_CRYPTO_PCBC is not set +CONFIG_CRYPTO_XTS=y +# end of Length-preserving ciphers and modes + +# +# AEAD (authenticated encryption with associated data) ciphers +# +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers + +# +# Hashes, digests, and MACs +# +# CONFIG_CRYPTO_BLAKE2B is not set +# CONFIG_CRYPTO_CMAC is not set +# CONFIG_CRYPTO_GHASH is not set +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_RMD160 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +# CONFIG_CRYPTO_SHA3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set +# CONFIG_CRYPTO_STREEBOG is not set +# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs + +# +# CRCs (cyclic redundancy checks) +# +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set +# CONFIG_CRYPTO_ZSTD is not set +# end of Compression + +# +# Random number generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_DRBG_MENU is not set +# CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# +CONFIG_CRYPTO_USER_API=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_USER_API_RNG=y +CONFIG_CRYPTO_USER_API_AEAD=y +# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set +# CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + +CONFIG_CRYPTO_HASH_INFO=y + +# +# Accelerated Cryptographic Algorithms for CPU (x86) +# +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + +# CONFIG_CRYPTO_HW is not set + +# +# Certificates for signature checking +# +# end of Certificates for signature checking + +# +# Library routines +# +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +# CONFIG_CORDIC is not set +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +# CONFIG_CRC_CCITT is not set +CONFIG_CRC16=y +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +# CONFIG_CRC64 is not set +# CONFIG_CRC4 is not set +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_IA64 is not set +# CONFIG_XZ_DEC_ARM is not set +# CONFIG_XZ_DEC_ARMTHUMB is not set +# CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_XZ=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_INTERVAL_TREE=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_SWIOTLB=y +# CONFIG_DMA_API_DEBUG is not set +CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +# CONFIG_IRQ_POLL is not set +CONFIG_UCS2_STRING=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_MEMREGION=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_ARCH_HAS_COPY_MC=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# end of Library routines + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +CONFIG_BOOT_PRINTK_DELAY=y +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DYNAMIC_DEBUG_CORE is not set +CONFIG_SYMBOLIC_ERRNAME=y +# CONFIG_DEBUG_BUGVERBOSE is not set +# end of printk and dmesg options + +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + +# +# Compile-time checks and compiler options +# +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set +CONFIG_FRAME_WARN=1024 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +# CONFIG_DEBUG_FS is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +# end of Generic Kernel Debugging Instruments + +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_GENERIC_PTDUMP=y +# CONFIG_DEBUG_OBJECTS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +CONFIG_HARDLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set +CONFIG_WQ_WATCHDOG=y +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +# CONFIG_SCHED_DEBUG is not set +# CONFIG_SCHEDSTATS is not set +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_DEBUG_IRQFLAGS is not set +# CONFIG_STACKTRACE is not set +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set +# end of Debug kernel data structures + +# CONFIG_DEBUG_CREDENTIALS is not set + +# +# RCU Debugging +# +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y +CONFIG_TRACING_SUPPORT=y +# CONFIG_FTRACE is not set +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +# CONFIG_STRICT_DEVMEM is not set + +# +# x86 Debugging +# +# CONFIG_X86_VERBOSE_BOOTUP is not set +CONFIG_EARLY_PRINTK=y +# CONFIG_EARLY_PRINTK_DBGP is not set +# CONFIG_EARLY_PRINTK_USB_XDBC is not set +# CONFIG_EFI_PGT_DUMP is not set +# CONFIG_DEBUG_TLBFLUSH is not set +CONFIG_HAVE_MMIOTRACE_SUPPORT=y +# CONFIG_X86_DECODER_SELFTEST is not set +# CONFIG_IO_DELAY_0X80 is not set +CONFIG_IO_DELAY_0XED=y +# CONFIG_IO_DELAY_UDELAY is not set +# CONFIG_IO_DELAY_NONE is not set +# CONFIG_CPA_DEBUG is not set +# CONFIG_DEBUG_ENTRY is not set +# CONFIG_DEBUG_NMI_SELFTEST is not set +# CONFIG_X86_DEBUG_FPU is not set +# CONFIG_PUNIT_ATOM_DEBUG is not set +CONFIG_UNWINDER_ORC=y +# CONFIG_UNWINDER_FRAME_POINTER is not set +# CONFIG_UNWINDER_GUESS is not set +# end of x86 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking +# end of Kernel hacking diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index 735ac9339..556307163 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -1,20 +1,23 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/powerpc 5.5.0-openpower1 Kernel Configuration -# - -# -# Compiler: powerpc64le-linux-musl-gcc (GCC) 8.3.0 +# Linux/powerpc 6.6.16-openpower1 Kernel Configuration # +CONFIG_CC_VERSION_TEXT="powerpc64le-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 +CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y -CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_INLINE=y -CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y -CONFIG_BUILDTIME_EXTABLE_SORT=y +CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # @@ -22,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -29,12 +33,13 @@ CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_XZ is not set +CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y +# CONFIG_WATCH_QUEUE is not set # CONFIG_CROSS_MEMORY_ATTACH is not set # CONFIG_USELIB is not set # CONFIG_AUDIT is not set @@ -50,7 +55,6 @@ CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set @@ -61,6 +65,8 @@ CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -74,9 +80,22 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -100,8 +119,8 @@ CONFIG_CPU_ISOLATION=y # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set -CONFIG_SRCU=y CONFIG_TREE_SRCU=y +CONFIG_NEED_SRCU_NMI_SAFE=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem @@ -111,7 +130,7 @@ CONFIG_IKCONFIG_PROC=y # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=20 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +# CONFIG_PRINTK_INDEX is not set # # Scheduler features @@ -120,14 +139,15 @@ CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y # CONFIG_CGROUPS is not set # CONFIG_NAMESPACES is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set -# CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="../../talos-2/initrd.cpio" +CONFIG_INITRAMFS_SOURCE="../@BOARD_BUILD_DIR@/initrd.cpio" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 # CONFIG_RD_GZIP is not set @@ -136,14 +156,18 @@ CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_XZ=y # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set -CONFIG_INITRAMFS_COMPRESSION=".xz" +CONFIG_RD_ZSTD=y +CONFIG_INITRAMFS_COMPRESSION_XZ=y +# CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set +# CONFIG_INITRAMFS_COMPRESSION_NONE is not set +# CONFIG_BOOT_CONFIG is not set +CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION=y -# CONFIG_LD_DEAD_CODE_DATA_ELIMINATION is not set +CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_BPF=y CONFIG_EXPERT=y CONFIG_MULTIUSER=y CONFIG_SGETMASK_SYSCALL=y @@ -151,7 +175,6 @@ CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y @@ -167,14 +190,15 @@ CONFIG_IO_URING=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_SELFTEST is not set # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_CALLBACKS=y +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y CONFIG_RSEQ=y +CONFIG_CACHESTAT_SYSCALL=y # CONFIG_DEBUG_RSEQ is not set -# CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set @@ -184,19 +208,18 @@ CONFIG_HAVE_PERF_EVENTS=y CONFIG_PERF_EVENTS=y # end of Kernel Performance Events And Counters -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_SLUB_DEBUG=y -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -CONFIG_SLAB_FREELIST_HARDENED=y -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y CONFIG_SYSTEM_DATA_VERIFICATION=y # CONFIG_PROFILING is not set + +# +# Kexec and crash features +# +CONFIG_CRASH_CORE=y +CONFIG_KEXEC_CORE=y +CONFIG_KEXEC=y +# CONFIG_KEXEC_FILE is not set +# CONFIG_CRASH_DUMP is not set +# end of Kexec and crash features # end of General setup CONFIG_PPC64=y @@ -206,26 +229,28 @@ CONFIG_PPC64=y # CONFIG_PPC_BOOK3S_64=y # CONFIG_PPC_BOOK3E_64 is not set -# CONFIG_GENERIC_CPU is not set +# CONFIG_POWERPC64_CPU is not set # CONFIG_POWER7_CPU is not set # CONFIG_POWER8_CPU is not set CONFIG_POWER9_CPU=y +# CONFIG_POWER10_CPU is not set +# CONFIG_TOOLCHAIN_DEFAULT_CPU is not set CONFIG_TARGET_CPU_BOOL=y CONFIG_TARGET_CPU="power9" CONFIG_PPC_BOOK3S=y +CONFIG_PPC_FPU_REGS=y CONFIG_PPC_FPU=y CONFIG_ALTIVEC=y CONFIG_VSX=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_PPC_64S_HASH_MMU=y CONFIG_PPC_RADIX_MMU=y CONFIG_PPC_RADIX_MMU_DEFAULT=y -CONFIG_PPC_HAVE_KUEP=y CONFIG_PPC_KUEP=y -CONFIG_PPC_HAVE_KUAP=y CONFIG_PPC_KUAP=y # CONFIG_PPC_KUAP_DEBUG is not set -CONFIG_PPC_MM_SLICES=y +CONFIG_PPC_PKEY=y CONFIG_PPC_HAVE_PMU_SUPPORT=y +# CONFIG_PMU_SYSFS is not set CONFIG_PPC_PERF_CTRS=y CONFIG_FORCE_SMP=y CONFIG_SMP=y @@ -235,37 +260,37 @@ CONFIG_PPC_DOORBELL=y # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_PPC64_ELF_ABI_V2=y CONFIG_PPC64_BOOT_WRAPPER=y +CONFIG_CC_HAS_ELFV2=y CONFIG_64BIT=y CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MAX=29 CONFIG_ARCH_MMAP_RND_BITS_MIN=14 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=13 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=7 -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NR_IRQS=512 CONFIG_NMI_IPI=y CONFIG_PPC_WATCHDOG=y CONFIG_STACKTRACE_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_GENERIC_HWEIGHT=y CONFIG_PPC=y CONFIG_PPC_BARRIER_NOSPEC=y +CONFIG_PPC_HAS_LBARX_LHARX=y CONFIG_EARLY_PRINTK=y CONFIG_PANIC_TIMEOUT=180 -CONFIG_COMPAT=y -CONFIG_SYSVIPC_COMPAT=y +# CONFIG_COMPAT is not set CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_PPC_UDBG_16550=y CONFIG_AUDIT_ARCH=y CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_EPAPR_BOOT=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_NONZERO_CPU=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_PPC_DAWR=y CONFIG_PGTABLE_LEVELS=4 @@ -280,17 +305,18 @@ CONFIG_PPC_XIVE_NATIVE=y # CONFIG_PPC_POWERNV=y # CONFIG_OPAL_PRD is not set -# CONFIG_PPC_VAS is not set # CONFIG_SCOM_DEBUGFS is not set # CONFIG_PPC_PSERIES is not set +# CONFIG_PPC_VAS is not set # CONFIG_KVM_GUEST is not set # CONFIG_EPAPR_PARAVIRT is not set -CONFIG_PPC_NATIVE=y +CONFIG_PPC_HASH_MMU_NATIVE=y CONFIG_PPC_OF_BOOT_TRAMPOLINE=y CONFIG_PPC_DT_CPU_FTRS=y CONFIG_PPC_SMP_MUXED_IPI=y CONFIG_EEH=y CONFIG_PPC_P7_NAP=y +CONFIG_PPC_BOOK3S_IDLE=y CONFIG_PPC_INDIRECT_PIO=y # @@ -316,6 +342,7 @@ CONFIG_CPU_FREQ_GOV_ONDEMAND=y # # CPU frequency scaling drivers # +# CONFIG_CPUFREQ_DT_PLATDEV is not set CONFIG_POWERNV_CPUFREQ=y # end of CPU Frequency scaling @@ -353,41 +380,38 @@ CONFIG_HZ=100 CONFIG_SCHED_HRTICK=y # CONFIG_PPC_TRANSACTIONAL_MEM is not set # CONFIG_LD_HEAD_STUB_CATCH is not set -CONFIG_MPROFILE_KERNEL=y # CONFIG_HOTPLUG_CPU is not set -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +CONFIG_INTERRUPT_SANITIZE_REGISTERS=y +CONFIG_PPC_QUEUED_SPINLOCKS=y CONFIG_PPC64_SUPPORTS_MEMORY_FAILURE=y -CONFIG_KEXEC=y -# CONFIG_KEXEC_FILE is not set -# CONFIG_RELOCATABLE is not set -# CONFIG_CRASH_DUMP is not set +CONFIG_ARCH_SUPPORTS_KEXEC=y +CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y +CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y +CONFIG_RELOCATABLE=y +# CONFIG_RELOCATABLE_TEST is not set +CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y # CONFIG_FA_DUMP is not set # CONFIG_PRESERVE_FA_DUMP is not set # CONFIG_OPAL_CORE is not set CONFIG_IRQ_ALL_CPUS=y CONFIG_NUMA=y CONFIG_NODES_SHIFT=8 -CONFIG_USE_PERCPU_NUMA_NODE_ID=y CONFIG_HAVE_MEMORYLESS_NODES=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ILLEGAL_POINTER_VALUE=0x5deadbeef0000000 -CONFIG_NODES_SPAN_OTHER_NODES=y # CONFIG_PPC_4K_PAGES is not set CONFIG_PPC_64K_PAGES=y +CONFIG_PAGE_SIZE_64KB=y CONFIG_PPC_PAGE_SHIFT=16 CONFIG_THREAD_SHIFT=14 -CONFIG_ETEXT_SHIFT=16 CONFIG_DATA_SHIFT=24 -CONFIG_FORCE_MAX_ZONEORDER=9 +CONFIG_ARCH_FORCE_MAX_ORDER=8 # CONFIG_PPC_SUBPAGE_PROT is not set -CONFIG_PPC_COPRO_BASE=y +# CONFIG_PPC_PROT_SAO_LPAR is not set CONFIG_SCHED_SMT=y CONFIG_PPC_DENORMALISATION=y -CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="console=tty0 console=hvc0 powersave=off quiet" CONFIG_CMDLINE_FROM_BOOTLOADER=y # CONFIG_CMDLINE_EXTEND is not set @@ -395,7 +419,6 @@ CONFIG_CMDLINE_FROM_BOOTLOADER=y CONFIG_EXTRA_TARGETS="" # CONFIG_PM is not set # CONFIG_ENERGY_MODEL is not set -# CONFIG_SECCOMP is not set CONFIG_PPC_MEM_KEYS=y # end of Kernel options @@ -408,24 +431,29 @@ CONFIG_GENERIC_ISA_DMA=y # CONFIG_FSL_LBC is not set # end of Bus options +CONFIG_NONSTATIC_KERNEL=y CONFIG_PAGE_OFFSET=0xc000000000000000 CONFIG_KERNEL_START=0xc000000000000000 CONFIG_PHYSICAL_START=0x00000000 -CONFIG_ARCH_RANDOM=y # CONFIG_VIRTUALIZATION is not set -CONFIG_HAVE_LIVEPATCH=y # # Firmware Drivers # + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_GOOGLE_FIRMWARE=y +# CONFIG_GOOGLE_CBMEM is not set CONFIG_GOOGLE_COREBOOT_TABLE=y CONFIG_GOOGLE_COREBOOT_CBMEM=y CONFIG_GOOGLE_MEMCONSOLE=y CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y # CONFIG_GOOGLE_VPD is not set -CONFIG_EFI_EARLYCON=y # # Tegra firmware driver @@ -436,9 +464,7 @@ CONFIG_EFI_EARLYCON=y # # General architecture-dependent options # -CONFIG_CRASH_CORE=y -CONFIG_KEXEC_CORE=y -CONFIG_HAVE_OPROFILE=y +CONFIG_SMT_NUM_THREADS_DYNAMIC=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -451,61 +477,79 @@ CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_EVENTS_NMI=y -CONFIG_HAVE_NMI_WATCHDOG=y +CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HAVE_HARDLOCKUP_DETECTOR_ARCH=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y -CONFIG_HAVE_RCU_TABLE_FREE=y -CONFIG_HAVE_RCU_TABLE_NO_INVALIDATE=y -CONFIG_HAVE_MMU_GATHER_PAGE_SIZE=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_MMU_GATHER_PAGE_SIZE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y +CONFIG_ARCH_WANT_IRQS_OFF_ACTIVATE_MM=y +CONFIG_MMU_LAZY_TLB_SHOOTDOWN=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_WEAK_RELEASE_ACQUIRE=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y -CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y -CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y +CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +# CONFIG_SECCOMP is not set CONFIG_HAVE_STACKPROTECTOR=y -CONFIG_CC_HAS_STACKPROTECTOR_NONE=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_LTO_NONE=y +CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING=y CONFIG_ARCH_HAS_SCALED_CPUTIME=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=14 -CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y -CONFIG_ARCH_MMAP_RND_COMPAT_BITS=7 -CONFIG_HAVE_COPY_THREAD_TLS=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y CONFIG_HAVE_RELIABLE_STACKTRACE=y CONFIG_HAVE_ARCH_NVRAM_OPS=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND=y -CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y CONFIG_ARCH_HAS_PHYS_TO_DMA=y -CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y # # GCOV-based kernel profiling @@ -514,17 +558,21 @@ CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling -CONFIG_PLUGIN_HOSTCC="" CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +CONFIG_FUNCTION_ALIGNMENT=0 # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULE_SIG_FORMAT=y CONFIG_MODULES=y +# CONFIG_MODULE_DEBUG is not set # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_MODULE_SIG=y @@ -536,21 +584,25 @@ CONFIG_MODULE_SIG_ALL=y # CONFIG_MODULE_SIG_SHA384 is not set CONFIG_MODULE_SIG_SHA512=y CONFIG_MODULE_SIG_HASH="sha512" -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_CGROUP_PUNT_BIO=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types @@ -577,9 +629,10 @@ CONFIG_EFI_PARTITION=y # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types -CONFIG_BLOCK_COMPAT=y CONFIG_BLK_MQ_PCI=y CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -599,14 +652,17 @@ CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_MMIOWB=y CONFIG_MMIOWB=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y # # Executable file formats # CONFIG_BINFMT_ELF=y -CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y @@ -617,20 +673,42 @@ CONFIG_COREDUMP=y # # Memory Management options # +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB_DEPRECATED is not set +CONFIG_SLUB=y +# CONFIG_SLUB_TINY is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +CONFIG_SLAB_FREELIST_HARDENED=y +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# CONFIG_RANDOM_KMALLOC_CACHES is not set +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y -CONFIG_NEED_MULTIPLE_NODES=y -CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_HAVE_MEMBLOCK_NODE_MAP=y +CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_EXCLUSIVE_SYSTEM_RAM=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set +# CONFIG_PAGE_REPORTING is not set # CONFIG_MIGRATION is not set CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y @@ -639,20 +717,36 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set # CONFIG_TRANSPARENT_HUGEPAGE is not set -# CONFIG_CLEANCACHE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_USE_PERCPU_NUMA_NODE_ID=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_ARCH_HAS_PKEYS=y +CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set +# CONFIG_GUP_TEST is not set +# CONFIG_DMAPOOL_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_MEMFD_CREATE is not set +# CONFIG_ANON_VMA_NAME is not set +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set +CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y +CONFIG_PER_VMA_LOCK=y +CONFIG_LOCK_MM_AND_FIND_VMA=y + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -664,10 +758,12 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set +CONFIG_NET_HANDSHAKE=y CONFIG_INET=y CONFIG_IP_MULTICAST=y # CONFIG_IP_ADVANCED_ROUTER is not set @@ -678,11 +774,13 @@ CONFIG_NET_IP_TUNNEL=y # CONFIG_IP_MROUTE is not set CONFIG_SYN_COOKIES=y # CONFIG_NET_IPVTI is not set +CONFIG_NET_UDP_TUNNEL=y # CONFIG_NET_FOU is not set # CONFIG_NET_FOU_IP_TUNNELS is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y @@ -695,6 +793,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set # CONFIG_IPV6 is not set # CONFIG_NETLABEL is not set +# CONFIG_MPTCP is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set # CONFIG_NETFILTER is not set @@ -707,7 +806,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -726,13 +824,16 @@ CONFIG_DNS_RESOLVER=y # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set # CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y +CONFIG_MAX_SKB_FRAGS=17 CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -747,11 +848,13 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set CONFIG_AF_RXRPC=y # CONFIG_AF_RXRPC_INJECT_LOSS is not set +# CONFIG_AF_RXRPC_INJECT_RX_DELAY is not set # CONFIG_AF_RXRPC_DEBUG is not set # CONFIG_RXKAD is not set +# CONFIG_RXPERF is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -763,7 +866,7 @@ CONFIG_AF_RXRPC=y CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y # CONFIG_FAILOVER is not set -CONFIG_HAVE_EBPF_JIT=y +CONFIG_ETHTOOL_NETLINK=y # # Device Drivers @@ -781,13 +884,21 @@ CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_MSI_ARCH_FALLBACKS=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set +# CONFIG_PCI_DYNAMIC_OF_NODES is not set +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -795,20 +906,27 @@ CONFIG_PCI_QUIRKS=y # # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set +# CONFIG_PCIE_MICROCHIP_HOST is not set # CONFIG_PCIE_XILINX is not set # -# DesignWare PCI Core Support +# Cadence-based PCIe controllers +# +# CONFIG_PCIE_CADENCE_PLAT_HOST is not set +# CONFIG_PCI_J721E_HOST is not set +# end of Cadence-based PCIe controllers + +# +# DesignWare-based PCIe controllers # -# CONFIG_PCIE_DW_PLAT_HOST is not set # CONFIG_PCI_MESON is not set -# end of DesignWare PCI Core Support +# CONFIG_PCIE_DW_PLAT_HOST is not set +# end of DesignWare-based PCIe controllers # -# Cadence PCIe controllers support +# Mobiveil-based PCIe controllers # -# CONFIG_PCIE_CADENCE_PLAT_HOST is not set -# end of Cadence PCIe controllers support +# end of Mobiveil-based PCIe controllers # end of PCI controller drivers # @@ -823,6 +941,7 @@ CONFIG_PCI_QUIRKS=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -832,6 +951,7 @@ CONFIG_PCI_QUIRKS=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -842,6 +962,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader CONFIG_ALLOW_DEV_COREDUMP=y @@ -851,18 +972,40 @@ CONFIG_ALLOW_DEV_COREDUMP=y # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set +# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set # end of Generic Driver Options # # Bus devices # +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices +# +# Cache Drivers +# +# end of Cache Drivers + # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set @@ -881,6 +1024,10 @@ CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y + +# +# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. +# # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set @@ -929,9 +1076,21 @@ CONFIG_MTD_POWERNV_FLASH=y # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers +# +# NAND +# # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_RAW_NAND is not set +# +# ECC engine support +# +# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set +# CONFIG_MTD_NAND_ECC_SW_BCH is not set +# CONFIG_MTD_NAND_ECC_MXIC is not set +# end of ECC engine support +# end of NAND + # # LPDDR & LPDDR2 PCM memory drivers # @@ -957,14 +1116,10 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 @@ -972,7 +1127,7 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_ATA_OVER_ETH is not set # CONFIG_VIRTIO_BLK is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support @@ -980,9 +1135,11 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_HWMON is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -1004,9 +1161,11 @@ CONFIG_BLK_DEV_NVME=y # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set +# CONFIG_OPEN_DICE is not set +# CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set # @@ -1029,32 +1188,23 @@ CONFIG_BLK_DEV_NVME=y # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set - -# -# Intel MIC & related support -# -# CONFIG_VOP_BUS is not set -# end of Intel MIC & related support - # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_CXL is not set -CONFIG_OCXL_BASE=y -CONFIG_OCXL=m +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set -# CONFIG_HABANA_AI is not set +# CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y CONFIG_SCSI_NETLINK=y @@ -1066,8 +1216,8 @@ CONFIG_SCSI_PROC_FS=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_LOGGING is not set @@ -1090,7 +1240,6 @@ CONFIG_SCSI_LOWLEVEL=y # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set -CONFIG_CXLFLASH=m # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set @@ -1111,16 +1260,16 @@ CONFIG_MEGARAID_NEWGEN=y # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set # CONFIG_SCSI_MYRS is not set # CONFIG_LIBFC is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set @@ -1148,7 +1297,9 @@ CONFIG_SCSI_DH=y # end of SCSI device support CONFIG_ATA=y +CONFIG_SATA_HOST=y CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_FORCE=y CONFIG_SATA_PMP=y # @@ -1157,8 +1308,8 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_AHCI_CEVA is not set -# CONFIG_AHCI_QORIQ is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1230,7 +1381,7 @@ CONFIG_ATA_BMDMA=y # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set -# CONFIG_PATA_PLATFORM is not set +# CONFIG_PATA_OF_PLATFORM is not set # CONFIG_PATA_RZ1000 is not set # @@ -1240,6 +1391,7 @@ CONFIG_ATA_BMDMA=y # CONFIG_PATA_LEGACY is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set +CONFIG_MD_BITMAP_FILE=y # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=y @@ -1254,6 +1406,7 @@ CONFIG_DM_SNAPSHOT=y CONFIG_DM_THIN_PROVISIONING=y # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set @@ -1283,16 +1436,15 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set # CONFIG_NETDEVICES is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1327,6 +1479,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y @@ -1352,14 +1505,15 @@ CONFIG_MOUSE_PS2_SMBUS=y # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y -CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set +# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP5 is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set @@ -1368,7 +1522,10 @@ CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set @@ -1381,8 +1538,9 @@ CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set +# CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_INEXIO is not set -# CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set @@ -1401,12 +1559,14 @@ CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_IQS7211 is not set +# CONFIG_TOUCHSCREEN_ZINITIX is not set +# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set -# CONFIG_INPUT_MSM_VIBRATOR is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set @@ -1416,7 +1576,11 @@ CONFIG_INPUT_MISC=y # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IQS269A is not set +# CONFIG_INPUT_IQS626A is not set +# CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set @@ -1455,15 +1619,8 @@ CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_NOZOMI is not set -# CONFIG_N_GSM is not set -# CONFIG_TRACE_SINK is not set -# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set -# CONFIG_NULL_TTY is not set +CONFIG_LEGACY_TIOCSTI=y CONFIG_LDISC_AUTOLOAD=y -CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # # Serial drivers @@ -1471,16 +1628,20 @@ CONFIG_DEVMEM=y CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_PCILIB=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_EXAR=y CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_PCI1XXXX is not set CONFIG_SERIAL_8250_FSL=y # CONFIG_SERIAL_8250_DW is not set # CONFIG_SERIAL_8250_RT288X is not set +CONFIG_SERIAL_8250_PERICOM=y # CONFIG_SERIAL_OF_PLATFORM is not set # @@ -1503,13 +1664,18 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # end of Serial drivers -# CONFIG_SERIAL_DEV_BUS is not set -CONFIG_TTY_PRINTK=y -CONFIG_TTY_PRINTK_LEVEL=6 +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set +# CONFIG_N_GSM is not set +# CONFIG_NOZOMI is not set +# CONFIG_NULL_TTY is not set CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_OPAL=y # CONFIG_HVC_UDBG is not set +# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_TTY_PRINTK=y +CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set CONFIG_POWERNV_OP_PANEL=m CONFIG_IPMI_HANDLER=y @@ -1522,28 +1688,31 @@ CONFIG_IPMI_POWERNV=y # CONFIG_IPMI_POWEROFF is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set +# CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_VIRTIO is not set CONFIG_HW_RANDOM_POWERNV=y -CONFIG_NVRAM=y +# CONFIG_HW_RANDOM_CCTRNG is not set +# CONFIG_HW_RANDOM_XIPHERA is not set # CONFIG_APPLICOM is not set -# CONFIG_RAW_DRIVER is not set +CONFIG_DEVMEM=y +CONFIG_NVRAM=y +CONFIG_DEVPORT=y # CONFIG_HANGCHECK_TIMER is not set CONFIG_TCG_TPM=y CONFIG_HW_RANDOM_TPM=y # CONFIG_TCG_TIS is not set +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set CONFIG_TCG_TIS_I2C_INFINEON=y CONFIG_TCG_TIS_I2C_NUVOTON=y # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_VTPM_PROXY is not set # CONFIG_TCG_TIS_ST33ZP24_I2C is not set -CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set +# CONFIG_XILLYUSB is not set # end of Character devices -CONFIG_RANDOM_TRUST_CPU=y -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set - # # I2C support # @@ -1601,7 +1770,8 @@ CONFIG_I2C_ALGOBIT=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1610,6 +1780,7 @@ CONFIG_I2C_ALGOBIT=y # Other I2C/SMBus bus drivers # CONFIG_I2C_OPAL=y +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1629,6 +1800,7 @@ CONFIG_I2C_OPAL=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1638,17 +1810,18 @@ CONFIG_I2C_OPAL=y # CONFIG_PINCTRL is not set # CONFIG_GPIOLIB is not set # CONFIG_W1 is not set -# CONFIG_POWER_AVS is not set # CONFIG_POWER_RESET is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y -# CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set +# CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1656,10 +1829,15 @@ CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set @@ -1673,16 +1851,22 @@ CONFIG_HWMON=y # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AHT10 is not set +# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_ASPEED is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_CORSAIR_PSU is not set +# CONFIG_SENSORS_DRIVETEMP is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set @@ -1692,6 +1876,7 @@ CONFIG_HWMON=y # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_HS3001 is not set # CONFIG_SENSORS_IBMAEM is not set # CONFIG_SENSORS_IBMPEX is not set CONFIG_SENSORS_IBMPOWERNV=y @@ -1707,18 +1892,26 @@ CONFIG_SENSORS_IBMPOWERNV=y # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX31760 is not set +# CONFIG_MAX31827 is not set +# CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MC34VR500 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_TPS23861 is not set +# CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set @@ -1734,27 +1927,33 @@ CONFIG_SENSORS_IBMPOWERNV=y # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_NZXT_KRAKEN2 is not set +# CONFIG_SENSORS_NZXT_SMART2 is not set +# CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set +# CONFIG_SENSORS_SBTSI is not set +# CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set @@ -1763,6 +1962,7 @@ CONFIG_SENSORS_IBMPOWERNV=y # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT8231 is not set @@ -1786,6 +1986,7 @@ CONFIG_BCMA_POSSIBLE=y # # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_SMPRO is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_ATMEL_FLEXCOM is not set @@ -1793,7 +1994,9 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_CS42L43_I2C is not set # CONFIG_MFD_MADERA is not set +# CONFIG_MFD_MAX5970 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set @@ -1801,45 +2004,52 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_GATEWORKS_GSC is not set # CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_HTC_PASIC3 is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set +# CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77541 is not set # CONFIG_MFD_MAX77620 is not set # CONFIG_MFD_MAX77650 is not set # CONFIG_MFD_MAX77686 is not set # CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77714 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_NTXEC is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_RK808 is not set +# CONFIG_MFD_RK8XX_I2C is not set # CONFIG_MFD_RN5T618 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_MFD_SMSC is not set -# CONFIG_ABX500_CORE is not set # CONFIG_MFD_STMPE is not set # CONFIG_MFD_SYSCON is not set -# CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set @@ -1852,9 +2062,10 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS65219 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set +# CONFIG_MFD_TPS6594_I2C is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1869,36 +2080,51 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set -# CONFIG_MFD_ROHM_BD70528 is not set +# CONFIG_MFD_ROHM_BD71828 is not set +# CONFIG_MFD_ROHM_BD957XMUF is not set # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set +# CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_QCOM_PM8008 is not set +# CONFIG_MFD_RSMU_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# +# CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y +CONFIG_VIDEO_CMDLINE=y +CONFIG_VIDEO_NOMODESET=y +# CONFIG_AUXDISPLAY is not set # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 CONFIG_DRM=y -# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +CONFIG_DRM_DISPLAY_HELPER=y +CONFIG_DRM_DISPLAY_DP_HELPER=y +# CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_TTM=y -CONFIG_DRM_VRAM_HELPER=y CONFIG_DRM_TTM_HELPER=y +CONFIG_DRM_GEM_SHMEM_HELPER=y +CONFIG_DRM_SUBALLOC_HELPER=y # # I2C encoder or helper chips @@ -1917,23 +2143,13 @@ CONFIG_DRM_TTM_HELPER=y CONFIG_DRM_RADEON=y # CONFIG_DRM_RADEON_USERPTR is not set # CONFIG_DRM_AMDGPU is not set - -# -# ACP (Audio CoProcessor) Configuration -# -# end of ACP (Audio CoProcessor) Configuration - # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_UDL is not set CONFIG_DRM_AST=y # CONFIG_DRM_MGAG200 is not set -# CONFIG_DRM_CIRRUS_QEMU is not set -# CONFIG_DRM_RCAR_DW_HDMI is not set -# CONFIG_DRM_RCAR_LVDS is not set # CONFIG_DRM_QXL is not set -# CONFIG_DRM_BOCHS is not set # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y @@ -1941,8 +2157,10 @@ CONFIG_DRM_PANEL=y # Display Panels # # CONFIG_DRM_PANEL_LVDS is not set -# CONFIG_DRM_PANEL_SIMPLE is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # end of Display Panels @@ -1953,53 +2171,62 @@ CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # -# CONFIG_DRM_ANALOGIX_ANX78XX is not set -# CONFIG_DRM_CDNS_DSI is not set -# CONFIG_DRM_DUMB_VGA_DAC is not set -# CONFIG_DRM_LVDS_ENCODER is not set +# CONFIG_DRM_CHIPONE_ICN6211 is not set +# CONFIG_DRM_CHRONTEL_CH7033 is not set +# CONFIG_DRM_DISPLAY_CONNECTOR is not set +# CONFIG_DRM_ITE_IT6505 is not set +# CONFIG_DRM_LONTIUM_LT8912B is not set +# CONFIG_DRM_LONTIUM_LT9211 is not set +# CONFIG_DRM_LONTIUM_LT9611 is not set +# CONFIG_DRM_LONTIUM_LT9611UXC is not set +# CONFIG_DRM_ITE_IT66121 is not set +# CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NXP_PTN3460 is not set # CONFIG_DRM_PARADE_PS8622 is not set +# CONFIG_DRM_PARADE_PS8640 is not set # CONFIG_DRM_SIL_SII8620 is not set # CONFIG_DRM_SII902X is not set # CONFIG_DRM_SII9234 is not set +# CONFIG_DRM_SIMPLE_BRIDGE is not set # CONFIG_DRM_THINE_THC63LVD1024 is not set +# CONFIG_DRM_TOSHIBA_TC358762 is not set # CONFIG_DRM_TOSHIBA_TC358764 is not set # CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TOSHIBA_TC358768 is not set +# CONFIG_DRM_TOSHIBA_TC358775 is not set +# CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set +# CONFIG_DRM_TI_TPD12S015 is not set +# CONFIG_DRM_ANALOGIX_ANX6345 is not set +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +# CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set +# CONFIG_DRM_CDNS_DSI is not set +# CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges +# CONFIG_DRM_LOONGSON is not set # CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_LOGICVC is not set # CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_BOCHS is not set +# CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_OFDRM is not set +# CONFIG_DRM_SIMPLEDRM is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y # # Frame buffer Devices # -CONFIG_FB_CMDLINE=y -CONFIG_FB_NOTIFY=y CONFIG_FB=y -CONFIG_FIRMWARE_EDID=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_DEFERRED_IO=y CONFIG_FB_MACMODES=y -# CONFIG_FB_MODE_HELPERS is not set -CONFIG_FB_TILEBLITTING=y - -# -# Frame buffer hardware drivers -# # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set @@ -2040,6 +2267,24 @@ CONFIG_FB_MATROX_G=y # CONFIG_FB_MB862XX is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SM712 is not set +CONFIG_FB_CORE=y +CONFIG_FB_NOTIFY=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_DEVICE=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_IOMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y +# CONFIG_FB_MODE_HELPERS is not set +CONFIG_FB_TILEBLITTING=y # end of Frame buffer Devices # @@ -2047,7 +2292,7 @@ CONFIG_FB_MATROX_G=y # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y -# CONFIG_BACKLIGHT_GENERIC is not set +# CONFIG_BACKLIGHT_KTZ8866 is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set @@ -2063,13 +2308,11 @@ CONFIG_HDMI=y # Console display driver support # CONFIG_VGA_CONSOLE=y -CONFIG_VGACON_SOFT_SCROLLBACK=y -CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64 -# CONFIG_VGACON_SOFT_SCROLLBACK_PERSISTENT_ENABLE_BY_DEFAULT is not set CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -2081,11 +2324,9 @@ CONFIG_LOGO=y CONFIG_LOGO_LINUX_CLUT224=y # end of Graphics support +# CONFIG_DRM_ACCEL is not set # CONFIG_SOUND is not set - -# -# HID support -# +CONFIG_HID_SUPPORT=y CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set # CONFIG_HIDRAW is not set @@ -2098,7 +2339,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -2114,15 +2354,21 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set +# CONFIG_HID_EVISION is not set # CONFIG_HID_EZKEY is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set +# CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set +# CONFIG_HID_GOOGLE_STADIA_FF is not set +# CONFIG_HID_VIVALDI is not set # CONFIG_HID_KEYTOUCH is not set # CONFIG_HID_KYE is not set # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -2131,9 +2377,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -2146,11 +2394,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -2160,6 +2412,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -2168,8 +2421,14 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set +# CONFIG_HID_MCP2221 is not set # end of Special HID drivers +# +# HID-BPF support +# +# end of HID-BPF support + # # USB HID support # @@ -2185,13 +2444,7 @@ CONFIG_USB_HIDDEV=y # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# # CONFIG_I2C_HID is not set -# end of I2C HID support -# end of HID support - CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y @@ -2205,9 +2458,10 @@ CONFIG_USB_PCI=y # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set # CONFIG_USB_DYNAMIC_MINORS is not set -# CONFIG_USB_OTG_WHITELIST is not set -# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=y @@ -2218,6 +2472,7 @@ CONFIG_USB_MON=y CONFIG_USB_XHCI_HCD=m # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=m +# CONFIG_USB_XHCI_PCI_RENESAS is not set # CONFIG_USB_XHCI_PLATFORM is not set CONFIG_USB_EHCI_HCD=m # CONFIG_USB_EHCI_ROOT_HUB_TT is not set @@ -2228,7 +2483,6 @@ CONFIG_USB_EHCI_PCI=m # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_FOTG210_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set # CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set @@ -2277,7 +2531,11 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set + +# +# USB dual-mode controller drivers +# +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2301,8 +2559,8 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set @@ -2317,6 +2575,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set +# CONFIG_USB_ONBOARD_HUB is not set # # USB Physical Layer drivers @@ -2329,6 +2588,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2364,6 +2624,7 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_HYM8563 is not set # CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_NCT3018Y is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set @@ -2383,6 +2644,7 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set @@ -2397,6 +2659,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2413,9 +2676,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set CONFIG_RTC_DRV_OPAL=y # CONFIG_RTC_DRV_ZYNQMP is not set @@ -2425,12 +2686,12 @@ CONFIG_RTC_DRV_OPAL=y # CONFIG_RTC_DRV_GENERIC is not set # CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_SNVS is not set # CONFIG_RTC_DRV_R7301 is not set # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2438,21 +2699,30 @@ CONFIG_RTC_DRV_OPAL=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options -# CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set CONFIG_VIRT_DRIVERS=y +CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y +CONFIG_VIRTIO_PCI_LIB=y +CONFIG_VIRTIO_PCI_LIB_LEGACY=y CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI_LEGACY=y # CONFIG_VIRTIO_BALLOON is not set # CONFIG_VIRTIO_INPUT is not set # CONFIG_VIRTIO_MMIO is not set +# CONFIG_VDPA is not set +CONFIG_VHOST_MENU=y +# CONFIG_VHOST_NET is not set +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support @@ -2460,45 +2730,17 @@ CONFIG_VIRTIO_PCI_LEGACY=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set -CONFIG_STAGING=y # CONFIG_COMEDI is not set +CONFIG_STAGING=y # CONFIG_RTS5208 is not set # CONFIG_FB_SM750 is not set - -# -# Speakup console speech -# -# CONFIG_SPEAKUP is not set -# end of Speakup console speech - # CONFIG_STAGING_MEDIA is not set - -# -# Android -# -# end of Android - # CONFIG_LTE_GDM724X is not set -# CONFIG_GS_FPGABOOT is not set -# CONFIG_UNISYSSPAR is not set - -# -# Gasket devices -# -# end of Gasket devices - # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set -# CONFIG_USB_WUSB_CBAF is not set -# CONFIG_UWB is not set -CONFIG_EXFAT_FS=y -CONFIG_EXFAT_DISCARD=y -# CONFIG_EXFAT_DELAYED_SYNC is not set -# CONFIG_EXFAT_KERNEL_DEBUG is not set -# CONFIG_EXFAT_DEBUG_MSG is not set -CONFIG_EXFAT_DEFAULT_CODEPAGE=437 -CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +# CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set +# CONFIG_COMMON_CLK is not set # CONFIG_HWSPINLOCK is not set # @@ -2516,8 +2758,11 @@ CONFIG_IOMMU_SUPPORT=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set +CONFIG_IOMMU_DEFAULT_DMA_STRICT=y +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_OF_IOMMU=y +# CONFIG_IOMMUFD is not set CONFIG_SPAPR_TCE_IOMMU=y # @@ -2543,11 +2788,6 @@ CONFIG_SPAPR_TCE_IOMMU=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2556,13 +2796,27 @@ CONFIG_SPAPR_TCE_IOMMU=y # # NXP/Freescale QorIQ SoC drivers # +# CONFIG_QUICC_ENGINE is not set # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# CONFIG_LITEX_SOC_CONTROLLER is not set +# end of Enable LiteX SoC Builder specific drivers + +# CONFIG_WPCM450_SOC is not set + # # Qualcomm SoC drivers # @@ -2573,7 +2827,6 @@ CONFIG_SPAPR_TCE_IOMMU=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2582,7 +2835,6 @@ CONFIG_SPAPR_TCE_IOMMU=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2590,6 +2842,7 @@ CONFIG_SPAPR_TCE_IOMMU=y # CONFIG_IRQCHIP=y # CONFIG_AL_FIC is not set +# CONFIG_XILINX_INTC is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set @@ -2599,11 +2852,17 @@ CONFIG_IRQCHIP=y # PHY Subsystem # # CONFIG_GENERIC_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_PHY_CADENCE_DP is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_CADENCE_DPHY is not set -# CONFIG_PHY_FSL_IMX8MQ_USB is not set -# CONFIG_PHY_MIXEL_MIPI_DPHY is not set +# CONFIG_PHY_CADENCE_DPHY_RX is not set +# CONFIG_PHY_CADENCE_SALVO is not set # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # end of PHY Subsystem @@ -2617,11 +2876,12 @@ CONFIG_IRQCHIP=y # end of Performance monitor support # CONFIG_RAS is not set +# CONFIG_USB4 is not set # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set @@ -2629,6 +2889,16 @@ CONFIG_DAX=y CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y +# +# Layout Types +# +# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set +# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set +# end of Layout Types + +# CONFIG_NVMEM_RMEM is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set + # # HW tracing support # @@ -2642,6 +2912,8 @@ CONFIG_NVMEM_SYSFS=y # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2650,6 +2922,8 @@ CONFIG_NVMEM_SYSFS=y CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_VALIDATE_FS_PARSER is not set CONFIG_FS_IOMAP=y +CONFIG_BUFFER_HEAD=y +CONFIG_LEGACY_DIRECT_IO=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set CONFIG_EXT4_FS=y @@ -2672,10 +2946,11 @@ CONFIG_JFS_SECURITY=y # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_XFS_FS=y +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_SUPPORT_ASCII_CI=y CONFIG_XFS_QUOTA=y CONFIG_XFS_POSIX_ACL=y CONFIG_XFS_RT=y -# CONFIG_XFS_ONLINE_SCRUB is not set CONFIG_XFS_DEBUG=y CONFIG_XFS_ASSERT_FATAL=y # CONFIG_GFS2_FS is not set @@ -2694,12 +2969,12 @@ CONFIG_F2FS_FS_POSIX_ACL=y # CONFIG_F2FS_FS_SECURITY is not set CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FAULT_INJECTION is not set -CONFIG_FS_DAX=y +# CONFIG_F2FS_FS_COMPRESSION is not set +CONFIG_F2FS_IOSTAT=y CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_EXPORTFS_BLOCK_OPS=y CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y @@ -2708,12 +2983,10 @@ CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set -CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y -# CONFIG_AUTOFS4_FS is not set # CONFIG_AUTOFS_FS is not set # CONFIG_FUSE_FS is not set # CONFIG_OVERLAY_FS is not set @@ -2721,6 +2994,8 @@ CONFIG_QUOTACTL=y # # Caches # +CONFIG_NETFS_SUPPORT=y +# CONFIG_NETFS_STATS is not set # CONFIG_FSCACHE is not set # end of Caches @@ -2734,7 +3009,7 @@ CONFIG_UDF_FS=y # end of CD-ROM/DVD Filesystems # -# DOS/FAT/NT Filesystems +# DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y @@ -2742,8 +3017,11 @@ CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_EXFAT_FS=y +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set -# end of DOS/FAT/NT Filesystems +# CONFIG_NTFS3_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems @@ -2755,11 +3033,9 @@ CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -CONFIG_TMPFS_POSIX_ACL=y -CONFIG_TMPFS_XATTR=y +# CONFIG_TMPFS is not set +CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -2788,8 +3064,10 @@ CONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set +# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set +CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y # CONFIG_SQUASHFS_LZ4 is not set @@ -2816,28 +3094,32 @@ CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y -# CONFIG_NFS_SWAP is not set CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_BLOCK=y -CONFIG_PNFS_FLEXFILE_LAYOUT=m +CONFIG_PNFS_FLEXFILE_LAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" CONFIG_NFS_V4_1_MIGRATION=y CONFIG_NFS_V4_SECURITY_LABEL=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y +CONFIG_NFS_DISABLE_UDP_SUPPORT=y +CONFIG_NFS_V4_2_READ_PLUS=y # CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y +CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y +CONFIG_RPCSEC_GSS_KRB5=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set +# CONFIG_SMB_SERVER is not set # CONFIG_CODA_FS is not set CONFIG_AFS_FS=y # CONFIG_AFS_DEBUG is not set @@ -2893,6 +3175,7 @@ CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y +CONFIG_NLS_UCS2_UTILS=y # CONFIG_UNICODE is not set CONFIG_IO_WQ=y # end of File systems @@ -2903,16 +3186,15 @@ CONFIG_IO_WQ=y CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set -# CONFIG_BIG_KEYS is not set # CONFIG_TRUSTED_KEYS is not set CONFIG_ENCRYPTED_KEYS=y +# CONFIG_USER_DECRYPTED_DATA is not set # CONFIG_KEY_DH_OPERATIONS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y CONFIG_SECURITYFS=y # CONFIG_SECURITY_NETWORK is not set # CONFIG_SECURITY_PATH is not set -CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set @@ -2923,6 +3205,7 @@ CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_SECURITY_YAMA is not set # CONFIG_SECURITY_SAFESETID is not set # CONFIG_SECURITY_LOCKDOWN_LSM is not set +# CONFIG_SECURITY_LANDLOCK is not set CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set # CONFIG_IMA is not set @@ -2940,9 +3223,23 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +# +# Hardening of kernel data structures +# +# CONFIG_LIST_HARDENED is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Hardening of kernel data structures + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2956,6 +3253,7 @@ CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SIG2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y @@ -2976,6 +3274,7 @@ CONFIG_CRYPTO_NULL2=y CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set +# end of Crypto core or helper # # Public-key cryptography @@ -2983,94 +3282,95 @@ CONFIG_CRYPTO_AUTHENC=y CONFIG_CRYPTO_RSA=y # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +CONFIG_CRYPTO_ARC4=y +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -# CONFIG_CRYPTO_CRC32C_VPMSUM is not set -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_XXHASH=y CONFIG_CRYPTO_BLAKE2B=y -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +CONFIG_CRYPTO_CMAC=y # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set +CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MD5_PPC=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_PPC=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set +CONFIG_CRYPTO_XXHASH=y +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_ANUBIS is not set -CONFIG_CRYPTO_ARC4=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_TWOFISH is not set +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32=y +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -3081,34 +3381,41 @@ CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (powerpc) # -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CRC32C_VPMSUM is not set +CONFIG_CRYPTO_MD5_PPC=y +CONFIG_CRYPTO_SHA1_PPC=y +# CONFIG_CRYPTO_AES_GCM_P10 is not set +# CONFIG_CRYPTO_CHACHA20_P10 is not set +# CONFIG_CRYPTO_POLY1305_P10 is not set +# end of Accelerated Cryptographic Algorithms for CPU (powerpc) + # CONFIG_CRYPTO_HW is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y @@ -3117,11 +3424,14 @@ CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set +# CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_MODULE_SIG_KEY="certs/signing_key.pem" +CONFIG_MODULE_SIG_KEY_TYPE_RSA=y +# CONFIG_MODULE_SIG_KEY_TYPE_ECDSA is not set CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set @@ -3140,13 +3450,33 @@ CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y # CONFIG_CORDIC is not set +# CONFIG_PRIME_NUMBERS is not set CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -3165,6 +3495,7 @@ CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y +CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y @@ -3174,24 +3505,32 @@ CONFIG_XZ_DEC_POWERPC=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_INTERVAL_TREE=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y +CONFIG_DMA_OPS=y +CONFIG_DMA_OPS_BYPASS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_DMA_DEFAULT_COHERENT=y # CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y CONFIG_IOMMU_HELPER=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -3202,18 +3541,25 @@ CONFIG_IRQ_POLL=y CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_ARCH_HAS_MEMREMAP_COMPAT_ALIGN=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y -CONFIG_ARCH_HAS_UACCESS_MCSAFE=y +CONFIG_ARCH_HAS_COPY_MC=y +CONFIG_ARCH_STACKWALK=y +CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines +CONFIG_GENERIC_IOREMAP=y + # # Kernel hacking # @@ -3223,26 +3569,35 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DYNAMIC_DEBUG_CORE is not set CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_MISC=y + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -CONFIG_ENABLE_MUST_CHECK=y +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set -CONFIG_OPTIMIZE_INLINING=y # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -3252,41 +3607,64 @@ CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set -CONFIG_UBSAN_ALIGNMENT=y +CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_MISC=y +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_STATS is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_GENERIC_PTDUMP=y +# CONFIG_PTDUMP_DEBUGFS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_PER_VMA_LOCK_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SHRINKER_DEBUG is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_DEBUG_STACKOVERFLOW=y CONFIG_DEBUG_STACKOVERFLOW=y +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_ARCH_DISABLE_KASAN_INLINE=y CONFIG_CC_HAS_KASAN_GENERIC=y -CONFIG_KASAN_STACK=1 +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -3299,15 +3677,18 @@ CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1 +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y CONFIG_HARDLOCKUP_DETECTOR=y +# CONFIG_HARDLOCKUP_DETECTOR_PERF is not set +# CONFIG_HARDLOCKUP_DETECTOR_BUDDY is not set +CONFIG_HARDLOCKUP_DETECTOR_ARCH=y CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y +# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set +# CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # @@ -3336,9 +3717,12 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) -# CONFIG_STACKTRACE is not set +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3349,28 +3733,27 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures -# CONFIG_DEBUG_CREDENTIALS is not set - # # RCU Debugging # -# CONFIG_RCU_PERF_TEST is not set +# CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 +# CONFIG_RCU_CPU_STALL_CPUTIME is not set CONFIG_RCU_TRACE=y # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y @@ -3395,6 +3778,7 @@ CONFIG_JUMP_LABEL_FEATURE_CHECKS=y # CONFIG_FTR_FIXUP_SELFTEST is not set # CONFIG_MSI_BITMAP_SELFTEST is not set # CONFIG_PPC_IRQ_SOFT_MASK_DEBUG is not set +# CONFIG_PPC_RFI_SRR_DEBUG is not set CONFIG_XMON=y CONFIG_XMON_DEFAULT=y CONFIG_XMON_DISASSEMBLY=y @@ -3402,7 +3786,6 @@ CONFIG_XMON_DEFAULT_RO_MODE=y CONFIG_DEBUGGER=y # CONFIG_BOOTX_TEXT is not set # CONFIG_PPC_EARLY_DEBUG is not set -# CONFIG_PPC_PTDUMP is not set # CONFIG_PPC_FAST_ENDIAN_SWITCH is not set # end of powerpc Debugging @@ -3416,29 +3799,31 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y +# CONFIG_TEST_DHRY is not set # CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_TEST_SORT is not set +# CONFIG_TEST_MIN_HEAP is not set +# CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set +# CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_BITFIELD is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set +# CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set @@ -3449,8 +3834,14 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_STACKINIT is not set # CONFIG_TEST_MEMINIT is not set +# CONFIG_TEST_FREE_PAGES is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-w541.config b/config/linux-w541.config index fd144e3e0..3f5cc9cb0 100644 --- a/config/linux-w541.config +++ b/config/linux-w541.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -62,6 +66,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -78,6 +83,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -89,11 +96,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -117,7 +139,6 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 @@ -134,12 +155,15 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -154,12 +178,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -167,7 +192,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -183,10 +207,8 @@ CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -199,17 +221,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -231,17 +242,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -252,12 +256,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -# CONFIG_RETPOLINE is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -292,11 +294,13 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y @@ -307,7 +311,6 @@ CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -319,7 +322,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -328,16 +330,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -355,22 +355,32 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -385,13 +395,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -419,9 +429,11 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -445,6 +457,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -474,57 +488,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_SMI is not set -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - -# -# EFI (Extensible Firmware Interface) Support -# -# CONFIG_EFI_VARS is not set -CONFIG_EFI_ESRT=y -CONFIG_EFI_RUNTIME_MAP=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -539,8 +511,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -552,8 +522,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -562,9 +535,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -575,6 +550,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -586,36 +562,65 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -624,6 +629,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -634,19 +641,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -660,6 +669,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -699,38 +710,71 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -742,6 +786,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -752,12 +797,13 @@ CONFIG_INET=y # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set -# CONFIG_SYN_COOKIES is not set +CONFIG_SYN_COOKIES=y # CONFIG_NET_IPVTI is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -776,10 +822,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -799,12 +843,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -819,8 +864,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -831,7 +876,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -864,6 +908,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -901,6 +947,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -910,6 +957,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -920,6 +968,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -939,9 +988,54 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -959,27 +1053,28 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -1002,9 +1097,9 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # @@ -1033,21 +1128,21 @@ CONFIG_INTEL_MEI_TXE=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1059,6 +1154,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1093,7 +1189,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set @@ -1102,8 +1197,8 @@ CONFIG_ISCSI_TCP=y # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set # CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_MYRB is not set @@ -1112,7 +1207,6 @@ CONFIG_ISCSI_TCP=y # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set @@ -1145,6 +1239,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1195,6 +1290,7 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y +CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set @@ -1215,12 +1311,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1232,21 +1322,23 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1265,24 +1357,28 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1290,9 +1386,9 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -1300,6 +1396,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1307,6 +1404,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1316,27 +1414,71 @@ CONFIG_E1000E_HWTS=y # CONFIG_PPP is not set # CONFIG_SLIP is not set -# CONFIG_USB_NET_DRIVERS is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1370,6 +1512,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1426,6 +1569,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1449,7 +1593,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 @@ -1466,9 +1609,7 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1476,6 +1617,8 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set @@ -1487,10 +1630,10 @@ CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1567,6 +1710,8 @@ CONFIG_I2C_ALGOBIT=y # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set @@ -1575,6 +1720,7 @@ CONFIG_I2C_ALGOBIT=y # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set @@ -1596,6 +1742,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1609,12 +1756,14 @@ CONFIG_I2C_SLAVE=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set +# CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set @@ -1622,10 +1771,14 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1645,6 +1798,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1655,6 +1809,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1687,6 +1844,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set @@ -1701,19 +1859,21 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set @@ -1727,7 +1887,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1739,21 +1898,28 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1846,6 +2012,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1871,7 +2038,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1898,6 +2064,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1906,9 +2074,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1921,11 +2091,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1935,6 +2109,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -1963,7 +2138,7 @@ CONFIG_USB_HID=m # # I2C HID support # -# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_ACPI is not set # end of I2C HID support # @@ -1971,6 +2146,12 @@ CONFIG_USB_HID=m # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2055,7 +2236,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2108,6 +2289,7 @@ CONFIG_USB_STORAGE=m # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set # CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2176,6 +2358,7 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2204,16 +2387,18 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2230,13 +2415,66 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_MAX9485 is not set @@ -2245,6 +2483,7 @@ CONFIG_COMMON_CLK=y # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2268,7 +2507,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2302,11 +2545,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2317,11 +2555,21 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2332,7 +2580,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2341,7 +2588,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2357,7 +2603,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2377,16 +2630,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2396,11 +2649,12 @@ CONFIG_NVMEM_SYSFS=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2426,10 +2680,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2468,6 +2720,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2475,21 +2728,18 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2559,12 +2809,9 @@ CONFIG_IO_WQ=y # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITYFS=y -CONFIG_PAGE_TABLE_ISOLATION=y # CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set @@ -2579,9 +2826,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2614,7 +2869,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2622,114 +2877,90 @@ CONFIG_CRYPTO_GLUE_HELPER_X86=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -# CONFIG_CRYPTO_AES is not set -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2740,13 +2971,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2754,19 +2991,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2782,7 +3047,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2791,9 +3055,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2814,6 +3095,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2831,6 +3113,7 @@ CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2852,7 +3135,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2864,6 +3146,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2874,19 +3157,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2905,22 +3195,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -2932,11 +3228,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -2950,16 +3251,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -2993,6 +3291,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3005,6 +3304,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3016,36 +3316,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3078,6 +3382,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-x230-flash.config b/config/linux-x230-flash.config index 1e115d137..4c1085643 100644 --- a/config/linux-x230-flash.config +++ b/config/linux-x230-flash.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_WATCH_QUEUE is not set # CONFIG_CROSS_MEMORY_ATTACH is not set @@ -60,6 +64,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -76,6 +81,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -87,11 +94,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -131,12 +153,15 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -164,7 +189,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -180,10 +204,8 @@ CONFIG_SHMEM=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -196,17 +218,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -228,17 +239,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -286,22 +290,23 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=64 +CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -313,7 +318,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -322,16 +326,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set -# CONFIG_X86_UMIP is not set +CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -347,22 +349,32 @@ CONFIG_HZ=250 # CONFIG_KEXEC_FILE is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -438,6 +450,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -528,8 +542,6 @@ CONFIG_AS_TPAUSE=y # CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -541,8 +553,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -551,9 +566,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -564,6 +581,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -575,36 +593,65 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -613,6 +660,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -623,19 +672,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -649,6 +700,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -688,38 +741,71 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options # CONFIG_NET is not set @@ -734,7 +820,11 @@ CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set -# CONFIG_PCIEASPM is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y @@ -752,6 +842,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -789,6 +881,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -798,6 +891,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -808,6 +902,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -912,29 +1007,30 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # end of Texas Instruments shared transport line discipline -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set +# +# Altera FPGA firmware download module (requires I2C) +# CONFIG_INTEL_MEI=m CONFIG_INTEL_MEI_ME=m CONFIG_INTEL_MEI_TXE=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -946,6 +1042,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -975,6 +1072,7 @@ CONFIG_ATA_ACPI=y # # CONFIG_SATA_AHCI is not set # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1017,20 +1115,8 @@ CONFIG_INPUT=y # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set @@ -1074,7 +1160,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_LDISC_AUTOLOAD is not set +CONFIG_LDISC_AUTOLOAD=y # # Serial drivers @@ -1093,6 +1179,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1102,7 +1189,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set @@ -1115,13 +1201,11 @@ CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set -# CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=y @@ -1132,9 +1216,7 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1142,104 +1224,22 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_NSC is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_INFINEON is not set # CONFIG_TCG_CRB is not set # CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support # -CONFIG_I2C=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_COMPAT is not set -# CONFIG_I2C_CHARDEV is not set -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_SMBUS is not set - -# -# I2C Algorithms -# -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALGOPCA is not set -# end of I2C Algorithms - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_AMD_MP2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# ACPI drivers -# -# CONFIG_I2C_SCMI is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_MLXCPLD is not set -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -CONFIG_I2C_SLAVE=y -# CONFIG_I2C_SLAVE_EEPROM is not set -# CONFIG_I2C_SLAVE_TESTUNIT is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C is not set # end of I2C support # CONFIG_I3C is not set @@ -1265,22 +1265,12 @@ CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_GOLDFISH is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_STATISTICS is not set @@ -1299,6 +1289,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1309,6 +1300,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1320,94 +1314,46 @@ CONFIG_BCMA_POSSIBLE=y # # Multifunction device drivers # -# CONFIG_MFD_AS3711 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1484,12 +1430,6 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support # @@ -1500,6 +1440,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1525,7 +1466,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1552,6 +1492,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1560,9 +1502,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1575,11 +1519,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1589,6 +1537,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -1614,17 +1563,17 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID is not set -# end of I2C HID support - # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -1746,9 +1695,6 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set @@ -1756,7 +1702,6 @@ CONFIG_USB_STORAGE=m # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_ISP1301 is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set @@ -1790,46 +1735,14 @@ CONFIG_RTC_INTF_DEV=y # # I2C RTC drivers # -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # -CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers @@ -1858,16 +1771,18 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -1884,21 +1799,68 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +CONFIG_SURFACE_PLATFORMS=n +# CONFIG_SURFACE_GPE is not set +# CONFIG_SURFACE_PRO3_BUTTON is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -1922,7 +1884,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -1956,11 +1922,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -1971,11 +1932,21 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -1986,7 +1957,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -1995,7 +1965,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2011,7 +1980,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # CONFIG_GENERIC_PHY is not set # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2031,16 +2007,16 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y # CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2050,11 +2026,12 @@ CONFIG_NVMEM=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2080,10 +2057,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2122,6 +2097,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2135,15 +2111,12 @@ CONFIG_PROC_SYSCTL=y CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2226,9 +2199,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2345,7 +2326,7 @@ CONFIG_CRYPTO_SHA512=y # # Ciphers # -# CONFIG_CRYPTO_AES is not set +CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_AES_NI_INTEL is not set # CONFIG_CRYPTO_BLOWFISH is not set @@ -2425,9 +2406,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2448,6 +2446,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2481,7 +2480,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2493,6 +2491,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2503,19 +2502,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2534,22 +2540,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -2561,11 +2573,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -2579,16 +2596,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -2622,6 +2636,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -2634,6 +2649,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -2645,36 +2661,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -2683,8 +2703,8 @@ CONFIG_EARLY_PRINTK=y # CONFIG_DEBUG_TLBFLUSH is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_0X80 is not set +CONFIG_IO_DELAY_0XED=y # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set # CONFIG_CPA_DEBUG is not set @@ -2707,6 +2727,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-x230-legacy.config b/config/linux-x230-legacy.config index 84cbacca1..4a5052205 100644 --- a/config/linux-x230-legacy.config +++ b/config/linux-x230-legacy.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -62,6 +66,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -78,6 +83,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -89,11 +96,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -117,7 +139,6 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 @@ -134,12 +155,15 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -154,13 +178,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -168,7 +192,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -184,10 +207,8 @@ CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -200,17 +221,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -232,17 +242,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -253,12 +256,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -293,22 +294,23 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=64 +CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -320,7 +322,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -329,16 +330,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set -# CONFIG_X86_UMIP is not set +CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -356,22 +355,32 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -386,13 +395,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -420,9 +429,11 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -446,6 +457,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -475,56 +488,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_SMI is not set -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - -# -# EFI (Extensible Firmware Interface) Support -# -# CONFIG_EFI_VARS is not set -CONFIG_EFI_ESRT=y -CONFIG_EFI_RUNTIME_MAP=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -539,8 +511,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -552,8 +522,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -562,9 +535,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -575,6 +550,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -586,36 +562,65 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -624,6 +629,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -634,19 +641,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -660,6 +669,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -699,38 +710,71 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -742,6 +786,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_INET is not set # CONFIG_NETWORK_SECMARK is not set @@ -805,7 +850,11 @@ CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set -# CONFIG_PCIEASPM is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y @@ -823,6 +872,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -860,6 +911,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -869,6 +921,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -879,6 +932,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -898,9 +952,54 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -986,29 +1085,30 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # end of Texas Instruments shared transport line discipline -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set +# +# Altera FPGA firmware download module (requires I2C) +# CONFIG_INTEL_MEI=m CONFIG_INTEL_MEI_ME=m CONFIG_INTEL_MEI_TXE=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1020,6 +1120,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1036,7 +1137,57 @@ CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports -# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=y +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_VMWARE_PVSCSI is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_ISCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support @@ -1054,6 +1205,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1127,20 +1279,8 @@ CONFIG_INPUT=y # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set @@ -1184,7 +1324,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_LDISC_AUTOLOAD is not set +CONFIG_LDISC_AUTOLOAD=y # # Serial drivers @@ -1203,6 +1343,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1212,7 +1353,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set @@ -1226,13 +1366,11 @@ CONFIG_SERIAL_CORE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set -# CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=y @@ -1243,9 +1381,7 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1253,104 +1389,22 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_NSC is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_INFINEON is not set # CONFIG_TCG_CRB is not set # CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support # -CONFIG_I2C=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_COMPAT is not set -# CONFIG_I2C_CHARDEV is not set -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_SMBUS is not set - -# -# I2C Algorithms -# -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALGOPCA is not set -# end of I2C Algorithms - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_AMD_MP2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# ACPI drivers -# -# CONFIG_I2C_SCMI is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_MLXCPLD is not set -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -CONFIG_I2C_SLAVE=y -# CONFIG_I2C_SLAVE_EEPROM is not set -# CONFIG_I2C_SLAVE_TESTUNIT is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C is not set # end of I2C support # CONFIG_I3C is not set @@ -1363,6 +1417,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1377,22 +1432,12 @@ CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_GOLDFISH is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1412,6 +1457,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1422,6 +1468,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1433,94 +1482,46 @@ CONFIG_BCMA_POSSIBLE=y # # Multifunction device drivers # -# CONFIG_MFD_AS3711 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1597,12 +1598,6 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support # @@ -1613,6 +1608,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1638,7 +1634,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1665,6 +1660,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1673,9 +1670,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1688,11 +1687,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1702,6 +1705,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -1727,17 +1731,17 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID is not set -# end of I2C HID support - # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -1824,7 +1828,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -1860,9 +1864,6 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set @@ -1870,7 +1871,6 @@ CONFIG_USB_STORAGE=m # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_ISP1301 is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set @@ -1904,46 +1904,14 @@ CONFIG_RTC_INTF_DEV=y # # I2C RTC drivers # -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # -CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers @@ -1972,16 +1940,18 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -1998,21 +1968,68 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +CONFIG_SURFACE_PLATFORMS=n +# CONFIG_SURFACE_GPE is not set +# CONFIG_SURFACE_PRO3_BUTTON is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2036,7 +2053,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2070,11 +2091,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2085,11 +2101,31 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2100,7 +2136,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2109,7 +2144,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2125,7 +2159,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # CONFIG_GENERIC_PHY is not set # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2145,16 +2186,16 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y # CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2164,11 +2205,12 @@ CONFIG_NVMEM=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2194,10 +2236,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2236,6 +2276,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2249,15 +2290,12 @@ CONFIG_PROC_SYSCTL=y CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2322,13 +2360,10 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITYFS is not set -# CONFIG_PAGE_TABLE_ISOLATION is not set -CONFIG_INTEL_TXT=y +CONFIG_SECURITYFS=y +# CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set @@ -2343,9 +2378,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2378,7 +2421,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2466,7 +2509,7 @@ CONFIG_CRYPTO_SHA512=y # # Ciphers # -# CONFIG_CRYPTO_AES is not set +CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_BLOWFISH is not set @@ -2504,13 +2547,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2518,19 +2567,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2546,7 +2623,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2555,9 +2631,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2578,6 +2671,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2595,6 +2689,7 @@ CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2616,7 +2711,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2628,6 +2722,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2638,19 +2733,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2669,22 +2771,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -2696,11 +2804,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -2714,16 +2827,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -2757,6 +2867,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -2769,6 +2880,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -2780,36 +2892,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -2818,8 +2934,8 @@ CONFIG_EARLY_PRINTK=y # CONFIG_DEBUG_TLBFLUSH is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_0X80 is not set +CONFIG_IO_DELAY_0XED=y # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set # CONFIG_CPA_DEBUG is not set @@ -2842,6 +2958,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/config/linux-x230-maximized.config b/config/linux-x230-maximized.config index b2e2d1df1..57c8271ba 100644 --- a/config/linux-x230-maximized.config +++ b/config/linux-x230-maximized.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -62,6 +66,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -78,6 +83,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -89,11 +96,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -117,7 +139,6 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 @@ -134,12 +155,15 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -154,12 +178,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -167,7 +192,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -183,10 +207,8 @@ CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -199,17 +221,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -231,17 +242,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -252,12 +256,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -292,22 +294,23 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=64 +CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -319,7 +322,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -328,16 +330,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set -# CONFIG_X86_UMIP is not set +CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -355,22 +355,32 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -385,13 +395,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -419,9 +429,11 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -445,6 +457,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -474,56 +488,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_SMI is not set -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - -# -# EFI (Extensible Firmware Interface) Support -# -# CONFIG_EFI_VARS is not set -CONFIG_EFI_ESRT=y -CONFIG_EFI_RUNTIME_MAP=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -538,8 +511,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -551,8 +522,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -561,9 +535,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -574,6 +550,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -585,36 +562,65 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -623,6 +629,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -633,19 +641,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -659,6 +669,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -698,38 +710,71 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -741,6 +786,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -757,6 +803,7 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -775,10 +822,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -798,12 +843,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -818,8 +864,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -830,7 +876,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -841,7 +886,11 @@ CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set -# CONFIG_PCIEASPM is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y @@ -859,6 +908,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -896,6 +947,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -905,6 +957,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -915,6 +968,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -934,9 +988,54 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -954,63 +1053,49 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # # Misc devices # -# CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # # EEPROM support # -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set @@ -1020,29 +1105,30 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # end of Texas Instruments shared transport line discipline -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set +# +# Altera FPGA firmware download module (requires I2C) +# CONFIG_INTEL_MEI=m CONFIG_INTEL_MEI_ME=m CONFIG_INTEL_MEI_TXE=m # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1054,6 +1140,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1070,14 +1157,64 @@ CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports -# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=y +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_VMWARE_PVSCSI is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_ISCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_PATA_TIMINGS=y -CONFIG_ATA_VERBOSE_ERROR=y +# CONFIG_ATA_VERBOSE_ERROR is not set CONFIG_ATA_FORCE=y CONFIG_ATA_ACPI=y CONFIG_SATA_PMP=y @@ -1088,6 +1225,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1138,6 +1276,7 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y +CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set @@ -1158,12 +1297,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1175,21 +1308,23 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set +# CONFIG_NET_VENDOR_DAVICOM is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1208,24 +1343,28 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_JME is not set +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1233,9 +1372,9 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -1243,6 +1382,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1250,6 +1390,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1259,27 +1400,71 @@ CONFIG_E1000E_HWTS=y # CONFIG_PPP is not set # CONFIG_SLIP is not set -# CONFIG_USB_NET_DRIVERS is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces @@ -1296,20 +1481,8 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set @@ -1322,7 +1495,6 @@ CONFIG_MOUSE_PS2=y # CONFIG_MOUSE_PS2_BYD is not set # CONFIG_MOUSE_PS2_LOGIPS2PP is not set CONFIG_MOUSE_PS2_SYNAPTICS=y -# CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS is not set # CONFIG_MOUSE_PS2_CYPRESS is not set # CONFIG_MOUSE_PS2_LIFEBOOK is not set # CONFIG_MOUSE_PS2_TRACKPOINT is not set @@ -1333,10 +1505,7 @@ CONFIG_MOUSE_PS2_SYNAPTICS=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -# CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set @@ -1374,7 +1543,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_LDISC_AUTOLOAD is not set +CONFIG_LDISC_AUTOLOAD=y # # Serial drivers @@ -1393,6 +1562,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1402,7 +1572,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set @@ -1416,13 +1585,11 @@ CONFIG_SERIAL_CORE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set -# CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=y @@ -1433,9 +1600,7 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1443,104 +1608,22 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_NSC is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_INFINEON is not set # CONFIG_TCG_CRB is not set # CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support # -CONFIG_I2C=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_COMPAT is not set -# CONFIG_I2C_CHARDEV is not set -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_SMBUS is not set - -# -# I2C Algorithms -# -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALGOPCA is not set -# end of I2C Algorithms - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_AMD_MP2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# ACPI drivers -# -# CONFIG_I2C_SCMI is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_MLXCPLD is not set -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -CONFIG_I2C_SLAVE=y -# CONFIG_I2C_SLAVE_EEPROM is not set -# CONFIG_I2C_SLAVE_TESTUNIT is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C is not set # end of I2C support # CONFIG_I3C is not set @@ -1553,6 +1636,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1567,22 +1651,12 @@ CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_GOLDFISH is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1602,6 +1676,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1612,6 +1687,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1623,94 +1701,46 @@ CONFIG_BCMA_POSSIBLE=y # # Multifunction device drivers # -# CONFIG_MFD_AS3711 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1787,12 +1817,6 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support # @@ -1803,6 +1827,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1828,7 +1853,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1855,6 +1879,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1863,9 +1889,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1878,11 +1906,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1892,6 +1924,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -1917,17 +1950,17 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID is not set -# end of I2C HID support - # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2014,7 +2047,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2050,9 +2083,6 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set @@ -2060,7 +2090,6 @@ CONFIG_USB_STORAGE=m # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_ISP1301 is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set @@ -2091,6 +2120,7 @@ CONFIG_MMC_CQHCI=m # CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2119,46 +2149,14 @@ CONFIG_RTC_INTF_DEV=y # # I2C RTC drivers # -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # -CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers @@ -2187,16 +2185,18 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # # DMABUF options # CONFIG_SYNC_FILE=y -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2213,21 +2213,66 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2251,7 +2296,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2285,11 +2334,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2300,11 +2344,21 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2315,7 +2369,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2324,7 +2377,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2340,7 +2392,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2360,16 +2419,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y # CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2379,11 +2438,12 @@ CONFIG_NVMEM=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2409,10 +2469,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2451,6 +2509,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2458,21 +2517,18 @@ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_PROC_FS=y # CONFIG_PROC_KCORE is not set -# CONFIG_PROC_SYSCTL is not set +CONFIG_PROC_SYSCTL=y # CONFIG_PROC_PAGE_MONITOR is not set # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_KERNFS=y CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_TMPFS_XATTR is not set -# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2541,13 +2597,10 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITYFS is not set -# CONFIG_PAGE_TABLE_ISOLATION is not set -CONFIG_INTEL_TXT=y +CONFIG_SECURITYFS=y +# CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set @@ -2562,9 +2615,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2597,7 +2658,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2605,114 +2666,90 @@ CONFIG_CRYPTO_GLUE_HELPER_X86=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2723,13 +2760,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2737,19 +2780,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2765,7 +2836,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2774,9 +2844,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2797,6 +2884,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2814,6 +2902,7 @@ CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2835,7 +2924,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2847,6 +2935,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2857,19 +2946,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2888,22 +2984,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -2915,11 +3017,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -2933,16 +3040,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -2976,6 +3080,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -2988,6 +3093,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -2999,36 +3105,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3037,8 +3147,8 @@ CONFIG_EARLY_PRINTK=y # CONFIG_DEBUG_TLBFLUSH is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_0X80 is not set +CONFIG_IO_DELAY_0XED=y # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set # CONFIG_CPA_DEBUG is not set @@ -3061,6 +3171,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking diff --git a/doc/config.md b/doc/config.md new file mode 100644 index 000000000..223ea8043 --- /dev/null +++ b/doc/config.md @@ -0,0 +1,160 @@ +# Heads Configuration Variables + +Heads contains a number of configuration variables. + +All variables can be set at build time. +(Variables used only at runtime can still be set at build time, this changes the default runtime setting.) +However some variables can _only_ be set at build time, they cannot be changed later. + +## User Settings + +These variables are explicit user settings managed via the Heads menus. +Setting any of these at build time sets the default setting. + +| Variable | Purpose | +|---|---| +| CONFIG_AUTO_BOOT_TIMEOUT | Whether to boot automatically, and how long to wait if so. Empty disables automatic boo. A positive integer is the number of seconds to wait before booting automatically. | +| CONFIG_AUTOMATIC_POWERON | Whether to power on automatically after power loss. Only available if board provides CONFIG_SUPPORT_AUTOMATIC_POWERON. | +| CONFIG_BASIC | 'Basic' mode - no tamper evident boot. | +| CONFIG_BASIC_NO_AUTOMATIC_DEFAULT | In Basic mode: By default, Basic mode detects the default boot option during boot, so it does not need to be updated when the OS boot options change. Enabling this setting uses a manually-specified boot option instead. | +| CONFIG_BASIC_USB_AUTOBOOT | In Basic mode: Causes Heads to boot to a bootable USB flash drive by default if inserted. Allows headless systems to perform OS recovery using appropriate bootable images designed for network recovery. | + +:point_right: TODO: document these: + +``` +CONFIG_BOOT_DEV +CONFIG_DEBUG_OUTPUT +CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT +CONFIG_FINALIZE_PLATFORM_LOCKING +CONFIG_RESTRICTED_BOOT +CONFIG_ROOT_CHECK_AT_BOOT +CONFIG_ROOT_DEV +CONFIG_ROOT_DIRLIST +CONFIG_USE_BLOB_JAIL +CONFIG_USER_USB_KEYBOARD +``` + +## Build configuration + +These variables are configure the firmware build. +Many are also available at runtime. +These are not intended to be changed in user config. + +| Variable | Purpose | +|---|---| +| CONFIG_BOARD | Internal name of the board being built. Avoid testing this for specific boards in initrd/, instead add a customization point and override it with boards//initrd/bin/. (For example, boards/librem_mini_v2/initrd/bin/board-init.sh.) | +| CONFIG_BOARD_NAME | Display name of the board being built. Use this to show the board name to the user. | +| CONFIG_BRAND_NAME | Brand name to use to refer to the firmware itself. Upstream, this is "Heads". For example, "Heads main menu", "Enable Heads debug tracing", etc. Distributions can override this to their specific brand name (usually in site-local/config). | + +## Feature support + +These variables enable features that can be controlled by the user. +Usually, they require some board-specific support. +These are not intended to be changed in user config. + +| Variable | Purpose | +|---|---| +| CONFIG_REQUIRE_USB_KEYBOARD | Board must always have USB input support, there is no other input method. This hides the USB keyboard support setting from the config GUI, and CONFIG_USER_USB_KEYBOARD is ignored. | +| CONFIG_SUPPORT_AUTOMATIC_POWERON | Board supports powering on automatically after power loss. The board must provide /bin/set_ec_poweron.sh to control this setting. User can set CONFIG_AUTOMATIC_POWERON from the config GUI. | +| CONFIG_SUPPORT_BLOB_JAIL | Board supports the firmware blob jail to provide nonfree device firmware to the OS kernel. The board must provide relevant device firmware. User can set CONFIG_USE_BLOB_JAIL from the config GUI. | + +## Module Variables + +These variables enable modules or functions of modules, usually adding output from that module to the initrd. +These are not intended to be changed in user config. +(A few might work when overridden to 'n', but this is not intentionally supported.) + +| Variable | Purpose | +|---|---| +| CONFIG_BASH | Bash shell. Most of Heads requires this. | +| CONFIG_BUSYBOX | BusyBox userspace tools. Alternative is CONFIG_UROOT | +| CONFIG_CAIRO | Cairo libraries, needed by fbwhiptail. | +| CONFIG_COREBOOT | coreboot is the base firmware that loads Heads. Alternative is CONFIG_LINUXBOOT | +| CONFIG_CRYPTSETUP2 | cryptsetup2 tools (used for LUKS) | +| CONFIG_DROPBEAR | DropBear SSH server (for debug / troubleshooting) | +| CONFIG_FBWHIPTAIL | fbwhiptail, framebuffer-based graphical whiptail implementation. Alternative is CONFIG_NEWT | + +:point_right: TODO: document these: + +``` +CONFIG_CRYPTSETUP +CONFIG_EXFATPROGS +CONFIG_FLASHPROG +CONFIG_FLASHPROG_AST1100 +CONFIG_FLASHROM +CONFIG_FLASHTOOLS +CONFIG_FROTZ +CONFIG_GPG2 +CONFIG_HOTPKEY +CONFIG_IO386 +CONFIG_IOPORT +CONFIG_KBD +CONFIG_KBD_DEVTOOLS +CONFIG_KBD_EXTRATOOLS +CONFIG_KBD_LOADKEYS +CONFIG_KEXEC +CONFIG_LINUXBOOT +CONFIG_LINUX_AHCI +CONFIG_LINUX_ATA +CONFIG_LINUX_BCM +CONFIG_LINUX_BUNDLED +CONFIG_LINUX_COMMAND_LINE +CONFIG_LINUX_CONFIG +CONFIG_LINUX_E1000 +CONFIG_LINUX_E1000E +CONFIG_LINUX_IGB +CONFIG_LINUX_MEGARAID +CONFIG_LINUX_MEI +CONFIG_LINUX_MLX4 +CONFIG_LINUX_NVME +CONFIG_LINUX_SCSI_GDTH +CONFIG_LINUX_SFC +CONFIG_LINUX_USB +CONFIG_LINUX_USB_COMPANION_CONTROLLER +CONFIG_LINUX_VERSION +CONFIG_LVM2 +CONFIG_MBEDTLS +CONFIG_MSRTOOLS +CONFIG_MUSL +CONFIG_NEWT +CONFIG_NKSTORECLI +CONFIG_OPENSSL +CONFIG_PCIUTILS +CONFIG_POWERPC_UTILS +CONFIG_PURISM_BLOBS +CONFIG_QRENCODE +CONFIG_SLANG +CONFIG_SYSCTL +CONFIG_TPM2_TOOLS +CONFIG_TPM2_TSS +CONFIG_UROOT +CONFIG_UTIL_LINUX +CONFIG_ZLIB +CONFIG_ZSTD +``` + +## Historical + +These variables are no longer used, except possibly in a migration for older settings. +Remember that these could still exist in user configs, so avoid reusing the name for a future variable. + +| Variable | Purpose | +|---|---| +| CONFIG_PUREBOOT_BASIC | Migrated to CONFIG_BASIC. | +| CONFIG_SUPPORT_USB_KEYBOARD | All builds now include USB keyboard support. | +| CONFIG_USB_KEYBOARD | This was a build-time setting when USB keyboard support could only be enabled at build time. When this became a runtime setting, the existing variable name was not reused to avoid confusing older firmware if a user would downgrade. (CONFIG_USER_USB_KEYBOARD is the user-controlled setting, CONFIG_REQUIRE_USB_KEYBOARD indicates that a board requires USB keyboard all the time.) | + +# Updating this document + +Use `bin/find_undocumented_config.sh` to find CONFIG_ variables that haven't been documented yet. +It has some exclusions to avoid lots of false matches against subproject configs, etc., see the script implementation. + + diff --git a/doc/logging.md b/doc/logging.md new file mode 100644 index 000000000..7bfdea0ba --- /dev/null +++ b/doc/logging.md @@ -0,0 +1,190 @@ +# Heads Debug Logging + +Heads produces debug logging to aid development and troubleshooting. + +Logging is produced in scripts at a _log level_. +Users can set an _output level_ that controls how much output they see on the screen. + +# Log Levels + +In order from "most verbose" to "least verbose": + +LOG > TRACE > DEBUG > INFO > (console) > NOTE > warn + +("console" level output is historical and should be replaced with INFO.) + +## LOG + +LOG is for very detailed output or output with uncontrolled length. +It never goes to the screen, this always goes to the log file. +Usually, we dump outputs of commands like 'lsblk', 'lsusb', 'gpg --list-keys', etc. at LOG level (using DO_WITH_DEBUG or SINK_LOG), so we can tell the state of the system from a log submitted by a user. +We rarely want these on the console as they usually hide more relevant output with information that we already know. + +Use this in situations like: +* Dumping information about the state of the system for debugging. The output doesn't indicate any specific action/decision in Heads or a problem, it's just state relevant for troubleshooting the rest of the log. +* Tracing something that might be very long (including "we don't know how long this will be", even if it's sometimes short). Very long output isn't useful on the console, since you can't scroll back, and it hides more important information. +* The output is intended for debugging a specific topic, and usually unintersting otherwise. We want to be able to turn up output to DEBUG/TRACE when working on any topic without excessively filling the console with every topic's detailed output. + +## TRACE + +TRACE is for following execution flow through Heads. +(TRACE_FUNC logs the current source location at TRACE level, you can use this when entering a function or script, this is much more common than using TRACE directly.) + +You can also use TRACE to show parameter values to scripts or functions. +Since TRACE is for execution flow, show the unprocessed parameters as provided by the caller, not an interpreted version. +(This is uncommon though as it is very verbose, and we can also capture interesting call sites with DO_WITH_DEBUG.) + +You can invoke TRACE to show specific execution flow when needed, but if you are tracing the result of a decision, consider using DEBUG instead. + +Use this in situations like: +* Following control flow - use TRACE_FUNC when entering a script or function +* Showing the parameters used to invoke a script/function, when they are especially relevant and not excessively verbose + +## DEBUG + +DEBUG is for most log information that is relevant if you are a Heads developer. + +Use DEBUG to highlight the decisions made in script logic, and the information that affects those decisions. +Generally, focus on decision points (if, else, case, while, for, etc.), because we can keep following straight-line execution without further tracing. + +Decision points usually capture program behavior the best. +Show the information that is about to influence a decision (`DEBUG "Found ${#DEVS[@]} block devices: to check for LUKS:" "${DEVS[@]}"`) and/or the results of the decision (`DEBUG "${DEVS[$i]} is not a LUKS device, ignore it`). + +Use DO_WITH_DEBUG to capture a particular command execution to the debug log. +The command and its arguments are captured at DEBUG level (as they usually indicate the decisions the command will make), and the command's stdout/stderr are captured at LOG level. +See DO_WITH_DEBUG for examples of usage. + +Use this in situations like: + +* Showing information derived or obtained that will influence logical decisions and actions +* Showing the result of decisions and the reasons for them + +## INFO + +INFO is for contextual information that may be of interest to end users, but that is not required for use of Heads. +Users can control whether this is displayed on the console. + +Users might use this to troubleshoot Heads configuration or behavior, but this should not require knowledge of Heads implementation or developer experience. + +For example: + +* "Why can't I enable USB keyboard support?" `INFO "Not showing USB keyboard option, USB keyboard is always enabled for this board"` +* "Why isn't Heads booting automatically?" `INFO "Not booting automatically, automatic boot is disabled in user settings"` +* "Why didn't Heads prompt me for a password?" `INFO "Password has not been changed, using default"`) + +These do not include highly technical details. +They can include configuration values or context, _but_ they should refer to configuration settings using the user-facing names in the configuration menus. + +Use this in situations like: + +* Showing very high level decision-making information, which is reasonably understandable for users not familiar with Heads implementation +* Explaining a behavior that could reasonably be unexpected for some users + +## console + +This level is historical, use INFO for this. +It is documented as there are still some occurrences in Heads, usually `echo`, `echo >&2`, or `echo >/dev/console`, each intended to produce output directly on the console. +The intent is the same as INFO. + +(This is different from `echo` used to produce output that might be captured by a caller, which is not logging at all.) + +Avoid using this, and change existing console output to INFO or another level. + +## NOTE + +NOTE is for contextual information explaining something that is _likely_ to be unexpected or confusing to users new to Heads. + +Unlike INFO, it cannot be hidden. Use this only if the behavior is likely to be unexpected or confusing to many users. If it is only possibly unexpected or uncommon that it is confusing, consider INFO instead. + +Do not overuse this above INFO. Adding too much output at NOTE causes users to ignore it, as there is too much output. + +For example: + +* "Rebooting in 3 seconds to enable booting default boot option". Users probably don't expect the firmware to reboot to accomplish this behavior, this is unique to Heads. Without a message justifying the reboot, it would likely appear that the firmware faulted and reset unexpectedly. +* "Your GPG User PIN, followed by Enter key will be required [...]". GPG prompts are very confusing to users unfamiliar with GPG (which is most users). + +## warn + +warn is for output that indicates a problem. We think the user should act on it, but we are able to continue, possibly with degraded functionality. +(This level and the utility function are lowercase, as they predate the other levels.) + +This is apppriate when _all_ of the following are true: + +- there is a _likely_ problem +- we are able to continue, possibly with degraded functionality +- the warning is _actionable_ - there is a reasonable change that could silence the warning if this is intentional + +**Do not overuse this.** Overuse of this level causes user to become accustomed to ignoring warnings. +This level only has value as long as it does not occur frequently, so users will notice warnings. + +Warnings must indicate a _likely_ problem. +(Not a rare or remote possibility of a problem.) + +Warnings are only appropriate if we're able to continue operating. +If we can't, consider prompting the user instead, since we cannot do what they asked. + +Warnings must be _actionable_. Only warn if there is a reasonable change the user can make to avoid the warning. + +For example: +* Warning when using default passphrases that are completely insecure is reasonable - the user has no security, and if they want that, they should use Basic mode. +* Warning when an unknown variable appears in config.user is not reasonable - there's no reasonable way for the user to address this. + +# Output Levels + +Users can choose one of three output levels for extra console information. + +* None - Show no extra output. Only warnings appear on console. (Some 'console' level output appears that has not been addressed yet.) +* Info - Show information about operations in Heads. (INFO and below.) +* Debug - Show detailed information suitable for debugging Heads. (TRACE and below.) Log file captures all levels. + +TODO: Document what happens for kernel messages too. +This is more complex though since it is influenced by the board's config and user config differently (maybe we should improve that.) + +TODO: Document the variables that control these levels + +## None - no extra output + +| Sink | LOG | TRACE | DEBUG | INFO | console | NOTE | warn | +|-------------------------|-----|-------|-------|------|---------|------|------| +| Console (via /dev/kmsg) | | | | | Yes* | Yes | Yes | +| /tmp/debug.log | Yes | | | | | | | + +* Most 'console' output should be changed to INFO, that content isn't intended to be displayed in quiet mode + +No extra output is specified with: + +``` +CONFIG_DEBUG_OUTPUT=n +CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +CONFIG_QUIET_MODE=y +``` + +## Info + +| Sink | LOG | TRACE | DEBUG | INFO | console | NOTE | warn | +|-------------------------|-----|-------|-------|------|---------|------|------| +| Console (via /dev/kmsg) | | | | Yes | Yes | Yes | Yes | +| /tmp/debug.log | Yes | | | | | | | + +Info output is enabled with: + +``` +CONFIG_DEBUG_OUTPUT=n +CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +CONFIG_QUIET_MODE=n +``` + +## Debug + +| Sink | LOG | TRACE | DEBUG | INFO | console | NOTE | warn | +|-------------------------|-----|-------|-------|------|---------|------|------| +| Console (via /dev/kmsg) | | Yes | Yes | Yes | Yes | Yes | Yes | +| /tmp/debug.log | Yes | Yes | Yes | Yes | Yes | Yes | Yes | + +Debug output is enabled with: + +``` +CONFIG_DEBUG_OUTPUT=y +CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +CONFIG_QUIET_MODE=n +``` diff --git a/docker_latest.sh b/docker_latest.sh new file mode 100755 index 000000000..f073e5a79 --- /dev/null +++ b/docker_latest.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +# Inform the user that the latest published Docker image is being used +echo "Using the latest Docker image: tlaurion/heads-dev-env:latest" +DOCKER_IMAGE="tlaurion/heads-dev-env:latest" + +# Function to display usage information +usage() { + echo "Usage: $0 [OPTIONS] -- [COMMAND]" + echo "Options:" + echo " CPUS=N Set the number of CPUs" + echo " V=1 Enable verbose mode" + echo "Command:" + echo " The command to run inside the Docker container, e.g., make BOARD=BOARD_NAME" +} + +# Function to kill GPG toolstack related processes using USB devices +kill_usb_processes() { + # check if scdaemon or pcscd processes are using USB devices + if [ -d /dev/bus/usb ]; then + if sudo lsof /dev/bus/usb/00*/0* 2>/dev/null | awk 'NR>1 {print $2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' >/dev/null; then + echo "Killing GPG toolstack related processes using USB devices..." + sudo lsof /dev/bus/usb/00*/0* 2>/dev/null | awk 'NR>1 {print $2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print $1}' | xargs -r sudo kill -9 + fi + fi +} + +# Handle Ctrl-C (SIGINT) to exit gracefully +trap "echo 'Script interrupted. Exiting...'; exit 1" SIGINT + +# Check if --help or -h is provided +for arg in "$@"; do + if [[ "$arg" == "--help" || "$arg" == "-h" ]]; then + usage + exit 0 + fi +done + +# Kill processes using USB devices +kill_usb_processes + +# Inform the user about entering the Docker container +echo "----" +echo "Usage reminder: The minimal command is 'make BOARD=XYZ', where additional options, including 'V=1' or 'CPUS=N' are optional." +echo "For more advanced QEMU testing options, refer to targets/qemu.md and boards/qemu-*/*.config." +echo +echo "Type exit within docker image to get back to host if launched interactively!" +echo "----" +echo + +# Execute the docker run command with the provided parameters +if [ -d "/dev/bus/usb" ]; then + echo "--->Launching container with access to host's USB buses (some USB devices were connected to host)..." + docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" +else + echo "--->Launching container without access to host's USB buses (no USB devices was connected to host)..." + docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" +fi diff --git a/docker_local_dev.sh b/docker_local_dev.sh new file mode 100755 index 000000000..43b8022bb --- /dev/null +++ b/docker_local_dev.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +#locally build docker name is linuxboot/heads:dev-env +DOCKER_IMAGE="linuxboot/heads:dev-env" + +# Check if Nix is installed +if ! command -v nix &>/dev/null; then + echo "Nix is not installed or not in the PATH. Please install Nix before running this script." + echo "Refer to the README.md at the root of the repository for installation instructions." + exit 1 +fi + +# Check if Docker is installed +if ! command -v docker &>/dev/null; then + echo "Docker is not installed or not in the PATH. Please install Docker before running this script." + echo "Refer to the README.md at the root of the repository for installation instructions." + exit 1 +fi + +# Inform the user about the Docker image being used +echo "!!! This ./docker_local_dev.sh script is for developers usage only. !!!" +echo "" +echo "Using the last locally built Docker image when flake.nix/flake.lock was modified and repo was dirty: linuxboot/heads:dev-env" +echo "!!! Warning: Using anything other than the published Docker image might lead to non-reproducible builds. !!!" +echo "" +echo "For using the latest published Docker image, refer to ./docker_latest.sh." +echo "For producing reproducible builds as CircleCI, refer to ./docker_repro.sh." +echo "" + +# Function to display usage information +usage() { + echo "Usage: $0 [OPTIONS] -- [COMMAND]" + echo "Options:" + echo " CPUS=N Set the number of CPUs" + echo " V=1 Enable verbose mode" + echo "Command:" + echo " The command to run inside the Docker container, e.g., make BOARD=BOARD_NAME" +} + +# Function to kill GPG toolstack related processes using USB devices +kill_usb_processes() { + # check if scdaemon or pcscd processes are using USB devices + if [ -d /dev/bus/usb ]; then + if sudo lsof /dev/bus/usb/00*/0* 2>/dev/null | awk 'NR>1 {print $2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' >/dev/null; then + echo "Killing GPG toolstack related processes using USB devices..." + sudo lsof /dev/bus/usb/00*/0* 2>/dev/null | awk 'NR>1 {print $2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print $1}' | xargs -r sudo kill -9 + fi + fi +} + +# Handle Ctrl-C (SIGINT) to exit gracefully +trap "echo 'Script interrupted. Exiting...'; exit 1" SIGINT + +# Check if --help or -h is provided +for arg in "$@"; do + if [[ "$arg" == "--help" || "$arg" == "-h" ]]; then + usage + exit 0 + fi +done + +# Check if the git repository is dirty and if flake.nix or flake.lock are part of the uncommitted changes +if [ -n "$(git status --porcelain | grep -E 'flake\.nix|flake\.lock')" ]; then + echo "**Warning: Uncommitted changes detected in flake.nix or flake.lock. The Docker image will be rebuilt!**" + echo "If this was not intended, please CTRL-C now, commit your changes and rerun the script." + echo "Building the Docker image from flake.nix..." + nix --print-build-logs --verbose develop --ignore-environment --command true + nix --print-build-logs --verbose build .#dockerImage && docker load Launching container with access to host's USB buses (some USB devices were connected to host)..." + docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" +else + echo "--->Launching container without access to host's USB buses (no USB devices was connected to host)..." + docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" +fi diff --git a/docker_repro.sh b/docker_repro.sh new file mode 100755 index 000000000..0dbeb2f6b --- /dev/null +++ b/docker_repro.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# Extract the Docker image version from the CircleCI config file +DOCKER_IMAGE=$(grep -oP '^\s*-?\s*image:\s*\K(tlaurion/heads-dev-env:[^\s]+)' .circleci/config.yml | head -n 1) + +# Check if the Docker image was found +if [ -z "$DOCKER_IMAGE" ]; then + echo "Error: Docker image not found in .circleci/config.yml" + exit 1 +fi + +# Inform the user about the versioned CircleCI Docker image being used +echo "Using CircleCI Docker image: $DOCKER_IMAGE" + +# Function to display usage information +usage() { + echo "Usage: $0 [OPTIONS] -- [COMMAND]" + echo "Options:" + echo " CPUS=N Set the number of CPUs" + echo " V=1 Enable verbose mode" + echo "Command:" + echo " The command to run inside the Docker container, e.g., make BOARD=BOARD_NAME" +} + +# Function to kill GPG toolstack related processes using USB devices +kill_usb_processes() { + # check if scdaemon or pcscd processes are using USB devices + if [ -d /dev/bus/usb ]; then + if sudo lsof /dev/bus/usb/00*/0* 2>/dev/null | awk 'NR>1 {print $2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' >/dev/null; then + echo "Killing GPG toolstack related processes using USB devices..." + sudo lsof /dev/bus/usb/00*/0* 2>/dev/null | awk 'NR>1 {print $2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print $1}' | xargs -r sudo kill -9 + fi + fi +} + +# Handle Ctrl-C (SIGINT) to exit gracefully +trap "echo 'Script interrupted. Exiting...'; exit 1" SIGINT + +# Check if --help or -h is provided +for arg in "$@"; do + if [[ "$arg" == "--help" || "$arg" == "-h" ]]; then + usage + exit 0 + fi +done + +# Kill processes using USB devices +kill_usb_processes + +# Inform the user about entering the Docker container +echo "----" +echo "Usage reminder: The minimal command is 'make BOARD=XYZ', where additional options, including 'V=1' or 'CPUS=N' are optional." +echo "For more advanced QEMU testing options, refer to targets/qemu.md and boards/qemu-*/*.config." +echo +echo "Type exit within docker image to get back to host if launched interactively!" +echo "----" +echo + +# Execute the docker run command with the provided parameters +if [ -d "/dev/bus/usb" ]; then + echo "--->Launching container with access to host's USB buses (some USB devices were connected to host)..." + docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" +else + echo "--->Launching container without access to host's USB buses (no USB devices was connected to host)..." + docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" +fi diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..f1f0771ca --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1716509168, + "narHash": "sha256-4zSIhSRRIoEBwjbPm3YiGtbd8HDWzFxJjw5DYSDy1n8=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "bfb7a882678e518398ce9a31a881538679f6f092", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..ba0afa9cd --- /dev/null +++ b/flake.nix @@ -0,0 +1,158 @@ +{ + description = "Optimized heads flake for Docker image with garbage collection protection"; + + # Inputs define external dependencies and their sources. + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; # Using the unstable channel for the latest packages, while flake.lock fixates the commit reused until changed. + flake-utils.url = "github:numtide/flake-utils"; # Utilities for flake functionality. + }; + # Outputs are the result of the flake, including the development environment and Docker image. + outputs = { + self, + flake-utils, + nixpkgs, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = nixpkgs.legacyPackages.${system}; # Accessing the legacy package set. + lib = pkgs.lib; # The standard Nix packages library. + + # Dependencies are the packages required for the Heads project. + # Organized into subsets for clarity and maintainability. + deps = with pkgs; [ + # Core build utilities + autoconf + automake + bashInteractive + coreutils #basic tools like ls, cp, mv, kill) + bc + bison # Generate flashmap descriptor parser + bzip2 + cacert + ccache + cmake + cpio + curl + diffutils + dtc + e2fsprogs + elfutils + findutils + flex + gawk + git + gnat # required for libgfxinit under coreboot, hacked around for kgpe-d16 + gnugrep + gnumake + gnused + gnutar + gzip + imagemagick # For bootsplash manipulation + innoextract # ROM extraction for dGPU + libtool + m4 + ncurses5 # make menuconfig and slang + nss + openssl # needed for talos-2 kernel build + parted + patch + perl + pkg-config + procps #process tools like free, pidof, pkill, top, vmstat, watch, etc + psmisc #process tools like killall, pstree, etc + python3 # me_cleaner, coreboot + rsync # coreboot + sharutils + texinfo + unzip + wget + which + xz + zip + zlib + zlib.dev + ] ++ [ + qemu_full #Heavier then qemu + qemu_kvm, but contains qemu-img + kvm and everything else needed to do development/testing cycles under docker + ] ++ [ + # Additional tools for debugging/editing/testing + vim # Mostly used amongst us, sorry if you'd like something else, open issue + swtpm # QEMU requirement to emulate tpm1/tpm2 + dosfstools # QEMU requirement to produce valid fs to store exported public key to be fused through inject_key on qemu (so qemu flashrom emulated SPI support). + diffoscopeMinimal # Not sure exactly what is packed here, let's try. Might need diffoscope if something is missing + gnupg #to inject public key inside of qemu create rom through inject_gpg target of targets/qemu.mk TODO: remove when pflash supported by flashrom + modify code + less # so 'git log' is usable + moreutils # so that 'make 2>&1 | ts' can give timestamps + ] ++ [ + # Tools for handling binary blobs in their compressed state. (blobs/xx30/vbios_[tw]530.sh) + bundler + p7zip + ruby + sudo # ( °-° ) + upx + binwalk # Extract all components of a binary + uefi-firmware-parser #Parse and extract further hidden UEFI blobs from binaries + ]; + in { + # The development shell includes all the dependencies. + devShell = pkgs.mkShellNoCC { + buildInputs = deps; + }; + + # myDevShell outputs environment variables necessary for development. + packages.myDevShell = + pkgs.runCommand "my-dev-shell" {} + #bash + '' + grep \ + -e CMAKE_PREFIX_PATH \ + -e NIX_CC_WRAPPER_TARGET_TARGET \ + -e NIX_CFLAGS_COMPILE_FOR_TARGET \ + -e NIX_LDFLAGS_FOR_TARGET \ + -e PKG_CONFIG_PATH_FOR_TARGET \ + -e ACLOCAL_PATH \ + ${self.devShell.${system}} >$out + ''; + + # Docker image configuration for the Heads project. + packages.dockerImage = pkgs.dockerTools.buildLayeredImage { + name = "linuxboot/heads"; + tag = "dev-env"; + config.Entrypoint = ["bash" "-c" ''source /devenv.sh; if (( $# == 0 )); then exec bash; else exec "$0" "$@"; fi'']; + contents = + deps + ++ [ + pkgs.dockerTools.binSh + pkgs.dockerTools.caCertificates + pkgs.dockerTools.usrBinEnv + ]; + enableFakechroot = true; + fakeRootCommands = + #bash + '' + set -e + + # Environment setup for the development shell. + grep \ + -e NIX_CC_WRAPPER_TARGET_TARGET \ + -e NIX_CFLAGS_COMPILE_FOR_TARGET \ + -e NIX_LDFLAGS_FOR_TARGET \ + -e NIX_PKG_CONFIG_WRAPPER_TARGET \ + -e PKG_CONFIG_PATH_FOR_TARGET \ + -e ACLOCAL_PATH \ + ${self.devShell.${system}} >/devenv.sh + + mkdir /tmp; # Temporary directory for various operations. + chmod 1777 /tmp + + # Ensure /etc/passwd and /etc/group exist with root entries + echo "root:x:0:0:root:/root:/bin/bash" > /etc/passwd + echo "root:x:0:" > /etc/group + mkdir -p /root + chmod 700 /root + + # Git configuration for safe directory access. + echo -e '[safe]\n\tdirectory = *\n' > /root/.gitconfig + ''; + }; + }); +} diff --git a/funding.json b/funding.json new file mode 100644 index 000000000..bf545ed77 --- /dev/null +++ b/funding.json @@ -0,0 +1,85 @@ +{ + "version": "v1.0.0", + "entity": { + "type": "individual", + "role": "maintainer", + "name": "Thierry Laurion", + "email": "thierry.laurion@gmail.com", + "description": "Thierry Laurion, founder of Insurgo Open Technologies and maintainer of the Heads open-source firmware project. Dedicated to developing secure, user-friendly technologies that enhance physical security and data protection.", + "webpageUrl": { + "url": "https://github.com/linuxboot/heads" + } + }, + "projects": [ + { + "guid": "heads", + "name": "Heads", + "description": "Heads is an open-source firmware project designed to enhance the security and integrity of laptops and servers. It provides a tamper-evident and cryptographically verified boot process, empowering users to maintain control over their hardware and data.", + "webpageUrl": { + "url": "https://github.com/linuxboot/heads" + }, + "repositoryUrl": { + "url": "https://github.com/linuxboot/heads" + }, + "licenses": [ + "spdx:GPL-3.0" + ], + "tags": [ + "firmware", + "security", + "open-source", + "linuxboot", + "coreboot", + "heads", + "TPM", + "measured-boot", + "linux" + ] + } + ], + "funding": { + "channels": [ + { + "guid": "opencollective", + "type": "payment-provider", + "address": "https://opencollective.com/insurgo", + "description": "Support Heads development via Open Collective" + }, + { + "guid": "github-sponsors", + "type": "payment-provider", + "address": "https://github.com/sponsors/tlaurion", + "description": "Support Heads development via GitHub Sponsors" + } + ], + "plans": [ + { + "guid": "monthly-support", + "status": "active", + "name": "monthly-support", + "description": "Monthly Support Plan", + "amount": 10, + "currency": "USD", + "frequency": "monthly", + "channels": [ + "opencollective", + "github-sponsors" + ] + }, + { + "guid": "one-time-donation", + "status": "active", + "name": "One-Time Donation", + "description": "Make a one-time donation to support Heads.", + "amount": 50, + "currency": "USD", + "frequency": "one-time", + "channels": [ + "opencollective", + "github-sponsors" + ] + } + ], + "history": [] + } +} diff --git a/initrd/.ash_history b/initrd/.bash_history similarity index 97% rename from initrd/.ash_history rename to initrd/.bash_history index 12d10333b..7f03d3ee1 100644 --- a/initrd/.ash_history +++ b/initrd/.bash_history @@ -4,7 +4,7 @@ mount /boot find /boot/kexec*.txt | gpg --verify /boot/kexec.sig - #remove invalid kexec_* signed files mount /dev/sda1 /boot && mount -o remount,rw /boot && rm /boot/kexec* && mount -o remount,ro /boot -#Generate keys from GPG smartcard: +#Generate keys on OpenPGP smartcard: mount-usb && gpg --home=/.gnupg/ --card-edit #Copy generated public key, private_subkey, trustdb and artifacts to external media for backup: mount -o remount,rw /media && mkdir -p /media/gpg_keys; gpg --export-secret-keys --armor email@address.com > /media/gpg_keys/private.key && gpg --export --armor email@address.com > /media/gpg_keys/public.key && gpg --export-ownertrust > /media/gpg_keys/otrust.txt && cp -r ./.gnupg/* /media/gpg_keys/ 2> /dev/null diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index 06d78f00e..651b9eaf0 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -2,7 +2,14 @@ set -e -o pipefail . /etc/functions -TRACE "Under /bin/cbfs-init" +# CBFS extraction and measurement +# This extraction and measurement cannot be suppressed by quiet mode, since +# config.user is not yet loaded at this point. +# To suppress this output, set CONFIG_QUIET_MODE=y needs be be set in /etc/config +# which is defined at build time under board configuration file to be part of initrd.cpio +# This script is called from initrd/init so really early in the boot process to put files in place in initramfs + +TRACE_FUNC # Update initrd with CBFS files if [ -z "$CONFIG_PCR" ]; then @@ -15,20 +22,20 @@ cbfsfiles=`cbfs -t 50 -l 2>/dev/null | grep "^heads/initrd/"` for cbfsname in `echo $cbfsfiles`; do filename=${cbfsname:12} if [ ! -z "$filename" ]; then - echo "Loading $filename from CBFS" mkdir -p `dirname $filename` \ || die "$filename: mkdir failed" - cbfs -t 50 -r $cbfsname > "$filename" \ + INFO "Extracting CBFS file $cbfsname into $filename" + cbfs -t 50 $CBFS_ARG -r $cbfsname > "$filename" \ || die "$filename: cbfs file read failed" if [ "$CONFIG_TPM" = "y" ]; then - TMPFILE=/tmp/cbfs.$$ - echo "$filename" > $TMPFILE - cat $filename >> $TMPFILE - DEBUG "Extending TPM PCR $CONFIG_PCR with $filename" - tpmr extend -ix "$CONFIG_PCR" -if $TMPFILE \ + TRACE_FUNC + INFO "TPM: Extending PCR[$CONFIG_PCR] with filename $filename and then its content" + # Measure both the filename and its content. This + # ensures that renaming files or pivoting file content + # will still affect the resulting PCR measurement. + tpmr extend -ix "$CONFIG_PCR" -ic "$filename" + tpmr extend -ix "$CONFIG_PCR" -if "$filename" \ || die "$filename: tpm extend failed" fi fi done - -# TODO: copy CBFS file named "heads/initrd.tgz" to /tmp, measure and extract diff --git a/initrd/bin/cbfs.sh b/initrd/bin/cbfs.sh index 54d2022f2..a6230cb3f 100755 --- a/initrd/bin/cbfs.sh +++ b/initrd/bin/cbfs.sh @@ -3,7 +3,7 @@ set -e -o pipefail . /etc/functions . /tmp/config -TRACE "Under /bin/cbfs.sh" +TRACE_FUNC if pnor "$2" -r HBI > /tmp/pnor.part 2>/dev/null; then cbfs "$@" -o /tmp/pnor.part && pnor "$2" -w HBI < /tmp/pnor.part diff --git a/initrd/bin/change-time.sh b/initrd/bin/change-time.sh new file mode 100755 index 000000000..b5d2a4ffe --- /dev/null +++ b/initrd/bin/change-time.sh @@ -0,0 +1,73 @@ +#!/bin/bash +#change time using hwclock and date -s + +clear + +echo "The system time is: $(date "+%Y-%m-%d %H:%M:%S %Z")" +echo +echo "Please enter the current date and time in UTC" +echo "To find the current date and time in UTC, please check https://time.is/UTC" +echo + +get_date () { + local field_name min max + field_name="$1" + min="$2" + max="$3" + echo -n "Enter the current $field_name [$min-$max]: " + read -r value + echo + + #must be a number between $2 and $3 + while [[ ! $value =~ ^[0-9]+$ ]] || [[ ${value#0} -lt $min ]] || [[ ${value#0} -gt $max ]]; + do + echo "Please try again, it must be a number from $min to $max." + echo -n "Enter the current $field_name [$min-$max]: " + read -r value + echo + done + + # Pad with zeroes to length of maximum value. + # The "$((10#$value))" is needed to handle 08 and 09 correctly, which printf + # would otherwise interpret as octal. This effectively strips the leading + # zero by evaluating an arithmetic expression with the base set to 10. + value="$(printf "%0${#max}u" "$((10#$value))")" +} + +enter_time_and_change() +{ + get_date "year" "2024" "2200" + year=$value + get_date "month" "01" "12" + month=$value + get_date "day" "01" "31" + day=$value + get_date "hour" "00" "23" + hour=$value + get_date "minute" "00" "59" + min=$value + get_date "second" "00" "59" + sec=$value + + if ! date -s "$year-$month-$day $hour:$min:$sec" &>/dev/null; then + return 1 + fi + return 0 +} + +while ! enter_time_and_change; do + echo "Could not set the date to $year-$month-$day $hour:$min:$sec" + read -rp "Try again? [Y/n]: " try_again_confirm + if [ "${try_again_confirm^^}" = N ]; then + exit 1 + fi + echo +done + +hwclock -w +echo "The system date has been sucessfully set to $year-$month-$day $hour:$min:$sec UTC" +echo + +echo "Press Enter to return to the menu" +echo +read -r nothing diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 24a940ba0..b741bf71d 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -5,7 +5,7 @@ set -e -o pipefail . /etc/gui_functions . /tmp/config -TRACE "Under /bin/config-gui.sh" +TRACE_FUNC ROOT_HASH_FILE="/boot/kexec_root_hashes.txt" @@ -13,322 +13,336 @@ param=$1 # Read the current ROM; if it fails display an error and exit. read_rom() { - /bin/flash.sh -r "$1" - if [ ! -s "$1" ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: BIOS Read Failed!' \ - --msgbox "Unable to read BIOS" 0 80 - exit 1 - fi + /bin/flash.sh -r "$1" + if [ ! -s "$1" ]; then + whiptail_error --title 'ERROR: BIOS Read Failed!' \ + --msgbox "Unable to read BIOS" 0 80 + exit 1 + fi } while true; do - if [ ! -z "$param" ]; then - # use first char from parameter - menu_choice=${param::1} - unset param - else - # Re-source config because we change it when an option is toggled - . /tmp/config - - dynamic_config_options=( - 'b' ' Change the /boot device' - ) - - # Options that don't apply to basic mode - [ "$CONFIG_BASIC" != "y" ] && dynamic_config_options+=( - 'r' ' Clear GPG key(s) and reset all user settings' - 'R' ' Change the root device for hashing' - 'D' ' Change the root directories to hash' - 'B' ' Check root hashes at boot' - 'L' " $(get_config_display_action "$CONFIG_RESTRICTED_BOOT") Restricted Boot" - ) - - # Basic itself is always available (though RB will refuse to enable it) - dynamic_config_options+=( - 'P' " $(get_config_display_action "$CONFIG_BASIC") $CONFIG_BRAND_NAME Basic Mode" - ) - - # Blob jail is only offered if this is a configuration with the blobs in - # firmware - [ "$CONFIG_SUPPORT_BLOB_JAIL" = "y" ] && dynamic_config_options+=( - 'J' " $(get_config_display_action "$CONFIG_USE_BLOB_JAIL") Firmware Blob Jail" - ) - - # Automatic boot - dynamic_config_options+=( - 'M' " Configure automatic boot" - ) - - # Basic-only options for automatic boot - [ "$CONFIG_BASIC" = "y" ] && dynamic_config_options+=( - 'A' " $(get_inverted_config_display_action "$CONFIG_BASIC_NO_AUTOMATIC_DEFAULT") automatic default boot option" - 'U' " $(get_config_display_action "$CONFIG_BASIC_USB_AUTOBOOT") USB automatic boot" - ) - - # Automatic power on - requires board support - [ "$CONFIG_SUPPORT_AUTOMATIC_POWERON" = "y" ] && dynamic_config_options+=( - 'N' " $(get_config_display_action "$CONFIG_AUTOMATIC_POWERON") automatic power-on" - ) - - # Debugging option always available - dynamic_config_options+=( - 'Z' " $(get_config_display_action "$CONFIG_DEBUG_OUTPUT") $CONFIG_BRAND_NAME debug and function tracing output" - ) - - [ "$CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" = "y" ] && dynamic_config_options+=( - 't' ' Deactivate Platform Locking to permit OS write access to firmware' - ) - - dynamic_config_options+=( - 's' ' Save the current configuration to the running BIOS' \ - 'x' ' Return to Main Menu' - ) - - unset menu_choice - whiptail $BG_COLOR_MAIN_MENU --title "Config Management Menu" \ - --menu "This menu lets you change settings for the current BIOS session.\n\nAll changes will revert after a reboot,\n\nunless you also save them to the running BIOS." 0 80 10 \ - "${dynamic_config_options[@]}" \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - menu_choice=$(cat /tmp/whiptail) - fi - - case "$menu_choice" in - "t" ) - unset CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE - replace_config /etc/config.user "CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" "n" - combine_configs - . /tmp/config - ;; - "x" ) - exit 0 - ;; - "b" ) - CURRENT_OPTION="$(load_config_value CONFIG_BOOT_DEV)" - if ! fdisk -l | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" > /tmp/disklist.txt ; then - whiptail $BG_COLOR_ERROR --title 'ERROR: No bootable devices found' \ - --msgbox " $ERROR\n\n" 0 80 - exit 1 - fi - # filter out extraneous options - > /tmp/boot_device_list.txt - for i in `cat /tmp/disklist.txt`; do - # remove block device from list if numeric partitions exist, since not bootable - DEV_NUM_PARTITIONS=$((`ls -1 $i* | wc -l`-1)) - if [ ${DEV_NUM_PARTITIONS} -eq 0 ]; then - echo $i >> /tmp/boot_device_list.txt - else - ls $i* | tail -${DEV_NUM_PARTITIONS} >> /tmp/boot_device_list.txt - fi - done - file_selector "/tmp/boot_device_list.txt" \ - "Choose the default /boot device.\n\n${CURRENT_OPTION:+\n\nCurrently set to }$CURRENT_OPTION." \ - "Boot Device Selection" - if [ "$FILE" == "" ]; then - return - else - SELECTED_FILE=$FILE - fi - - # unmount /boot if needed - if grep -q /boot /proc/mounts ; then - umount /boot 2>/dev/null - fi - # mount newly selected /boot device - if ! mount -o ro $SELECTED_FILE /boot 2>/tmp/error ; then - ERROR=`cat /tmp/error` - whiptail $BG_COLOR_ERROR --title 'ERROR: unable to mount /boot' \ - --msgbox " $ERROR\n\n" 0 80 - exit 1 - fi - - set_config /etc/config.user "CONFIG_BOOT_DEV" "$SELECTED_FILE" - combine_configs - - whiptail --title 'Config change successful' \ - --msgbox "The /boot device was successfully changed to $SELECTED_FILE" 0 80 - ;; - "s" ) - read_rom /tmp/config-gui.rom - - replace_rom_file /tmp/config-gui.rom "heads/initrd/etc/config.user" /etc/config.user - - if (whiptail --title 'Update ROM?' \ - --yesno "This will reflash your BIOS with the updated version\n\nDo you want to proceed?" 0 80) then - /bin/flash.sh /tmp/config-gui.rom - whiptail --title 'BIOS Updated Successfully' \ - --msgbox "BIOS updated successfully.\n\nIf your keys have changed, be sure to re-sign all files in /boot\nafter you reboot.\n\nPress Enter to reboot" 0 80 - /bin/reboot - else - exit 0 - fi - ;; - "r" ) - # prompt for confirmation - if (whiptail $BG_COLOR_WARNING --title 'Reset Configuration?' \ - --yesno "This will clear all GPG keys, clear boot signatures and checksums, + if [ ! -z "$param" ]; then + # use first char from parameter + menu_choice=${param::1} + unset param + else + # Re-source config because we change it when an option is toggled + . /tmp/config + + dynamic_config_options=( + 'b' ' Change the /boot device' + ) + + # Options that don't apply to basic mode + [ "$CONFIG_BASIC" != "y" ] && dynamic_config_options+=( + 'r' ' Clear GPG key(s) and reset all user settings' + 'R' ' Change the root device for hashing' + 'D' ' Change the root directories to hash' + 'B' " $(get_config_display_action "$CONFIG_ROOT_CHECK_AT_BOOT") root check at boot" + 'L' " $(get_config_display_action "$CONFIG_RESTRICTED_BOOT") Restricted Boot" + ) + + # Basic itself is always available (though RB will refuse to enable it) + dynamic_config_options+=( + 'P' " $(get_config_display_action "$CONFIG_BASIC") $CONFIG_BRAND_NAME Basic Mode" + ) + + # Blob jail is only offered if this is a configuration with the blobs in + # firmware + [ "$CONFIG_SUPPORT_BLOB_JAIL" = "y" ] && dynamic_config_options+=( + 'J' " $(get_config_display_action "$CONFIG_USE_BLOB_JAIL") Firmware Blob Jail" + ) + + # Automatic boot + dynamic_config_options+=( + 'M' " Configure automatic boot" + ) + + # Basic-only options for automatic boot + [ "$CONFIG_BASIC" = "y" ] && dynamic_config_options+=( + 'A' " $(get_inverted_config_display_action "$CONFIG_BASIC_NO_AUTOMATIC_DEFAULT") automatic default boot option" + 'U' " $(get_config_display_action "$CONFIG_BASIC_USB_AUTOBOOT") USB automatic boot" + ) + + # Automatic power on - requires board support + [ "$CONFIG_SUPPORT_AUTOMATIC_POWERON" = "y" ] && dynamic_config_options+=( + 'N' " $(get_config_display_action "$CONFIG_AUTOMATIC_POWERON") automatic power-on" + ) + + # Boards with built-in keyboards can support optional USB keyboards as well. + # Boards that do not have a built-in keyboard/internal keyboard is USB connected export + # CONFIG_USB_KEYBOARD_REQUIRED=y; this hides the config option and ensures + # USB keyboard support always loads. + [ "$CONFIG_USB_KEYBOARD_REQUIRED" != y ] && dynamic_config_options+=( + 'K' " $(get_config_display_action "$CONFIG_USER_USB_KEYBOARD") USB keyboard" + ) + + # Add keyboard keymap selection option only if loadkeys and keymaps exist + if [ -x /bin/loadkeys ] && [ -d /usr/lib/kbd/keymaps ]; then + dynamic_config_options+=( + 'k' ' Change Keyboard Layout' + ) + fi + + # Debugging option always available + dynamic_config_options+=( + 'Z' " Configure $CONFIG_BRAND_NAME informational / debug output" + ) + + [ "$CONFIG_FINALIZE_PLATFORM_LOCKING" = "y" ] && dynamic_config_options+=( + 't' ' Deactivate Platform Locking to permit OS write access to firmware' + ) + + dynamic_config_options+=( + 's' ' Save the current configuration to the running BIOS' + 'x' ' Return to Main Menu' + ) + + unset menu_choice + whiptail_type $BG_COLOR_MAIN_MENU --title "Config Management Menu" \ + --menu "This menu lets you change settings for the current BIOS session.\n\nAll changes will revert after a reboot,\n\nunless you also save them to the running BIOS." 0 80 10 \ + "${dynamic_config_options[@]}" \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + menu_choice=$(cat /tmp/whiptail) + fi + + case "$menu_choice" in + "t") + unset CONFIG_FINALIZE_PLATFORM_LOCKING + replace_config /etc/config.user "CONFIG_FINALIZE_PLATFORM_LOCKING" "n" + combine_configs + . /tmp/config + ;; + "x") + exit 0 + ;; + "b") + CURRENT_OPTION="$(load_config_value CONFIG_BOOT_DEV)" + if ! fdisk -l 2>/dev/null | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" >/tmp/disklist.txt; then + whiptail_error --title 'ERROR: No bootable devices found' \ + --msgbox " $ERROR\n\n" 0 80 + exit 1 + fi + # filter out extraneous options + >/tmp/boot_device_list.txt + for i in $(cat /tmp/disklist.txt); do + # remove block device from list if numeric partitions exist, since not bootable + DEV_NUM_PARTITIONS=$(($(ls -1 $i* | wc -l) - 1)) + if [ ${DEV_NUM_PARTITIONS} -eq 0 ]; then + echo $i >>/tmp/boot_device_list.txt + else + ls $i* | tail -${DEV_NUM_PARTITIONS} >>/tmp/boot_device_list.txt + fi + done + file_selector "/tmp/boot_device_list.txt" \ + "Choose the default /boot device.\n\n${CURRENT_OPTION:+\n\nCurrently set to }$CURRENT_OPTION." \ + "Boot Device Selection" + if [ "$FILE" == "" ]; then + return + else + SELECTED_FILE=$FILE + fi + + # unmount /boot if needed + if grep -q /boot /proc/mounts; then + umount /boot 2>/dev/null + fi + # mount newly selected /boot device + if ! mount -o ro $SELECTED_FILE /boot 2>/tmp/error; then + ERROR=$(cat /tmp/error) + whiptail_error --title 'ERROR: unable to mount /boot' \ + --msgbox " $ERROR\n\n" 0 80 + exit 1 + fi + + set_config /etc/config.user "CONFIG_BOOT_DEV" "$SELECTED_FILE" + combine_configs + + whiptail --title 'Config change successful' \ + --msgbox "The /boot device was successfully changed to $SELECTED_FILE" 0 80 + ;; + "s") + read_rom /tmp/config-gui.rom + + replace_rom_file /tmp/config-gui.rom "heads/initrd/etc/config.user" /etc/config.user + + if (whiptail --title 'Update ROM?' \ + --yesno "This will reflash your BIOS with the updated version\n\nDo you want to proceed?" 0 80); then + /bin/flash.sh /tmp/config-gui.rom + whiptail --title 'BIOS Updated Successfully' \ + --msgbox "BIOS updated successfully.\n\nIf your keys have changed, be sure to re-sign all files in /boot\nafter you reboot.\n\nPress Enter to reboot" 0 80 + /bin/reboot + else + exit 0 + fi + ;; + "r") + # prompt for confirmation + if (whiptail_warning --title 'Reset Configuration?' \ + --yesno "This will clear all GPG keys, clear boot signatures and checksums, \nreset the /boot device, clear/reset the TPM (if present), \nand reflash your BIOS with the cleaned configuration. - \n\nDo you want to proceed?" 0 80) then - read_rom /tmp/config-gui.rom - # clear local keyring - rm /.gnupg/* | true - # clear /boot signatures/checksums - mount -o remount,rw /boot - rm /boot/kexec* | true - mount -o remount,ro /boot - # clear GPG keys and user settings - for i in `cbfs.sh -o /tmp/config-gui.rom -l | grep -e "heads/"`; do - cbfs.sh -o /tmp/config-gui.rom -d $i - done - # flash cleared ROM - - - /bin/flash.sh -c /tmp/config-gui.rom - # reset TPM if present - if [ "$CONFIG_TPM" = "y" ]; then - /bin/tpm-reset - fi - whiptail --title 'Configuration Reset Updated Successfully' \ - --msgbox "Configuration reset and BIOS updated successfully.\n\nPress Enter to reboot" 0 80 - /bin/reboot - else - exit 0 - fi - ;; - "R" ) - CURRENT_OPTION="$(load_config_value CONFIG_ROOT_DEV)" - fdisk -l | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" > /tmp/disklist.txt - # filter out extraneous options - > /tmp/root_device_list.txt - for i in `cat /tmp/disklist.txt`; do - # remove block device from list if numeric partitions exist, since not bootable - DEV_NUM_PARTITIONS=$((`ls -1 $i* | wc -l`-1)) - if [ ${DEV_NUM_PARTITIONS} -eq 0 ]; then - echo $i >> /tmp/root_device_list.txt - else - ls $i* | tail -${DEV_NUM_PARTITIONS} >> /tmp/root_device_list.txt - fi - done - file_selector "/tmp/root_device_list.txt" \ - "Choose the default root device.${CURRENT_OPTION:+\n\nCurrently set to }$CURRENT_OPTION." \ - "Root Device Selection" - if [ "$FILE" == "" ]; then - break - else - SELECTED_FILE=$FILE - fi - - set_config /etc/config.user "CONFIG_ROOT_DEV" "$SELECTED_FILE" - combine_configs - - whiptail --title 'Config change successful' \ - --msgbox "The root device was successfully changed to $SELECTED_FILE" 0 80 - ;; - "D" ) - CURRENT_OPTION="$(load_config_value CONFIG_ROOT_DIRLIST)" - - # Separate from prior prompt history on the terminal with two blanks - echo -e "\n" - - if [ -n "$CURRENT_OPTION" ]; then - echo -e "The current list of directories to hash is $CURRENT_OPTION" - fi - echo -e "Enter the new list of directories separated by spaces:" - echo -e "(Press enter with the list empty to cancel)" - read -r NEW_CONFIG_ROOT_DIRLIST - - # strip any leading forward slashes - NEW_CONFIG_ROOT_DIRLIST=$(echo $NEW_CONFIG_ROOT_DIRLIST | sed -e 's/^\///;s/ \// /g') - - #check if list empty - if [ -z "$NEW_CONFIG_ROOT_DIRLIST" ] ; then - whiptail --title 'Config change canceled' \ - --msgbox "Root device directory change canceled by user" 0 80 - break - fi - - set_config /etc/config.user "CONFIG_ROOT_DIRLIST" "$NEW_CONFIG_ROOT_DIRLIST" - combine_configs - - whiptail --title 'Config change successful' \ - --msgbox "The root directories to hash was successfully changed to:\n$NEW_CONFIG_ROOT_DIRLIST" 0 80 - ;; - "B" ) - CURRENT_OPTION="$(load_config_value CONFIG_ROOT_CHECK_AT_BOOT)" - if [ "$CURRENT_OPTION" != "y" ]; then - # Root device and directories must be set to enable this - if [ -z "$(load_config_value CONFIG_ROOT_DEV)" ] || [ -z "$(load_config_value CONFIG_ROOT_DIRLIST)" ]; then - whiptail $BG_COLOR_ERROR --title 'Root Check Not Configured' \ - --msgbox "Set the root device and directories to hash before enabling this feature." 0 80 - elif (whiptail --title 'Enable Root Hash Check at Boot?' \ - --yesno "This will enable checking root hashes each time you boot. + \n\nDo you want to proceed?" 0 80); then + read_rom /tmp/config-gui.rom + # clear local keyring + rm -rf /.gnupg/* || true + + # clear /boot signatures/checksums + detect_boot_device + mount -o remount,rw /boot + rm -f /boot/kexec* || true + mount -o remount,ro /boot + + # clear GPG keys and user settings + for i in $(cbfs.sh -o /tmp/config-gui.rom -l | grep -e "heads/"); do + cbfs.sh -o /tmp/config-gui.rom -d $i + done + # flash cleared ROM + /bin/flash.sh -c /tmp/config-gui.rom + + # reset TPM if present + if [ "$CONFIG_TPM" = "y" ]; then + /bin/tpm-reset + fi + whiptail --title 'Configuration Reset Updated Successfully' \ + --msgbox "Configuration reset and BIOS updated successfully.\n\nPress Enter to reboot" 0 80 + /bin/reboot + else + exit 0 + fi + ;; + "R") + CURRENT_OPTION="$(load_config_value CONFIG_ROOT_DEV)" + fdisk -l 2>/dev/null | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" >/tmp/disklist.txt + # filter out extraneous options + >/tmp/root_device_list.txt + for i in $(cat /tmp/disklist.txt); do + # remove block device from list if numeric partitions exist, since not bootable + DEV_NUM_PARTITIONS=$(($(ls -1 $i* | wc -l) - 1)) + if [ ${DEV_NUM_PARTITIONS} -eq 0 ]; then + echo $i >>/tmp/root_device_list.txt + else + ls $i* | tail -${DEV_NUM_PARTITIONS} >>/tmp/root_device_list.txt + fi + done + file_selector "/tmp/root_device_list.txt" \ + "Choose the default root device.${CURRENT_OPTION:+\n\nCurrently set to }$CURRENT_OPTION." \ + "Root Device Selection" + if [ "$FILE" == "" ]; then + break + else + SELECTED_FILE=$FILE + fi + + set_config /etc/config.user "CONFIG_ROOT_DEV" "$SELECTED_FILE" + combine_configs + + whiptail --title 'Config change successful' \ + --msgbox "The root device was successfully changed to $SELECTED_FILE" 0 80 + ;; + "D") + CURRENT_OPTION="$(load_config_value CONFIG_ROOT_DIRLIST)" + + # Separate from prior prompt history on the terminal with two blanks + echo -e "\n" + + if [ -n "$CURRENT_OPTION" ]; then + echo -e "The current list of directories to hash is $CURRENT_OPTION" + fi + echo -e "Enter the new list of directories separated by spaces:" + echo -e "(Press enter with the list empty to cancel)" + read -r NEW_CONFIG_ROOT_DIRLIST + + # strip any leading forward slashes + NEW_CONFIG_ROOT_DIRLIST=$(echo $NEW_CONFIG_ROOT_DIRLIST | sed -e 's/^\///;s/ \// /g') + + #check if list empty + if [ -z "$NEW_CONFIG_ROOT_DIRLIST" ]; then + whiptail --title 'Config change canceled' \ + --msgbox "Root device directory change canceled by user" 0 80 + break + fi + + set_config /etc/config.user "CONFIG_ROOT_DIRLIST" "$NEW_CONFIG_ROOT_DIRLIST" + combine_configs + + whiptail --title 'Config change successful' \ + --msgbox "The root directories to hash was successfully changed to:\n$NEW_CONFIG_ROOT_DIRLIST" 0 80 + ;; + "B") + if [ "$CONFIG_ROOT_CHECK_AT_BOOT" != "y" ]; then + # Root device and directories must be set to enable this + if [ -z "$CONFIG_ROOT_DEV" ] || [ -z "$CONFIG_ROOT_DIRLIST" ]; then + whiptail_error --title 'Root Check Not Configured' \ + --msgbox "Set the root device and directories to hash before enabling this feature." 0 80 + elif (whiptail --title 'Enable Root Hash Check at Boot?' \ + --yesno "This will enable checking root hashes each time you boot. \nDepending on the directories you are checking, this might add \na minute or more to the boot time. - \n\nDo you want to proceed?" 0 80) then - - set_config /etc/config.user "CONFIG_ROOT_CHECK_AT_BOOT" "y" - combine_configs - - # check that root hash file exists - if [ ! -f ${ROOT_HASH_FILE} ]; then - if (whiptail --title 'Generate Root Hash File' \ - --yesno "\nNo root hash file exists. - \nWould you like to create the initial hash file now?" 0 80) then - root-hashes-gui.sh -n - fi - fi - - whiptail --title 'Config change successful' \ - --msgbox "The root device will be checked at each boot." 0 80 - - fi - else - if (whiptail --title 'Disable Root Hash Check at Boot?' \ - --yesno "This will disable checking root hashes each time you boot. - \n\nDo you want to proceed?" 0 80) then - - set_config /etc/config.user "CONFIG_ROOT_CHECK_AT_BOOT" "n" - combine_configs - - whiptail --title 'Config change successful' \ - --msgbox "The root device will not be checked at each boot." 0 80 - fi - fi - ;; - "P" ) - if [ "$CONFIG_RESTRICTED_BOOT" = "y" ]; then - whiptail $BG_COLOR_ERROR --title 'Restricted Boot Active' \ - --msgbox "Disable Restricted Boot to enable Basic Mode." 0 80 - elif [ "$CONFIG_BASIC" != "y" ]; then - if (whiptail --title "Enable $CONFIG_BRAND_NAME Basic Mode?" \ - --yesno "This will remove all signature checking on the firmware + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_ROOT_CHECK_AT_BOOT" "y" + + # check that root hash file exists + if [ ! -f ${ROOT_HASH_FILE} ]; then + if (whiptail --title 'Generate Root Hash File' \ + --yesno "\nNo root hash file exists. + \nWould you like to create the initial hash file now?" 0 80); then + root-hashes-gui.sh -n + fi + fi + + whiptail --title 'Config change successful' \ + --msgbox "The root device will be checked at each boot." 0 80 + + fi + else + if (whiptail --title 'Disable Root Hash Check at Boot?' \ + --yesno "This will disable checking root hashes each time you boot. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_ROOT_CHECK_AT_BOOT" "n" + + whiptail --title 'Config change successful' \ + --msgbox "The root device will not be checked at each boot." 0 80 + fi + fi + ;; + "P") + if [ "$CONFIG_RESTRICTED_BOOT" = "y" ]; then + whiptail_error --title 'Restricted Boot Active' \ + --msgbox "Disable Restricted Boot to enable Basic Mode." 0 80 + elif [ "$CONFIG_BASIC" != "y" ]; then + if (whiptail --title "Enable $CONFIG_BRAND_NAME Basic Mode?" \ + --yesno "This will remove all signature checking on the firmware \nand boot files, and disable use of the Librem Key. - \n\nDo you want to proceed?" 0 80) then + \n\nDo you want to proceed?" 0 80); then - set_user_config "CONFIG_BASIC" "y" + set_user_config "CONFIG_BASIC" "y" - whiptail --title 'Config change successful' \ - --msgbox "$CONFIG_BRAND_NAME Basic mode enabled;\nsave the config change and reboot for it to go into effect." 0 80 + whiptail --title 'Config change successful' \ + --msgbox "$CONFIG_BRAND_NAME Basic mode enabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - else - if (whiptail --title "Disable $CONFIG_BRAND_NAME Basic Mode?" \ - --yesno "This will enable all signature checking on the firmware + fi + else + if (whiptail --title "Disable $CONFIG_BRAND_NAME Basic Mode?" \ + --yesno "This will enable all signature checking on the firmware \nand boot files, and enable use of the Librem Key. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_BASIC" "n" - - whiptail --title 'Config change successful' \ - --msgbox "$CONFIG_BRAND_NAME Basic mode has been disabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - fi - ;; - "L" ) - if [ "$CONFIG_RESTRICTED_BOOT" != "y" ]; then - if (whiptail --title 'Enable Restricted Boot Mode?' \ - --yesno "Restricted Boot allows booting: + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_BASIC" "n" + + whiptail --title 'Config change successful' \ + --msgbox "$CONFIG_BRAND_NAME Basic mode has been disabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + fi + ;; + "L") + if [ "$CONFIG_RESTRICTED_BOOT" != "y" ]; then + if (whiptail --title 'Enable Restricted Boot Mode?' \ + --yesno "Restricted Boot allows booting: \n* Signed installed OS \n* Signed ISOs from USB \nAll other boot methods are blocked. Recovery console and firmware updates @@ -336,209 +350,316 @@ while true; do \nRestricted boot can be disabled at any time. This resets TOTP/HOTP so it \nis evident that Restricted Boot was disabled. \n - \nDo you want to proceed?" 0 80) then + \nDo you want to proceed?" 0 80); then - set_user_config "CONFIG_RESTRICTED_BOOT" "y" + set_user_config "CONFIG_RESTRICTED_BOOT" "y" - whiptail --title 'Config change successful' \ - --msgbox "Restricted Boot mode enabled;\nsave the config change and reboot for it to go into effect." 0 80 + whiptail --title 'Config change successful' \ + --msgbox "Restricted Boot mode enabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - else - if (whiptail --title 'Disable Restricted Boot Mode?' \ - --yesno "This will re-enable all boot methods, the recovery console, and firmware + fi + else + if (whiptail --title 'Disable Restricted Boot Mode?' \ + --yesno "This will re-enable all boot methods, the recovery console, and firmware \nupdates. \nThis will also erase the TOTP/HOTP secret. \nProceeding will automatically update the boot firmware and reboot! - \n\nDo you want to proceed?" 0 80) then - - # Wipe the TPM TOTP/HOTP secret before flashing. Otherwise, enabling - # Restricted Boot again might restore the firmware to an identical - # state, and there would be no evidence that it had been temporarily - # disabled. - if ! wipe-totp >/dev/null 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail $BG_COLOR_ERROR --title 'ERROR: erasing TOTP secret' \ - --msgbox "Erasing TOTP Secret Failed\n\n${ERROR}" 0 80 - exit 1 - fi - - # We can't allow Restricted Boot to be disabled without flashing the - # firmware - this would allow the use of unrestricted mode without - # leaving evidence in the firmware. Disable it by flashing the new - # config directly. - FLASH_USER_CONFIG=/tmp/config-gui-config-user - cp /etc/config.user "$FLASH_USER_CONFIG" - set_config "$FLASH_USER_CONFIG" "CONFIG_RESTRICTED_BOOT" "n" - - read_rom /tmp/config-gui.rom - - replace_rom_file /tmp/config-gui.rom "heads/initrd/etc/config.user" "$FLASH_USER_CONFIG" - - /bin/flash.sh /tmp/config-gui.rom - whiptail --title 'BIOS Updated Successfully' \ - --msgbox "BIOS updated successfully.\n\nIf your keys have changed, be sure to re-sign all files in /boot\nafter you reboot.\n\nPress Enter to reboot" 0 80 - /bin/reboot - fi - fi - ;; - "J" ) - if [ "$CONFIG_USE_BLOB_JAIL" != "y" ]; then - if (whiptail --title 'Enable Firmware Blob Jail?' \ - --yesno "This will enable loading of firmware from flash on each boot - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_USE_BLOB_JAIL" "y" - - whiptail --title 'Config change successful' \ - --msgbox "Firmware Blob Jail use has been enabled;\nsave the config change and reboot for it to go into effect." 0 80 - - fi - else - if (whiptail --title 'Disable Firmware Blob Jail?' \ - --yesno "This will disable loading of firmware from flash on each boot. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_USE_BLOB_JAIL" "n" - - whiptail --title 'Config change successful' \ - --msgbox "Firmware Blob Jail use has been disabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - fi - ;; - "M" ) - if [ -z "$CONFIG_AUTO_BOOT_TIMEOUT" ]; then - current_msg="Automatic boot is currently disabled." - elif [ "$CONFIG_AUTO_BOOT_TIMEOUT" = 1 ]; then - current_msg="Currently boots automatically after 1 second." - else - current_msg="Currently boots automatically after $CONFIG_AUTO_BOOT_TIMEOUT seconds." - fi - whiptail --title "Automatic Boot" \ - --menu "$CONFIG_BRAND_NAME can boot automatically. Select the amount of time to wait\nbefore booting.\n\n$current_msg" 0 80 10 \ - "0" "Don't boot automatically" \ - "1" "1 second" \ - "5" "5 seconds" \ - "10" "10 seconds" \ - "C" "Cancel" \ - 2>/tmp/whiptail - new_setting="$(cat /tmp/whiptail)" - if ! [ "$new_setting" = "C" ]; then - if [ "$new_setting" = "0" ]; then - new_setting= # Empty disables automatic boot - current_msg="$CONFIG_BRAND_NAME will not boot automatically." - elif [ "$new_setting" = "1" ]; then - current_msg="$CONFIG_BRAND_NAME will boot automatically after 1 second." - else - current_msg="$CONFIG_BRAND_NAME will boot automatically after $new_setting seconds." - fi - set_user_config "CONFIG_AUTO_BOOT_TIMEOUT" "$new_setting" - whiptail --title 'Config change successful' \ - --msgbox "$current_msg\nSave the config change and reboot for it to go into effect." 0 80 - fi - ;; - "A" ) - if [ "$CONFIG_BASIC_NO_AUTOMATIC_DEFAULT" != "y" ]; then - if (whiptail --title 'Disable automatic default boot?' \ - --yesno "You will need to select a default boot option. + \n\nDo you want to proceed?" 0 80); then + + # Wipe the TPM TOTP/HOTP secret before flashing. Otherwise, enabling + # Restricted Boot again might restore the firmware to an identical + # state, and there would be no evidence that it had been temporarily + # disabled. + if ! wipe-totp >/dev/null 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error --title 'ERROR: erasing TOTP secret' \ + --msgbox "Erasing TOTP Secret Failed\n\n${ERROR}" 0 80 + exit 1 + fi + + # We can't allow Restricted Boot to be disabled without flashing the + # firmware - this would allow the use of unrestricted mode without + # leaving evidence in the firmware. Disable it by flashing the new + # config directly. + FLASH_USER_CONFIG=/tmp/config-gui-config-user + cp /etc/config.user "$FLASH_USER_CONFIG" + set_config "$FLASH_USER_CONFIG" "CONFIG_RESTRICTED_BOOT" "n" + + read_rom /tmp/config-gui.rom + + replace_rom_file /tmp/config-gui.rom "heads/initrd/etc/config.user" "$FLASH_USER_CONFIG" + + /bin/flash.sh /tmp/config-gui.rom + whiptail --title 'BIOS Updated Successfully' \ + --msgbox "BIOS updated successfully.\n\nIf your keys have changed, be sure to re-sign all files in /boot\nafter you reboot.\n\nPress Enter to reboot" 0 80 + /bin/reboot + fi + fi + ;; + "J") + if [ "$CONFIG_USE_BLOB_JAIL" != "y" ]; then + if (whiptail --title 'Enable Firmware Blob Jail?' \ + --yesno "This will enable loading of firmware from flash on each boot + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_USE_BLOB_JAIL" "y" + + whiptail --title 'Config change successful' \ + --msgbox "Firmware Blob Jail use has been enabled;\nsave the config change and reboot for it to go into effect." 0 80 + + fi + else + if (whiptail --title 'Disable Firmware Blob Jail?' \ + --yesno "This will disable loading of firmware from flash on each boot. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_USE_BLOB_JAIL" "n" + + whiptail --title 'Config change successful' \ + --msgbox "Firmware Blob Jail use has been disabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + fi + ;; + "M") + if [ -z "$CONFIG_AUTO_BOOT_TIMEOUT" ]; then + current_msg="Automatic boot is currently disabled." + elif [ "$CONFIG_AUTO_BOOT_TIMEOUT" = 1 ]; then + current_msg="Currently boots automatically after 1 second." + else + current_msg="Currently boots automatically after $CONFIG_AUTO_BOOT_TIMEOUT seconds." + fi + whiptail --title "Automatic Boot" \ + --menu "$CONFIG_BRAND_NAME can boot automatically. Select the amount of time to wait\nbefore booting.\n\n$current_msg" 0 80 10 \ + "0" "Don't boot automatically" \ + "1" "1 second" \ + "5" "5 seconds" \ + "10" "10 seconds" \ + "C" "Cancel" \ + 2>/tmp/whiptail + new_setting="$(cat /tmp/whiptail)" + if ! [ "$new_setting" = "C" ]; then + if [ "$new_setting" = "0" ]; then + new_setting= # Empty disables automatic boot + current_msg="$CONFIG_BRAND_NAME will not boot automatically." + elif [ "$new_setting" = "1" ]; then + current_msg="$CONFIG_BRAND_NAME will boot automatically after 1 second." + else + current_msg="$CONFIG_BRAND_NAME will boot automatically after $new_setting seconds." + fi + set_user_config "CONFIG_AUTO_BOOT_TIMEOUT" "$new_setting" + whiptail --title 'Config change successful' \ + --msgbox "$current_msg\nSave the config change and reboot for it to go into effect." 0 80 + fi + ;; + "A") + if [ "$CONFIG_BASIC_NO_AUTOMATIC_DEFAULT" != "y" ]; then + if (whiptail --title 'Disable automatic default boot?' \ + --yesno "You will need to select a default boot option. \nIf the boot options are changed, such as for an OS update, \nyou will be prompted to select a new default. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_BASIC_NO_AUTOMATIC_DEFAULT" "y" - - whiptail --title 'Config change successful' \ - --msgbox "Automatic default boot disabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - else - if (whiptail --title 'Enable automatic default boot?' \ - --yesno "The first boot option will be used automatically. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_BASIC_NO_AUTOMATIC_DEFAULT" "n" - - whiptail --title 'Config change successful' \ - --msgbox "Automatic default boot enabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - fi - ;; - "U" ) - if [ "$CONFIG_BASIC_USB_AUTOBOOT" != "y" ]; then - if (whiptail --title 'Enable USB automatic boot?' \ - --yesno "During boot, an attached bootable USB disk will be booted + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_BASIC_NO_AUTOMATIC_DEFAULT" "y" + + whiptail --title 'Config change successful' \ + --msgbox "Automatic default boot disabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + else + if (whiptail --title 'Enable automatic default boot?' \ + --yesno "The first boot option will be used automatically. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_BASIC_NO_AUTOMATIC_DEFAULT" "n" + + whiptail --title 'Config change successful' \ + --msgbox "Automatic default boot enabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + fi + ;; + "U") + if [ "$CONFIG_BASIC_USB_AUTOBOOT" != "y" ]; then + if (whiptail --title 'Enable USB automatic boot?' \ + --yesno "During boot, an attached bootable USB disk will be booted \nby default instead of the installed operating system. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_BASIC_USB_AUTOBOOT" "y" - - whiptail --title 'Config change successful' \ - --msgbox "USB automatic boot enabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - else - if (whiptail --title 'Disable USB automatic boot?' \ - --yesno "USB disks will no longer be booted by default. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_BASIC_USB_AUTOBOOT" "n" - - whiptail --title 'Config change successful' \ - --msgbox "USB automatic boot disabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - fi - ;; - "N" ) - if [ "$CONFIG_AUTOMATIC_POWERON" != "y" ]; then - if (whiptail --title 'Enable automatic power-on?' \ - --yesno "The system will boot automatically when power is applied. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_AUTOMATIC_POWERON" "y" - - whiptail --title 'Config change successful' \ - --msgbox "Automatic power-on enabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - else - if (whiptail --title 'Disable automatic power-on?' \ - --yesno "The system will stay off when power is applied. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_AUTOMATIC_POWERON" "n" - - # Disable the EC BRAM setting too, otherwise it persists until - # manually disabled. On the off chance the user does not actually - # flash this change, we'll enable it again during boot. - set_ec_poweron.sh n - - whiptail --title 'Config change successful' \ - --msgbox "Automatic power-on disabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - fi - ;; - "Z" ) - if [ "$CONFIG_DEBUG_OUTPUT" != "y" ]; then - if (whiptail --title 'Enable Debugging and Tracing output?' \ - --yesno "This will enable DEBUG and TRACE output from scripts. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_DEBUG_OUTPUT" "y" - set_user_config "CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" "y" - - whiptail --title 'Config change successful' \ - --msgbox "Debugging and Tracing output enabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - else - if (whiptail --title 'Disable Enable Debugging and Tracing output?' \ - --yesno "This will disable DEBUG and TRACE output from scripts. - \n\nDo you want to proceed?" 0 80) then - - set_user_config "CONFIG_DEBUG_OUTPUT" "n" - set_user_config "CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" "n" - - whiptail --title 'Config change successful' \ - --msgbox "Debugging and Tracing output disabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - fi - esac - + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_BASIC_USB_AUTOBOOT" "y" + + whiptail --title 'Config change successful' \ + --msgbox "USB automatic boot enabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + else + if (whiptail --title 'Disable USB automatic boot?' \ + --yesno "USB disks will no longer be booted by default. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_BASIC_USB_AUTOBOOT" "n" + + whiptail --title 'Config change successful' \ + --msgbox "USB automatic boot disabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + fi + ;; + "N") + if [ "$CONFIG_AUTOMATIC_POWERON" != "y" ]; then + if (whiptail --title 'Enable automatic power-on?' \ + --yesno "The system will boot automatically when power is applied. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_AUTOMATIC_POWERON" "y" + + whiptail --title 'Config change successful' \ + --msgbox "Automatic power-on enabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + else + if (whiptail --title 'Disable automatic power-on?' \ + --yesno "The system will stay off when power is applied. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_AUTOMATIC_POWERON" "n" + + # Disable the EC BRAM setting too, otherwise it persists until + # manually disabled. On the off chance the user does not actually + # flash this change, we'll enable it again during boot. + set_ec_poweron.sh n + + whiptail --title 'Config change successful' \ + --msgbox "Automatic power-on disabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + fi + ;; + "K") + if [ "$CONFIG_USER_USB_KEYBOARD" != "y" ]; then + if (whiptail --title 'Enable USB Keyboard?' \ + --yesno "USB keyboards will be usable in $CONFIG_BRAND_NAME. + \n\nEnabling USB keyboards could allow a compromised USB device to control + \n$CONFIG_BRAND_NAME. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_USER_USB_KEYBOARD" "y" + + whiptail --title 'Config change successful' \ + --msgbox "USB Keyboard support has been enabled;\nsave the config change and reboot for it to go into effect." 0 80 + + fi + else + if (whiptail --title 'Disable USB Keyboard?' \ + --yesno "Only the built-in keyboard will be usable in $CONFIG_BRAND_NAME. + \n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_USER_USB_KEYBOARD" "n" + + whiptail --title 'Config change successful' \ + --msgbox "USB Keyboard support has been disabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + fi + ;; + "k") + KEYMAP_ROOT="/usr/lib/kbd/keymaps" + CURRENT_KEYMAP="$(load_config_value CONFIG_KEYBOARD_KEYMAP)" + + while true; do + # Guide user into finding which keyboard type he has + whiptail --title "Keyboard Layout Type" \ + --menu "Look at the first row of your keyboard and select the layout type:" 0 60 3 \ + "qwerty" "QWERTY (most common: US, UK, etc.)" \ + "qwertz" "QWERTZ (German, Central Europe)" \ + "azerty" "AZERTY (French, Belgian)" \ + "Cancel" "Cancel keymap selection" \ + 2>/tmp/whiptail || break + + layout_choice=$(cat /tmp/whiptail) + case "$layout_choice" in + "Cancel"|"") + break + ;; + "qwerty"|"qwertz"|"azerty") + BROWSE_DIR="$KEYMAP_ROOT/i386/$layout_choice" + ;; + *) + whiptail --title "Invalid selection" --msgbox "Invalid layout selection." 0 40 + break + ;; + esac + + while true; do + menu_entries=() + # Add ".." at the top to go back to layout selection + menu_entries+=(".." "Back to layout selection") + # List .map files in the selected layout directory + for entry in "$BROWSE_DIR"/*.map; do + [ -f "$entry" ] && menu_entries+=("$(basename "$entry")" "$(basename "$entry")") + done + menu_entries+=("Cancel" "Cancel") + + if [ ${#menu_entries[@]} -le 2 ]; then + whiptail --title "No keymaps" --msgbox "No keymaps found in $BROWSE_DIR." 0 60 + break + fi + + whiptail --title "Select Keymap" \ + --menu "Select a keymap file for $layout_choice layout.\n\n(Current: ${CURRENT_KEYMAP:-none})" 0 80 18 \ + "${menu_entries[@]}" 2>/tmp/whiptail || break + + choice=$(cat /tmp/whiptail) + if [ "$choice" = "Cancel" ]; then + break 2 + fi + if [ "$choice" = ".." ]; then + # Go back to layout selection + break + elif [[ "$choice" == *.map ]]; then + SELECTED_KEYMAP="$BROWSE_DIR/$choice" + load_keymap "$SELECTED_KEYMAP" + echo + echo "------------------------------------------------------------" + echo "Keymap loaded: $SELECTED_KEYMAP" + echo + echo "You can now test your keyboard layout in this shell." + echo "Press Enter when done testing to continue..." + echo "------------------------------------------------------------" + read -p $'\nTest your keymap now. Press Enter to continue:\n' dummy + if whiptail --title "Keep this keymap?" \ + --yesno "Do you want to use this keymap?\n\n$SELECTED_KEYMAP" 0 70; then + set_user_config "CONFIG_KEYBOARD_KEYMAP" "$SELECTED_KEYMAP" + whiptail --title "Keymap set" --msgbox "Keymap set to:\n\n$SELECTED_KEYMAP\n\nSave the config change and reboot for it to go into effect." 0 70 + break 2 + fi + load_keymap "$CURRENT_KEYMAP" + fi + done + done + ;; + "Z") + unset output_choice + whiptail_type $BG_COLOR_MAIN_MENU --title "Informational / Debug Output" \ + --menu "$CONFIG_BRAND_NAME can display informational or debug output.\n\nChoose the output level:" 0 80 10 \ + 0 'None - Show no extra output' \ + 1 "Info - Show information about operations in $CONFIG_BRAND_NAME" \ + 2 "Debug - Show detailed information suitable for debugging $CONFIG_BRAND_NAME" \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + output_choice=$(cat /tmp/whiptail) + case "$output_choice" in + 0) + set_user_config "CONFIG_DEBUG_OUTPUT" "n" + set_user_config "CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" "n" + set_user_config "CONFIG_QUIET_MODE" "y" + ;; + 1) + set_user_config "CONFIG_DEBUG_OUTPUT" "n" + set_user_config "CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" "n" + set_user_config "CONFIG_QUIET_MODE" "n" + ;; + 2) + set_user_config "CONFIG_DEBUG_OUTPUT" "y" + set_user_config "CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" "y" + set_user_config "CONFIG_QUIET_MODE" "n" + ;; + esac + whiptail --title 'Config change successful' \ + --msgbox "Output level changed.\nSave the config change and reboot for it to go into effect." 0 80 + ;; + esac done exit 0 diff --git a/initrd/bin/flash-gui.sh b/initrd/bin/flash-gui.sh index 56d527195..03deeec9f 100755 --- a/initrd/bin/flash-gui.sh +++ b/initrd/bin/flash-gui.sh @@ -5,10 +5,10 @@ set -e -o pipefail . /etc/gui_functions . /tmp/config -TRACE "Under /bin/flash-gui.sh" +TRACE_FUNC if [ "$CONFIG_RESTRICTED_BOOT" = y ]; then - whiptail $BG_COLOR_ERROR --title 'Restricted Boot Active' \ + whiptail_error --title 'Restricted Boot Active' \ --msgbox "Disable Restricted Boot to flash new firmware." 0 80 exit 1 fi @@ -42,7 +42,7 @@ single_glob() { while true; do unset menu_choice - whiptail $BG_COLOR_MAIN_MENU --title "Firmware Management Menu" \ + whiptail_type $BG_COLOR_MAIN_MENU --title "Firmware Management Menu" \ --menu "Select the firmware function to perform\n\nRetaining settings copies existing settings to the new firmware:\n* Keeps your GPG keyring\n* Keeps changes to the default /boot device\n\nErasing settings uses the new firmware as-is:\n* Erases any existing GPG keyring\n* Restores firmware to default factory settings\n* Clears out /boot signatures\n\nIf you are just updating your firmware, you probably want to retain\nyour settings." 0 80 10 \ 'f' ' Flash the firmware with a new ROM, retain settings' \ 'c' ' Flash the firmware with a new ROM, erase settings' \ @@ -56,7 +56,7 @@ while true; do exit 0 ;; f | c) - if (whiptail $BG_COLOR_WARNING --title 'Flash the BIOS with a new ROM' \ + if (whiptail_warning --title 'Flash the BIOS with a new ROM' \ --yesno "You will need to insert a USB drive containing your BIOS image (*.zip or\n*.$UPDATE_PLAIN_EXT).\n\nAfter you select this file, this program will reflash your BIOS.\n\nDo you want to proceed?" 0 80); then mount_usb if grep -q /media /proc/mounts; then @@ -115,7 +115,7 @@ while true; do exit 1 fi - if ! whiptail $BG_COLOR_WARNING --title 'Flash ROM?' \ + if ! whiptail_warning --title 'Flash ROM?' \ --yesno "This will replace your current ROM with:\n\n$PKG_FILE_DISPLAY\n\nDo you want to proceed?" 0 80; then exit 1 fi @@ -136,7 +136,7 @@ while true; do fi ROM="$PKG_EXTRACT/$(basename "$PKG_FILE")" ROM_HASH=$(sha256sum "$ROM" | awk '{print $1}') - if ! (whiptail $CONFIG_ERROR_BG_COLOR --title 'Flash ROM without integrity check?' \ + if ! (whiptail_error --title 'Flash ROM without integrity check?' \ --yesno "You have provided a *.$UPDATE_PLAIN_EXT file. The integrity of the file can not be\nchecked automatically for this file type.\n\nROM: $PKG_FILE_DISPLAY\nSHA256SUM: $ROM_HASH\n\nIf you do not know how to check the file integrity yourself,\nyou should use a *.zip file instead.\n\nIf the file is damaged, you will not be able to boot anymore.\nDo you want to proceed flashing without file integrity check?" 0 80); then exit 1 fi diff --git a/initrd/bin/flash.sh b/initrd/bin/flash.sh index 6ef16a52e..c5389a11a 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -1,137 +1,36 @@ -#!/bin/ash -# -# based off of flashrom-x230 +#!/bin/bash # # NOTE: This script is used on legacy-flash boards and runs with busybox ash, # not bash set -e -o pipefail -. /etc/ash_functions +. /etc/functions . /tmp/config echo -TRACE "Under /bin/flash.sh" +TRACE_FUNC -case "$CONFIG_FLASHROM_OPTIONS" in - -* ) - echo "Board $CONFIG_BOARD detected, continuing..." +case "$CONFIG_FLASH_OPTIONS" in + "" ) + die "ERROR: No flash options have been configured!\n\nEach board requires specific CONFIG_FLASH_OPTIONS options configured. It's unsafe to flash without them.\n\nAborting." ;; * ) - die "ERROR: No board has been configured!\n\nEach board requires specific flashrom options and it's unsafe to flash without them.\n\nAborting." + DEBUG "Flash options detected: $CONFIG_FLASH_OPTIONS" + echo "Board $CONFIG_BOARD detected with flash options configured. Continuing..." ;; esac -flashrom_progress() { - # The ichspi programmer now spews register status lines constantly that are - # brutally slow to feed through the parser in flashrom_progress_tokenize. - # Filter the input with grep for only lines containing at least one token - # that we care about. - grep -E -e 'contents\.\.\.' -e 'done\.' -e '0x[0-9a-f]+-(0x[0-9a-f]+):' \ - -e 'identical' -e 'VERIFIED\.' -e 'FAILED' | \ - tr ' ' '\n' | flashrom_progress_tokenize "$1" -} - -print_flashing_progress() { - local spaces=' ' - local hashes='##################################################' - local percent pct1 pct2 progressbar progressbar2 - percent="$1" - pct1=$((percent / 2)) - pct2=$((50 - percent / 2)) - progressbar=${hashes:0:$pct1} - progressbar2=${spaces:0:$pct2} - echo -ne "Flashing: [${progressbar}${spin:$spin_idx:1}${progressbar2}] (${percent}%)\\r" -} - -flashrom_progress_tokenize() { - local current=0 - local total_bytes="$1" - local percent=0 - local IN='' - local spin='-\|/' - local spin_idx=0 - local status='init' - local prev_word='' - local prev_prev_word='' - - echo "Initializing Flash Programmer" - while true ; do - prev_prev_word=$prev_word - prev_word=$IN - IFS= read -r -t 0.2 IN - spin_idx=$(( (spin_idx+1) %4 )) - if [ "$status" == "init" ]; then - if [ "$IN" == "contents..." ]; then - status="reading" - echo "Reading old flash contents. Please wait..." - fi - fi - if [ "$status" == "reading" ]; then - if echo "${IN}" | grep "done." > /dev/null ; then - status="writing" - IN= - fi - fi - if [ "$status" == "writing" ]; then - # walk_eraseblocks() prints info for each block, of the form - # , 0xAAAAAA-0xBBBBBB:X - # The 'X' is a char indicating the action, but the debug from actually erasing - # and writing is mixed into the output so it may be separated. It can also be - # interrupted occasionally, so only match a complete token. - current=$(echo "$IN" | sed -nE 's/^0x[0-9a-f]+-(0x[0-9a-f]+):.*$/\1/p') - if [ "$current" != "" ]; then - percent=$((100 * (current + 1) / total_bytes)) - fi - print_flashing_progress "$percent" - if [ "$IN" == "done." ]; then - status="verifying" - IN= - print_flashing_progress 100 - echo "" - echo "Verifying flash contents. Please wait..." - fi - # This appears before "Erase/write done."; skip the verifying state - if [ "$IN" == "identical" ]; then - status="done" - IN= - print_flashing_progress 100 - echo "" - echo "The flash contents are identical to the image being flashed." - break - fi - fi - if [ "$status" == "verifying" ]; then - if echo "${IN}" | grep "VERIFIED." > /dev/null ; then - status="done" - echo "The flash contents were verified and the image was flashed correctly." - break - elif echo "${IN}" | grep "FAILED" > /dev/null ; then - echo 'Error while verifying flash content' - break - fi - fi - done - echo "" - if [ "$status" == "done" ]; then - return 0 - else - echo 'Error flashing coreboot -- see timestampped flashrom log in /tmp for more info' - echo "" - return 1 - fi -} - flash_rom() { ROM=$1 if [ "$READ" -eq 1 ]; then - flashrom $CONFIG_FLASHROM_OPTIONS -r "${ROM}" \ - || die "Backup to $ROM failed" + $CONFIG_FLASH_OPTIONS -r "${ROM}" \ + || recovery "Backup to $ROM failed" else cp "$ROM" /tmp/${CONFIG_BOARD}.rom sha256sum /tmp/${CONFIG_BOARD}.rom if [ "$CLEAN" -eq 0 ]; then preserve_rom /tmp/${CONFIG_BOARD}.rom \ - || die "$ROM: Config preservation failed" + || recovery "$ROM: Config preservation failed" fi # persist serial number from CBFS if cbfs.sh -r serial_number > /tmp/serial 2>/dev/null; then @@ -142,16 +41,15 @@ flash_rom() { # persist PCHSTRP9 from flash descriptor if [ "$CONFIG_BOARD" = "librem_l1um" ]; then echo "Persisting PCHSTRP9" - flashrom $CONFIG_FLASHROM_OPTIONS -r /tmp/ifd.bin --ifd -i fd >/dev/null 2>&1 \ + $CONFIG_FLASH_OPTIONS -r /tmp/ifd.bin --ifd -i fd >/dev/null 2>&1 \ || die "Failed to read flash descriptor" dd if=/tmp/ifd.bin bs=1 count=4 skip=292 of=/tmp/pchstrp9.bin >/dev/null 2>&1 dd if=/tmp/pchstrp9.bin bs=1 count=4 seek=292 of=/tmp/${CONFIG_BOARD}.rom conv=notrunc >/dev/null 2>&1 fi - flashrom $CONFIG_FLASHROM_OPTIONS -w /tmp/${CONFIG_BOARD}.rom \ - -V -o "/tmp/flashrom-$(date '+%Y%m%d-%H%M%S').log" 2>&1 | \ - flashrom_progress "$(stat -c %s "/tmp/${CONFIG_BOARD}.rom")" \ - || die "$ROM: Flash failed" + warn "Do not power off computer. Updating firmware, this will take a few minutes" + $CONFIG_FLASH_OPTIONS -w /tmp/${CONFIG_BOARD}.rom 2>&1 \ + || recovery "$ROM: Flash failed" fi } @@ -185,8 +83,8 @@ if [ "$READ" -eq 0 ] && [ "${ROM##*.}" = tgz ]; then fi echo "Reading current flash and building an update image" - flashrom $CONFIG_FLASHROM_OPTIONS -r /tmp/flash.sh.bak \ - || die "Read of flash has failed" + $CONFIG_FLASH_OPTIONS -r /tmp/flash.sh.bak \ + || recovery "Read of flash has failed" # ROM and bootblock already have ECC bootblock=$(echo /tmp/verified_rom/*.bootblock) diff --git a/initrd/bin/flashrom-kgpe-d16-openbmc.sh b/initrd/bin/flashprog-kgpe-d16-openbmc.sh similarity index 62% rename from initrd/bin/flashrom-kgpe-d16-openbmc.sh rename to initrd/bin/flashprog-kgpe-d16-openbmc.sh index 85108d9f0..adf356d86 100755 --- a/initrd/bin/flashrom-kgpe-d16-openbmc.sh +++ b/initrd/bin/flashprog-kgpe-d16-openbmc.sh @@ -1,7 +1,7 @@ #!/bin/bash . /etc/functions -TRACE "Under /bin/flashrom-kgpe-d16-openbmc.sh" +TRACE_FUNC ROM="$1" if [ -z "$1" ]; then @@ -11,7 +11,7 @@ fi cp "$ROM" /tmp/kgpe-d16-openbmc.rom sha256sum /tmp/kgpe-d16-openbmc.rom -flashrom --programmer="ast1100:spibus=2,cpu=reset" -c "S25FL128P......0" -w /tmp/kgpe-d16-openbmc.rom \ +flashprog --programmer="ast1100:spibus=2,cpu=reset" -c "S25FL128P......0" -w /tmp/kgpe-d16-openbmc.rom \ || die "$ROM: Flash failed" warn "Reboot and hopefully it works" diff --git a/initrd/bin/generic-init b/initrd/bin/generic-init index 438f29d99..0a4a17a63 100755 --- a/initrd/bin/generic-init +++ b/initrd/bin/generic-init @@ -6,7 +6,7 @@ mount_boot() { - TRACE "Under /bin/generic-init:mount_boot" + TRACE_FUNC # Mount local disk if it is not already mounted if ! grep -q /boot /proc/mounts ; then mount -o ro /boot \ diff --git a/initrd/bin/gpg-gui.sh b/initrd/bin/gpg-gui.sh index f2406e53a..738de34ab 100755 --- a/initrd/bin/gpg-gui.sh +++ b/initrd/bin/gpg-gui.sh @@ -5,7 +5,7 @@ set -e -o pipefail . /etc/gui_functions . /tmp/config -TRACE "Under /bin/gpg-gui.sh" +TRACE_FUNC gpg_flash_rom() { if [ "$1" = "replace" ]; then @@ -65,7 +65,7 @@ gpg_flash_rom() { if (whiptail --title 'BIOS Flashed Successfully' \ --yesno "Would you like to update the checksums and sign all of the files in /boot?\n\nYou will need your GPG key to continue and this will modify your disk.\n\nOtherwise the system will reboot immediately." 0 80) then if ! update_checksums ; then - whiptail $BG_COLOR_ERROR --title 'ERROR' \ + whiptail_error --title 'ERROR' \ --msgbox "Failed to update checksums / sign default config" 0 80 fi else @@ -89,7 +89,7 @@ gpg_post_gen_mgmt() { whiptail --title "The GPG Key Copied Successfully" \ --msgbox "${GPG_GEN_KEY}.asc copied successfully." 0 80 else - whiptail $BG_COLOR_ERROR --title 'ERROR: Copy Failed' \ + whiptail_error --title 'ERROR: Copy Failed' \ --msgbox "Unable to copy ${GPG_GEN_KEY}.asc to /media" 0 80 fi umount /media @@ -98,7 +98,7 @@ gpg_post_gen_mgmt() { --yesno "Would you like to add the GPG public key you generated to the BIOS?\n\nThis makes it a trusted key used to sign files in /boot\n\n" 0 80) then /bin/flash.sh -r /tmp/gpg-gui.rom if [ ! -s /tmp/gpg-gui.rom ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: BIOS Read Failed!' \ + whiptail_error --title 'ERROR: BIOS Read Failed!' \ --msgbox "Unable to read BIOS" 0 80 exit 1 fi @@ -124,7 +124,7 @@ gpg_add_key_reflash() { /bin/flash.sh -r /tmp/gpg-gui.rom if [ ! -s /tmp/gpg-gui.rom ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: BIOS Read Failed!' \ + whiptail_error --title 'ERROR: BIOS Read Failed!' \ --msgbox "Unable to read BIOS" 0 80 exit 1 fi @@ -141,14 +141,14 @@ gpg_add_key_reflash() { while true; do unset menu_choice - whiptail $BG_COLOR_MAIN_MENU --title "GPG Management Menu" \ + whiptail_type $BG_COLOR_MAIN_MENU --title "GPG Management Menu" \ --menu 'Select the GPG function to perform' 0 80 10 \ 'r' ' Add GPG key to running BIOS and reflash' \ 'a' ' Add GPG key to standalone BIOS image and flash' \ 'e' ' Replace GPG key(s) in the current ROM and reflash' \ 'l' ' List GPG keys in your keyring' \ 'p' ' Export public GPG key to USB drive' \ - 'g' ' Generate GPG keys manually on a USB security token' \ + 'g' ' Generate GPG keys manually on a USB security dongle' \ 'x' ' Exit' \ 2>/tmp/whiptail || recovery "GUI menu failed" @@ -181,7 +181,7 @@ while true; do fi cp "$ROM" /tmp/gpg-gui.rom - if (whiptail $BG_COLOR_WARNING --title 'Flash ROM?' \ + if (whiptail_warning --title 'Flash ROM?' \ --yesno "This will replace your old ROM with $ROM\n\nDo you want to proceed?" 0 80) then gpg_flash_rom else @@ -218,7 +218,7 @@ while true; do whiptail --title "The GPG Key Copied Successfully" \ --msgbox "public-key.asc copied successfully." 0 80 else - whiptail $BG_COLOR_ERROR --title 'ERROR: Copy Failed' \ + whiptail_error --title 'ERROR: Copy Failed' \ --msgbox "Unable to copy public-key.asc to /media" 0 80 fi umount /media diff --git a/initrd/bin/gpgv b/initrd/bin/gpgv index 67631eda5..e77197684 100755 --- a/initrd/bin/gpgv +++ b/initrd/bin/gpgv @@ -2,5 +2,5 @@ # if we are using the full GPG we need a wrapper for the gpgv executable . /etc/functions -TRACE "Under /bin/gpgv" +TRACE_FUNC exec gpg --verify "$@" diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index ac75de7bd..7d4bf2eaa 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -1,9 +1,9 @@ #!/bin/bash # Boot from a local disk installation -BOARD_NAME=${CONFIG_BOARD_NAME:-${CONFIG_BOARD}} +BOARD_NAME=${CONFIG_BOARD_NAME:-${CONFIG_BOARD}} MAIN_MENU_TITLE="${BOARD_NAME} | $CONFIG_BRAND_NAME Boot Menu" -export BG_COLOR_MAIN_MENU="" +export BG_COLOR_MAIN_MENU="normal" . /etc/functions . /etc/gui_functions @@ -16,649 +16,638 @@ export BG_COLOR_MAIN_MENU="" # # see errors again. skip_to_menu="false" -mount_boot() -{ - TRACE "Under /bin/gui-init:mount_boot" - # Mount local disk if it is not already mounted - while ! grep -q /boot /proc/mounts ; do - # try to mount if CONFIG_BOOT_DEV exists - if [ -e "$CONFIG_BOOT_DEV" ]; then - mount -o ro $CONFIG_BOOT_DEV /boot - [[ $? -eq 0 ]] && continue - fi - - # CONFIG_BOOT_DEV doesn't exist or couldn't be mounted, so give user options - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR - whiptail $BG_COLOR_ERROR --title "ERROR: No Bootable OS Found!" \ - --menu " No bootable OS was found on the default boot device $CONFIG_BOOT_DEV. +mount_boot() { + TRACE_FUNC + # Mount local disk if it is not already mounted + while ! grep -q /boot /proc/mounts; do + # try to mount if CONFIG_BOOT_DEV exists + if [ -e "$CONFIG_BOOT_DEV" ]; then + mount -o ro $CONFIG_BOOT_DEV /boot + [[ $? -eq 0 ]] && continue + fi + + # CONFIG_BOOT_DEV doesn't exist or couldn't be mounted, so give user options + BG_COLOR_MAIN_MENU="error" + whiptail_error --title "ERROR: No Bootable OS Found!" \ + --menu " No bootable OS was found on the default boot device $CONFIG_BOOT_DEV. How would you like to proceed?" 0 80 4 \ - 'b' ' Select a new boot device' \ - 'u' ' Boot from USB' \ - 'm' ' Continue to the main menu' \ - 'x' ' Exit to recovery shell' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - b ) - config-gui.sh boot_device_select - if [ $? -eq 0 ]; then - # update CONFIG_BOOT_DEV - . /tmp/config - BG_COLOR_MAIN_MENU="" - fi - ;; - u ) - exec /bin/usb-init - ;; - m ) - skip_to_menu="true" - break - ;; - * ) - recovery "User requested recovery shell" - ;; - esac - done + 'b' ' Select a new boot device' \ + 'u' ' Boot from USB' \ + 'm' ' Continue to the main menu' \ + 'x' ' Exit to recovery shell' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + b) + config-gui.sh boot_device_select + if [ $? -eq 0 ]; then + # update CONFIG_BOOT_DEV + . /tmp/config + BG_COLOR_MAIN_MENU="normal" + fi + ;; + u) + exec /bin/usb-init + ;; + m) + skip_to_menu="true" + break + ;; + *) + recovery "User requested recovery shell" + ;; + esac + done } -verify_global_hashes() -{ - TRACE "Under /bin/gui-init:verify_global_hashes" - # Check the hashes of all the files, ignoring signatures for now - check_config /boot force - TMP_HASH_FILE="/tmp/kexec/kexec_hashes.txt" - TMP_TREE_FILE="/tmp/kexec/kexec_tree.txt" - TMP_PACKAGE_TRIGGER_PRE="/tmp/kexec/kexec_package_trigger_pre.txt" - TMP_PACKAGE_TRIGGER_POST="/tmp/kexec/kexec_package_trigger_post.txt" - - if verify_checksums /boot ; then - return 0 - elif [[ ! -f "$TMP_HASH_FILE" || ! -f "$TMP_TREE_FILE" ]] ; then - if (whiptail $BG_COLOR_ERROR --title 'ERROR: Missing File!' \ - --yesno "One of the files containing integrity information for /boot is missing!\n\nIf you are setting up heads for the first time or upgrading from an\nolder version, select Yes to create the missing files.\n\nOtherwise this could indicate a compromise and you should select No to\nreturn to the main menu.\n\nWould you like to create the missing files now?" 0 80) then - if update_checksums ; then - BG_COLOR_MAIN_MENU="" - return 0; - else - whiptail $BG_COLOR_ERROR --title 'ERROR' \ - --msgbox "Failed to update checksums / sign default config" 0 80 - fi - fi - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR - return 1 - else - CHANGED_FILES=$(grep -v 'OK$' /tmp/hash_output | cut -f1 -d ':' | tee -a /tmp/hash_output_mismatches) - CHANGED_FILES_COUNT=$(wc -l /tmp/hash_output_mismatches | cut -f1 -d ' ') - - # if files changed before package manager started, show stern warning - if [ -f "$TMP_PACKAGE_TRIGGER_PRE" ]; then - PRE_CHANGED_FILES=$(grep '^CHANGED_FILES' $TMP_PACKAGE_TRIGGER_POST | cut -f 2 -d '=' | tr -d '"') - TEXT="The following files failed the verification process BEFORE package updates ran:\n${PRE_CHANGED_FILES}\n\nCompare against the files $CONFIG_BRAND_NAME has detected have changed:\n${CHANGED_FILES}\n\nThis could indicate a compromise!\n\nWould you like to update your checksums anyway?" - - # if files changed after package manager started, probably caused by package manager - elif [ -f "$TMP_PACKAGE_TRIGGER_POST" ]; then - LAST_PACKAGE_LIST=$(grep -E "^(Install|Remove|Upgrade|Reinstall):" $TMP_PACKAGE_TRIGGER_POST) - UPDATE_INITRAMFS_PACKAGE=$(grep '^UPDATE_INITRAMFS_PACKAGE' $TMP_PACKAGE_TRIGGER_POST | cut -f 2 -d '=' | tr -d '"') - - if [ "$UPDATE_INITRAMFS_PACKAGE" != "" ]; then - TEXT="The following files failed the verification process AFTER package updates ran:\n${CHANGED_FILES}\n\nThis is likely due to package triggers in$UPDATE_INITRAMFS_PACKAGE.\n\nYou will need to update your checksums for all files in /boot.\n\nWould you like to update your checksums now?" - else - TEXT="The following files failed the verification process AFTER package updates ran:\n${CHANGED_FILES}\n\nThis might be due to the following package updates:\n$LAST_PACKAGE_LIST.\n\nYou will need to update your checksums for all files in /boot.\n\nWould you like to update your checksums now?" - fi - - else - if [ $CHANGED_FILES_COUNT -gt 10 ]; then - # drop to console to show full file list - whiptail $ERROR_BG_COLOR --title 'ERROR: Boot Hash Mismatch' \ - --msgbox "${CHANGED_FILES_COUNT} files failed the verification process!\\n\nThis could indicate a compromise!\n\nHit OK to review the list of files.\n\nType \"q\" to exit the list and return." 0 80 - - echo "Type \"q\" to exit the list and return." >> /tmp/hash_output_mismatches - less /tmp/hash_output_mismatches - #move outdated hash mismatch list - mv /tmp/hash_output_mismatches /tmp/hash_output_mismatch_old - TEXT="Would you like to update your checksums now?" - else - TEXT="The following files failed the verification process:\n\n${CHANGED_FILES}\n\nThis could indicate a compromise!\n\nWould you like to update your checksums now?" - fi - fi - - if (whiptail $BG_COLOR_ERROR --title 'ERROR: Boot Hash Mismatch' --yesno "$TEXT" 0 80) then - if update_checksums ; then - BG_COLOR_MAIN_MENU="" - return 0; - else - whiptail $BG_COLOR_ERROR --title 'ERROR' \ - --msgbox "Failed to update checksums / sign default config" 0 80 - fi - fi - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR - return 1 - fi +verify_global_hashes() { + TRACE_FUNC + # Check the hashes of all the files, ignoring signatures for now + check_config /boot force + TMP_HASH_FILE="/tmp/kexec/kexec_hashes.txt" + TMP_TREE_FILE="/tmp/kexec/kexec_tree.txt" + TMP_PACKAGE_TRIGGER_PRE="/tmp/kexec/kexec_package_trigger_pre.txt" + TMP_PACKAGE_TRIGGER_POST="/tmp/kexec/kexec_package_trigger_post.txt" + + if verify_checksums /boot; then + return 0 + elif [[ ! -f "$TMP_HASH_FILE" || ! -f "$TMP_TREE_FILE" ]]; then + if (whiptail_error --title 'ERROR: Missing File!' \ + --yesno "One of the files containing integrity information for /boot is missing!\n\nIf you are setting up heads for the first time or upgrading from an\nolder version, select Yes to create the missing files.\n\nOtherwise this could indicate a compromise and you should select No to\nreturn to the main menu.\n\nWould you like to create the missing files now?" 0 80); then + if update_checksums; then + BG_COLOR_MAIN_MENU="normal" + return 0 + else + whiptail_error --title 'ERROR' \ + --msgbox "Failed to update checksums / sign default config" 0 80 + fi + fi + BG_COLOR_MAIN_MENU="error" + return 1 + else + CHANGED_FILES=$(grep -v 'OK$' /tmp/hash_output | cut -f1 -d ':' | tee -a /tmp/hash_output_mismatches) + CHANGED_FILES_COUNT=$(wc -l /tmp/hash_output_mismatches | cut -f1 -d ' ') + + # if files changed before package manager started, show stern warning + if [ -f "$TMP_PACKAGE_TRIGGER_PRE" ]; then + PRE_CHANGED_FILES=$(grep '^CHANGED_FILES' $TMP_PACKAGE_TRIGGER_POST | cut -f 2 -d '=' | tr -d '"') + TEXT="The following files failed the verification process BEFORE package updates ran:\n${PRE_CHANGED_FILES}\n\nCompare against the files $CONFIG_BRAND_NAME has detected have changed:\n${CHANGED_FILES}\n\nThis could indicate a compromise!\n\nWould you like to update your checksums anyway?" + + # if files changed after package manager started, probably caused by package manager + elif [ -f "$TMP_PACKAGE_TRIGGER_POST" ]; then + LAST_PACKAGE_LIST=$(grep -E "^(Install|Remove|Upgrade|Reinstall):" $TMP_PACKAGE_TRIGGER_POST) + UPDATE_INITRAMFS_PACKAGE=$(grep '^UPDATE_INITRAMFS_PACKAGE' $TMP_PACKAGE_TRIGGER_POST | cut -f 2 -d '=' | tr -d '"') + + if [ "$UPDATE_INITRAMFS_PACKAGE" != "" ]; then + TEXT="The following files failed the verification process AFTER package updates ran:\n${CHANGED_FILES}\n\nThis is likely due to package triggers in$UPDATE_INITRAMFS_PACKAGE.\n\nYou will need to update your checksums for all files in /boot.\n\nWould you like to update your checksums now?" + else + TEXT="The following files failed the verification process AFTER package updates ran:\n${CHANGED_FILES}\n\nThis might be due to the following package updates:\n$LAST_PACKAGE_LIST.\n\nYou will need to update your checksums for all files in /boot.\n\nWould you like to update your checksums now?" + fi + + else + if [ $CHANGED_FILES_COUNT -gt 10 ]; then + # drop to console to show full file list + whiptail_error --title 'ERROR: Boot Hash Mismatch' \ + --msgbox "${CHANGED_FILES_COUNT} files failed the verification process!\\n\nThis could indicate a compromise!\n\nHit OK to review the list of files.\n\nType \"q\" to exit the list and return." 0 80 + + echo "Type \"q\" to exit the list and return." >>/tmp/hash_output_mismatches + less /tmp/hash_output_mismatches + #move outdated hash mismatch list + mv /tmp/hash_output_mismatches /tmp/hash_output_mismatch_old + TEXT="Would you like to update your checksums now?" + else + TEXT="The following files failed the verification process:\n\n${CHANGED_FILES}\n\nThis could indicate a compromise!\n\nWould you like to update your checksums now?" + fi + fi + + if (whiptail_error --title 'ERROR: Boot Hash Mismatch' --yesno "$TEXT" 0 80); then + if update_checksums; then + BG_COLOR_MAIN_MENU="normal" + return 0 + else + whiptail_error --title 'ERROR' \ + --msgbox "Failed to update checksums / sign default config" 0 80 + fi + fi + BG_COLOR_MAIN_MENU="error" + return 1 + fi } -prompt_update_checksums() -{ - TRACE "Under /bin/gui-init:prompt_update_checksums" - if (whiptail $BG_COLOR_WARNING --title 'Update Checksums and sign all files in /boot' \ - --yesno "You have chosen to update the checksums and sign all of the files in /boot.\n\nThis means that you trust that these files have not been tampered with.\n\nYou will need your GPG key available, and this change will modify your disk.\n\nDo you want to continue?" 0 80) then - if ! update_checksums ; then - whiptail $BG_COLOR_ERROR --title 'ERROR' \ - --msgbox "Failed to update checksums / sign default config" 0 80 - fi - fi +prompt_update_checksums() { + TRACE_FUNC + if (whiptail_warning --title 'Update Checksums and sign all files in /boot' \ + --yesno "You have chosen to update the checksums and sign all of the files in /boot.\n\nThis means that you trust that these files have not been tampered with.\n\nYou will need your GPG key available, and this change will modify your disk.\n\nDo you want to continue?" 0 80); then + if ! update_checksums; then + whiptail_error --title 'ERROR' \ + --msgbox "Failed to update checksums / sign default config" 0 80 + fi + fi } -generate_totp_hotp() -{ - TRACE "Under /bin/gui-init:generate_totp_hotp" - tpm_owner_password="$1" # May be empty, will prompt if needed and empty - if [ "$CONFIG_TPM" != "y" ] && [ -x /bin/hotp_verification ]; then - echo "Generating new HOTP secret" - /bin/seal-hotpkey - elif echo -e "Generating new TOTP secret...\n\n" && /bin/seal-totp "$BOARD_NAME" "$tpm_owner_password"; then - echo - if [ -x /bin/hotp_verification ]; then - if [ "$CONFIG_TOTP_SKIP_QRCODE" != y ]; then - echo "Once you have scanned the QR code, hit Enter to configure your HOTP USB Security Dongle (e.g. Librem Key or Nitrokey)" - read - fi - /bin/seal-hotpkey - else - if [ "$CONFIG_TOTP_SKIP_QRCODE" != y ]; then - echo "Once you have scanned the QR code, hit Enter to continue" - read - fi - fi - # clear screen - printf "\033c" - else - warn "Unsealing TOTP/HOTP secret from previous sealed measurements failed" - warn 'Try "Generate new HOTP/TOTP secret" option if you updated firmware content' - fi +generate_totp_hotp() { + TRACE_FUNC + tpm_owner_password="$1" # May be empty, will prompt if needed and empty + if [ "$CONFIG_TPM" != "y" ] && [ -x /bin/hotp_verification ]; then + echo "Generating new HOTP secret" + /bin/seal-hotpkey + elif echo -e "Generating new TOTP secret...\n\n" && /bin/seal-totp "$BOARD_NAME" "$tpm_owner_password"; then + echo + if [ -x /bin/hotp_verification ]; then + if [ "$CONFIG_TOTP_SKIP_QRCODE" != y ]; then + echo "Once you have scanned the QR code, hit Enter to configure your HOTP USB Security dongle (e.g. Librem Key or Nitrokey)" + read + fi + /bin/seal-hotpkey + else + if [ "$CONFIG_TOTP_SKIP_QRCODE" != y ]; then + echo "Once you have scanned the QR code, hit Enter to continue" + read + fi + fi + # clear screen + printf "\033c" + else + warn "Unsealing TOTP/HOTP secret from previous sealed measurements failed" + warn 'Try "Generate new HOTP/TOTP secret" option if you updated firmware content' + fi } -update_totp() -{ - TRACE "Under /bin/gui-init:update_totp" - # update the TOTP code - date=`date "+%Y-%m-%d %H:%M:%S %Z"` - tries=0 - if [ "$CONFIG_TPM" != "y" ]; then - TOTP="NO TPM" - else - TOTP=`unseal-totp` - # On platforms using CONFIG_BOOT_EXTRA_TTYS multiple processes may try to - # access TPM at the same time, failing with EBUSY. The order of execution - # is unpredictable, so the error may appear on main console, secondary one, - # or neither of them if the calls are sufficiently staggered. Try up to - # three times (including previous one) with small delays in case of error, - # instead of immediately scaring users with "you've been pwned" message. - while [ $? -ne 0 ] && [ $tries -lt 2 ]; do - sleep 0.5 - ((tries++)) - TOTP=`unseal-totp` - done - if [ $? -ne 0 ]; then - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR - if [ "$skip_to_menu" = "true" ]; then - return 1 # Already asked to skip to menu from a prior error - fi - - DEBUG "CONFIG_TPM: $CONFIG_TPM" - DEBUG "CONFIG_TPM2_TOOLS: $CONFIG_TPM2_TOOLS" - DEBUG "Show PCRs" - DEBUG "$(pcrs)" - - whiptail $BG_COLOR_ERROR --title "ERROR: TOTP Generation Failed!" \ - --menu " ERROR: $CONFIG_BRAND_NAME couldn't generate the TOTP code.\n +update_totp() { + TRACE_FUNC + # update the TOTP code + date=$(date "+%Y-%m-%d %H:%M:%S %Z") + tries=0 + if [ "$CONFIG_TPM" != "y" ]; then + TOTP="NO TPM" + else + TOTP=$(unseal-totp) + # On platforms using CONFIG_BOOT_EXTRA_TTYS multiple processes may try to + # access TPM at the same time, failing with EBUSY. The order of execution + # is unpredictable, so the error may appear on main console, secondary one, + # or neither of them if the calls are sufficiently staggered. Try up to + # three times (including previous one) with small delays in case of error, + # instead of immediately scaring users with "you've been pwned" message. + while [ $? -ne 0 ] && [ $tries -lt 2 ]; do + sleep 0.5 + ((tries++)) + TOTP=$(unseal-totp) + done + if [ $? -ne 0 ]; then + BG_COLOR_MAIN_MENU="error" + if [ "$skip_to_menu" = "true" ]; then + return 1 # Already asked to skip to menu from a prior error + fi + + DEBUG "CONFIG_TPM: $CONFIG_TPM" + DEBUG "CONFIG_TPM2_TOOLS: $CONFIG_TPM2_TOOLS" + DEBUG "Show PCRs" + DEBUG "$(pcrs)" + + whiptail_error --title "ERROR: TOTP Generation Failed!" \ + --menu " ERROR: $CONFIG_BRAND_NAME couldn't generate the TOTP code.\n If you have just completed a Factory Reset, or just reflashed your BIOS, you should generate a new HOTP/TOTP secret.\n If this is the first time the system has booted, you should reset the TPM and set your own password.\n If you have not just reflashed your BIOS, THIS COULD INDICATE TAMPERING!\n How would you like to proceed?" 0 80 4 \ - 'g' ' Generate new HOTP/TOTP secret' \ - 'i' ' Ignore error and continue to main menu' \ - 'p' ' Reset the TPM' \ - 'x' ' Exit to recovery shell' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - g ) - if (whiptail $BG_COLOR_WARNING --title 'Generate new TOTP/HOTP secret' \ - --yesno "This will erase your old secret and replace it with a new one!\n\nDo you want to proceed?" 0 80) then - generate_totp_hotp && update_totp && BG_COLOR_MAIN_MENU="" && reseal_tpm_disk_decryption_key - fi - ;; - i ) - skip_to_menu="true" - return 1 - ;; - p ) - reset_tpm && update_totp && BG_COLOR_MAIN_MENU="" && reseal_tpm_disk_decryption_key - ;; - x ) - recovery "User requested recovery shell" - ;; - esac - fi - fi + 'g' ' Generate new HOTP/TOTP secret' \ + 'i' ' Ignore error and continue to main menu' \ + 'p' ' Reset the TPM' \ + 'x' ' Exit to recovery shell' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + g) + if (whiptail_warning --title 'Generate new TOTP/HOTP secret' \ + --yesno "This will erase your old secret and replace it with a new one!\n\nDo you want to proceed?" 0 80); then + generate_totp_hotp && update_totp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key + fi + ;; + i) + skip_to_menu="true" + return 1 + ;; + p) + reset_tpm && update_totp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key + ;; + x) + recovery "User requested recovery shell" + ;; + esac + fi + fi } -update_hotp() -{ - TRACE "Under /bin/gui-init:update_hotp" - if [ -x /bin/hotp_verification ]; then - HOTP=`unseal-hotp` - if ! hotp_verification info ; then - if [ "$skip_to_menu" = "true" ]; then - return 1 # Already asked to skip to menu from a prior error - fi - if ! whiptail $BG_COLOR_WARNING \ - --title "WARNING: Please Insert Your $HOTPKEY_BRANDING" \ - --yes-button "Retry" --no-button "Skip" \ - --yesno "Your $HOTPKEY_BRANDING was not detected.\n\nPlease insert your $HOTPKEY_BRANDING" 0 80 ; then - HOTP="Error checking code, Insert $HOTPKEY_BRANDING and retry" - BG_COLOR_MAIN_MENU=$BG_COLOR_WARNING - return - fi - fi - # Don't output HOTP codes to screen, so as to make replay attacks harder - hotp_verification check "$HOTP" - case "$?" in - 0 ) - HOTP="Success" - BG_COLOR_MAIN_MENU="" - ;; - 4|7 ) # 4: code was incorrect, 7: code was not a valid HOTP code at all - HOTP="Invalid code" - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR - ;; - * ) - HOTP="Error checking code, Insert $HOTPKEY_BRANDING and retry" - BG_COLOR_MAIN_MENU=$BG_COLOR_WARNING - ;; - esac - else - HOTP='N/A' - fi - - if [[ "$CONFIG_TPM" = n && "$HOTP" = "Invalid code" ]]; then - whiptail $BG_COLOR_ERROR --title "ERROR: HOTP Validation Failed!" \ - --menu "ERROR: $CONFIG_BRAND_NAME couldn't validate the HOTP code.\n\nIf you just reflashed your BIOS, you should generate a new TOTP/HOTP secret.\n\nIf you have not just reflashed your BIOS, THIS COULD INDICATE TAMPERING!\n\nHow would you like to proceed?" 0 80 4 \ - 'g' ' Generate new TOTP/HOTP secret' \ - 'i' ' Ignore error and continue to main menu' \ - 'x' ' Exit to recovery shell' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - g ) - if (whiptail $BG_COLOR_WARNING --title 'Generate new TOTP/HOTP secret' \ - --yesno "This will erase your old secret and replace it with a new one!\n\nDo you want to proceed?" 0 80) then - generate_totp_hotp && BG_COLOR_MAIN_MENU="" && reseal_tpm_disk_decryption_key - fi - ;; - i ) - return 1 - ;; - x ) - recovery "User requested recovery shell" - ;; - esac - fi +update_hotp() { + TRACE_FUNC + HOTP="Unverified" + if [ -x /bin/hotp_verification ]; then + if ! hotp_verification info; then + if [ "$skip_to_menu" = "true" ]; then + return 1 # Already asked to skip to menu from a prior error + fi + if ! whiptail_warning \ + --title "WARNING: Please Insert Your $HOTPKEY_BRANDING" \ + --yes-button "Retry" --no-button "Skip" \ + --yesno "Your $HOTPKEY_BRANDING was not detected.\n\nPlease insert your $HOTPKEY_BRANDING" 0 80; then + HOTP="Error checking code, Insert $HOTPKEY_BRANDING and retry" + BG_COLOR_MAIN_MENU="warning" + return + fi + fi + HOTP=$(unseal-hotp) + # Don't output HOTP codes to screen, so as to make replay attacks harder + hotp_verification check "$HOTP" + case "$?" in + 0) + HOTP="Success" + BG_COLOR_MAIN_MENU="normal" + ;; + 4 | 7) # 4: code was incorrect, 7: code was not a valid HOTP code at all + HOTP="Invalid code" + BG_COLOR_MAIN_MENU="error" + ;; + *) + HOTP="Error checking code, Insert $HOTPKEY_BRANDING and retry" + BG_COLOR_MAIN_MENU="warning" + ;; + esac + else + HOTP='N/A' + fi + + if [[ "$CONFIG_TPM" = n && "$HOTP" = "Invalid code" ]]; then + whiptail_error --title "ERROR: HOTP Validation Failed!" \ + --menu "ERROR: $CONFIG_BRAND_NAME couldn't validate the HOTP code.\n\nIf you just reflashed your BIOS, you should generate a new TOTP/HOTP secret.\n\nIf you have not just reflashed your BIOS, THIS COULD INDICATE TAMPERING!\n\nHow would you like to proceed?" 0 80 4 \ + 'g' ' Generate new TOTP/HOTP secret' \ + 'i' ' Ignore error and continue to main menu' \ + 'x' ' Exit to recovery shell' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + g) + if (whiptail_warning --title 'Generate new TOTP/HOTP secret' \ + --yesno "This will erase your old secret and replace it with a new one!\n\nDo you want to proceed?" 0 80); then + generate_totp_hotp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key + fi + ;; + i) + return 1 + ;; + x) + recovery "User requested recovery shell" + ;; + esac + fi } -clean_boot_check() -{ - TRACE "Under /bin/gui-init:clean_boot_check" - # assume /boot mounted - if ! grep -q /boot /proc/mounts ; then - return - fi - - # check for any kexec files in /boot - kexec_files=`find /boot -name kexec*.txt` - [ ! -z "$kexec_files" ] && return - - #check for GPG key in keyring - GPG_KEY_COUNT=`gpg -k 2>/dev/null | wc -l` - [ $GPG_KEY_COUNT -ne 0 ] && return - - # check for USB security token - if [ -x /bin/hotp_verification ]; then - if ! gpg --card-status > /dev/null ; then - return - fi - fi - - # OS is installed, no kexec files present, no GPG keys in keyring, security token present - # prompt user to run OEM factory reset - oem-factory-reset \ - "Clean Boot Detected - Perform OEM Factory Reset / Re-Ownership?" "$BG_COLOR_WARNING" +clean_boot_check() { + TRACE_FUNC + # assume /boot mounted + if ! grep -q /boot /proc/mounts; then + return + fi + + # check for any kexec files in /boot + kexec_files=$(find /boot -name kexec*.txt) + [ ! -z "$kexec_files" ] && return + + #check for GPG key in keyring + GPG_KEY_COUNT=$(gpg -k 2>/dev/null | wc -l) + [ $GPG_KEY_COUNT -ne 0 ] && return + + # check for USB security token + if [ -x /bin/hotp_verification ]; then + if ! gpg --card-status >/dev/null; then + return + fi + fi + + # OS is installed, no kexec files present, no GPG keys in keyring, security token present + # prompt user to run OEM factory reset + oem-factory-reset \ + "Clean Boot Detected - Perform OEM Factory Reset / Re-Ownership?" } -check_gpg_key() -{ - TRACE "Under /bin/gui-init:check_gpg_key" - GPG_KEY_COUNT=`gpg -k 2>/dev/null | wc -l` - if [ $GPG_KEY_COUNT -eq 0 ]; then - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR - if [ "$skip_to_menu" = "true" ]; then - return 1 # Already asked to skip to menu from a prior error - fi - whiptail $BG_COLOR_ERROR --title "ERROR: GPG keyring empty!" \ - --menu "ERROR: $CONFIG_BRAND_NAME couldn't find any GPG keys in your keyring.\n\nIf this is the first time the system has booted,\nyou should add a public GPG key to the BIOS now.\n\nIf you just reflashed a new BIOS, you'll need to add at least one\npublic key to the keyring.\n\nIf you have not just reflashed your BIOS, THIS COULD INDICATE TAMPERING!\n\nHow would you like to proceed?" 0 80 4 \ - 'g' ' Add a GPG key to the running BIOS' \ - 'F' ' OEM Factory Reset / Re-Ownership' \ - 'i' ' Ignore error and continue to main menu' \ - 'x' ' Exit to recovery shell' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - g ) - gpg-gui.sh && BG_COLOR_MAIN_MENU="" - ;; - i ) - skip_to_menu="true" - return 1 - ;; - F ) - oem-factory-reset - ;; - - x ) - recovery "User requested recovery shell" - ;; - esac - fi +check_gpg_key() { + TRACE_FUNC + GPG_KEY_COUNT=$(gpg -k 2>/dev/null | wc -l) + if [ $GPG_KEY_COUNT -eq 0 ]; then + BG_COLOR_MAIN_MENU="error" + if [ "$skip_to_menu" = "true" ]; then + return 1 # Already asked to skip to menu from a prior error + fi + whiptail_error --title "ERROR: GPG keyring empty!" \ + --menu "ERROR: $CONFIG_BRAND_NAME couldn't find any GPG keys in your keyring.\n\nIf this is the first time the system has booted,\nyou should add a public GPG key to the BIOS now.\n\nIf you just reflashed a new BIOS, you'll need to add at least one\npublic key to the keyring.\n\nIf you have not just reflashed your BIOS, THIS COULD INDICATE TAMPERING!\n\nHow would you like to proceed?" 0 80 4 \ + 'g' ' Add a GPG key to the running BIOS' \ + 'F' ' OEM Factory Reset / Re-Ownership' \ + 'i' ' Ignore error and continue to main menu' \ + 'x' ' Exit to recovery shell' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + g) + gpg-gui.sh && BG_COLOR_MAIN_MENU="normal" + ;; + i) + skip_to_menu="true" + return 1 + ;; + F) + oem-factory-reset + ;; + + x) + recovery "User requested recovery shell" + ;; + esac + fi } -prompt_auto_default_boot() -{ - TRACE "Under /bin/gui-init:prompt_auto_default_boot" - echo -e "\nHOTP verification success\n\n" - if pause_automatic_boot; then - echo -e "\n\nAttempting default boot...\n\n" - attempt_default_boot - fi +prompt_auto_default_boot() { + TRACE_FUNC + echo -e "\nHOTP verification success\n\n" + if pause_automatic_boot; then + echo -e "\n\nAttempting default boot...\n\n" + attempt_default_boot + fi } -show_main_menu() -{ - TRACE "Under /bin/gui-init:show_main_menu" - date=`date "+%Y-%m-%d %H:%M:%S %Z"` - whiptail $BG_COLOR_MAIN_MENU --title "$MAIN_MENU_TITLE" \ - --menu "$date\nTOTP: $TOTP | HOTP: $HOTP" 0 80 10 \ - 'd' ' Default boot' \ - 'r' ' Refresh TOTP/HOTP' \ - 'o' ' Options -->' \ - 's' ' System Info' \ - 'p' ' Power Off' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - d ) - attempt_default_boot - ;; - r ) - update_totp && update_hotp - ;; - o ) - show_options_menu - ;; - s ) - show_system_info - ;; - p ) - poweroff - ;; - esac +show_main_menu() { + TRACE_FUNC + date=$(date "+%Y-%m-%d %H:%M:%S %Z") + whiptail_type $BG_COLOR_MAIN_MENU --title "$MAIN_MENU_TITLE" \ + --menu "$date\nTOTP: $TOTP | HOTP: $HOTP" 0 80 10 \ + 'd' ' Default boot' \ + 'r' ' Refresh TOTP/HOTP' \ + 'o' ' Options -->' \ + 's' ' System Info' \ + 'p' ' Power Off' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + d) + attempt_default_boot + ;; + r) + update_totp && update_hotp + ;; + o) + show_options_menu + ;; + s) + show_system_info + ;; + p) + poweroff + ;; + esac } -show_options_menu() -{ - TRACE "Under /bin/gui-init:show_options_menu" - whiptail $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Options" \ - --menu "" 0 80 10 \ - 'b' ' Boot Options -->' \ - 't' ' TPM/TOTP/HOTP Options -->' \ - 'u' ' Update checksums and sign all files in /boot' \ - 'c' ' Change configuration settings -->' \ - 'f' ' Flash/Update the BIOS -->' \ - 'g' ' GPG Options -->' \ - 'F' ' OEM Factory Reset / Re-Ownership -->' \ - 'C' ' Reencrypt LUKS container -->' \ - 'P' ' Change LUKS Disk Recovery Key passphrase ->' \ - 'R' ' Check/Update file hashes on root disk -->' \ - 'x' ' Exit to recovery shell' \ - 'r' ' <-- Return to main menu' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - b ) - show_boot_options_menu - ;; - t ) - show_tpm_totp_hotp_options_menu - ;; - u ) - prompt_update_checksums - ;; - c ) - config-gui.sh - ;; - f ) - flash-gui.sh - ;; - g ) - gpg-gui.sh - ;; - F ) - oem-factory-reset - ;; - C ) - luks_reencrypt - luks_secrets_cleanup - ;; - P ) - luks_change_passphrase - luks_secrets_cleanup - ;; - R ) - root-hashes-gui.sh - ;; - x ) - recovery "User requested recovery shell" - ;; - r ) - ;; - esac +show_options_menu() { + TRACE_FUNC + whiptail_type $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Options" \ + --menu "" 0 80 10 \ + 'b' ' Boot Options -->' \ + 't' ' TPM/TOTP/HOTP Options -->' \ + 'h' ' Change system time' \ + 'u' ' Update checksums and sign all files in /boot' \ + 'c' ' Change configuration settings -->' \ + 'f' ' Flash/Update the BIOS -->' \ + 'g' ' GPG Options -->' \ + 'F' ' OEM Factory Reset / Re-Ownership -->' \ + 'C' ' Reencrypt LUKS container -->' \ + 'P' ' Change LUKS Disk Recovery Key passphrase ->' \ + 'R' ' Check/Update file hashes on root disk -->' \ + 'x' ' Exit to recovery shell' \ + 'r' ' <-- Return to main menu' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + b) + show_boot_options_menu + ;; + t) + show_tpm_totp_hotp_options_menu + ;; + h) + change-time.sh + ;; + u) + prompt_update_checksums + ;; + c) + config-gui.sh + ;; + f) + flash-gui.sh + ;; + g) + gpg-gui.sh + ;; + F) + oem-factory-reset + ;; + C) + luks_reencrypt + luks_secrets_cleanup + ;; + P) + luks_change_passphrase + luks_secrets_cleanup + ;; + R) + root-hashes-gui.sh + ;; + x) + recovery "User requested recovery shell" + ;; + r) ;; + esac } -show_boot_options_menu() -{ - TRACE "Under /bin/gui-init:show_boot_options_menu" - whiptail $BG_COLOR_MAIN_MENU --title "Boot Options" \ - --menu "Select A Boot Option" 0 80 10 \ - 'm' ' Show OS boot menu' \ - 'u' ' USB boot' \ - 'i' ' Ignore tampering and force a boot (Unsafe!)' \ - 'r' ' <-- Return to main menu' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - m ) - # select a kernel from the menu - select_os_boot_option - ;; - u ) - exec /bin/usb-init - ;; - i ) - force_unsafe_boot - ;; - r ) - ;; - esac +show_boot_options_menu() { + TRACE_FUNC + whiptail_type $BG_COLOR_MAIN_MENU --title "Boot Options" \ + --menu "Select A Boot Option" 0 80 10 \ + 'm' ' Show OS boot menu' \ + 'u' ' USB boot' \ + 'i' ' Ignore tampering and force a boot (Unsafe!)' \ + 'r' ' <-- Return to main menu' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + m) + # select a kernel from the menu + select_os_boot_option + ;; + u) + exec /bin/usb-init + ;; + i) + force_unsafe_boot + ;; + r) ;; + esac } -show_tpm_totp_hotp_options_menu() -{ - TRACE "Under /bin/gui-init:show_tpm_totp_hotp_options_menu" - whiptail $BG_COLOR_MAIN_MENU --title "TPM/TOTP/HOTP Options" \ - --menu "Select An Option" 0 80 10 \ - 'g' ' Generate new TOTP/HOTP secret' \ - 'r' ' Reset the TPM' \ - 't' ' TOTP/HOTP does not match after refresh, troubleshoot' \ - 'm' ' <-- Return to main menu' \ - 2>/tmp/whiptail || recovery "GUI menu failed" - - option=$(cat /tmp/whiptail) - case "$option" in - g ) - generate_totp_hotp && reseal_tpm_disk_decryption_key - ;; - r ) - reset_tpm && reseal_tpm_disk_decryption_key - ;; - t ) - prompt_totp_mismatch - ;; - m ) - ;; - esac +show_tpm_totp_hotp_options_menu() { + TRACE_FUNC + whiptail_type $BG_COLOR_MAIN_MENU --title "TPM/TOTP/HOTP Options" \ + --menu "Select An Option" 0 80 10 \ + 'g' ' Generate new TOTP/HOTP secret' \ + 'r' ' Reset the TPM' \ + 't' ' TOTP/HOTP does not match after refresh, troubleshoot' \ + 'm' ' <-- Return to main menu' \ + 2>/tmp/whiptail || recovery "GUI menu failed" + + option=$(cat /tmp/whiptail) + case "$option" in + g) + generate_totp_hotp && reseal_tpm_disk_decryption_key + ;; + r) + reset_tpm && reseal_tpm_disk_decryption_key + ;; + t) + prompt_totp_mismatch + ;; + m) ;; + esac } -prompt_totp_mismatch() -{ - TRACE "Under /bin/gui-init:prompt_totp_mismatch" - if (whiptail $BG_COLOR_WARNING --title "TOTP/HOTP code mismatched" \ - --yesno "TOTP/HOTP code mismatches could indicate either TPM tampering or clock drift:\n\nTo correct clock drift: 'date -s yyyy-MM-DD hh:mm:ss' in UTC timezone\nand save it to the RTC: 'hwclock -w'\nthen reboot and try again.\n\nWould you like to exit to a recovery console?" 0 80) then - echo "" - echo "To correct clock drift: 'date -s yyyy-MM-DD hh:mm:ss' in UTC timezone" - echo "and save it to the RTC: 'hwclock -w'" - echo "" - echo "Alternatively you could do this automatically with an Ethernet cable connected to a functional network: 'network-init-recovery'" - echo "" - echo "Then reboot and try again" - echo "" - recovery "TOTP/HOTP mismatch" - fi +prompt_totp_mismatch() { + TRACE_FUNC + if (whiptail_warning --title "TOTP/HOTP code mismatched" \ + --yesno "TOTP/HOTP code mismatches could indicate TPM tampering or clock drift.\n\nThe current UTC time is: $(date "+%Y-%m-%d %H:%M:%S")\nIf this is incorrect, set the correct time and check TOTP/HOTP again.\n\nDo you want to change the time?" 0 80); then + change-time.sh + fi } -reset_tpm() -{ - TRACE "Under /bin/gui-init:reset_tpm" - if [ "$CONFIG_TPM" = "y" ]; then - if (whiptail $BG_COLOR_WARNING --title 'Reset the TPM' \ - --yesno "This will clear the TPM and TPM password, replace them with new ones!\n\nDo you want to proceed?" 0 80) then - - if ! prompt_new_owner_password; then - echo "Press Enter to return to the menu..." - read - echo - return 1 - fi - - tpmr reset "$tpm_owner_password" - - # now that the TPM is reset, remove invalid TPM counter files - mount_boot - mount -o rw,remount /boot - warn "Removing rollback and primary handle hash under /boot" - rm -f /boot/kexec_rollback.txt - rm -f /boot/kexec_primhdl_hash.txt - - # create Heads TPM counter before any others - check_tpm_counter /boot/kexec_rollback.txt "" "$tpm_owner_password" \ - || die "Unable to find/create tpm counter" - counter="$TPM_COUNTER" - - increment_tpm_counter $counter \ - || die "Unable to increment tpm counter" - - sha256sum /tmp/counter-$counter > /boot/kexec_rollback.txt \ - || die "Unable to create rollback file" - mount -o ro,remount /boot - - generate_totp_hotp "$tpm_owner_password" - else - echo "Returning to the main menu" - fi - else - whiptail $BG_COLOR_ERROR --title 'ERROR: No TPM Detected' --msgbox "This device does not have a TPM.\n\nPress OK to return to the Main Menu" 0 80 - fi +reset_tpm() { + TRACE_FUNC + if [ "$CONFIG_TPM" = "y" ]; then + if (whiptail_warning --title 'Reset the TPM' \ + --yesno "This will clear the TPM and replace its Owner password with a new one!\n\nDo you want to proceed?" 0 80); then + + if ! prompt_new_owner_password; then + echo "Press Enter to return to the menu..." + read + echo + return 1 + fi + + tpmr reset "$tpm_owner_password" + + # now that the TPM is reset, remove invalid TPM counter files + mount_boot + mount -o rw,remount /boot + #TODO: this is really problematic, we should really remove the primary handle hash + + INFO "Removing rollback and primary handle hash under /boot" + rm -f /boot/kexec_rollback.txt + rm -f /boot/kexec_primhdl_hash.txt + + # create Heads TPM counter before any others + check_tpm_counter /boot/kexec_rollback.txt "" "$tpm_owner_password" || + die "Unable to find/create tpm counter" + counter="$TPM_COUNTER" + + increment_tpm_counter $counter >/dev/null 2>&1 || + die "Unable to increment tpm counter" + + sha256sum /tmp/counter-$counter >/boot/kexec_rollback.txt || + die "Unable to create rollback file" + + # As a countermeasure for existing primary handle hash, we will now force sign /boot without it + if (whiptail --title 'TPM Reset Successfully' \ + --yesno "Would you like to update the checksums and sign all of the files in /boot?\n\nYou will need your GPG key to continue and this will modify your disk.\n\nOtherwise the system will reboot immediately." 0 80); then + if ! update_checksums; then + whiptail_error --title 'ERROR' \ + --msgbox "Failed to update checksums / sign default config" 0 80 + fi + else + die "TPM reset successful, but user chose not to update checksums" + fi + mount -o ro,remount /boot + + generate_totp_hotp "$tpm_owner_password" + else + echo "Returning to the main menu" + fi + else + whiptail_error --title 'ERROR: No TPM Detected' --msgbox "This device does not have a TPM.\n\nPress OK to return to the Main Menu" 0 80 + fi } -select_os_boot_option() -{ - TRACE "Under /bin/gui-init:select_os_boot_option" - mount_boot - if verify_global_hashes ; then - kexec-select-boot -m -b /boot -c "grub.cfg" -g - fi +select_os_boot_option() { + TRACE_FUNC + mount_boot + if verify_global_hashes; then + kexec-select-boot -m -b /boot -c "grub.cfg" -g + fi } -attempt_default_boot() -{ - TRACE "Under /bin/gui-init:attempt_default_boot" - mount_boot - - if ! verify_global_hashes; then - return - fi - DEFAULT_FILE=`find /boot/kexec_default.*.txt 2>/dev/null | head -1` - if [ -r "$DEFAULT_FILE" ]; then - kexec-select-boot -b /boot -c "grub.cfg" -g \ - || recovery "Failed default boot" - elif (whiptail $BG_COLOR_WARNING --title 'No Default Boot Option Configured' \ - --yesno "There is no default boot option configured yet.\nWould you like to load a menu of boot options?\nOtherwise you will return to the main menu." 0 80) then - kexec-select-boot -m -b /boot -c "grub.cfg" -g - fi +attempt_default_boot() { + TRACE_FUNC + mount_boot + + if ! verify_global_hashes; then + return + fi + DEFAULT_FILE=$(find /boot/kexec_default.*.txt 2>/dev/null | head -1) + if [ -r "$DEFAULT_FILE" ]; then + kexec-select-boot -b /boot -c "grub.cfg" -g || + recovery "Failed default boot" + elif (whiptail_warning --title 'No Default Boot Option Configured' \ + --yesno "There is no default boot option configured yet.\nWould you like to load a menu of boot options?\nOtherwise you will return to the main menu." 0 80); then + kexec-select-boot -m -b /boot -c "grub.cfg" -g + fi } -force_unsafe_boot() -{ - TRACE "Under /bin/gui-init:force_unsafe_boot" - if [ "$CONFIG_RESTRICTED_BOOT" = y ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: Restricted Boot Enabled' --msgbox "Restricted Boot is Enabled, forced boot not allowed.\n\nPress OK to return to the Main Menu" 0 80 - return - fi - # Run the menu selection in "force" mode, bypassing hash checks - if (whiptail $BG_COLOR_WARNING --title 'Unsafe Forced Boot Selected!' \ - --yesno "WARNING: You have chosen to skip all tamper checks and boot anyway.\n\nThis is an unsafe option!\n\nDo you want to proceed?" 0 80) then - mount_boot && kexec-select-boot -m -b /boot -c "grub.cfg" -g -f - fi +force_unsafe_boot() { + TRACE_FUNC + if [ "$CONFIG_RESTRICTED_BOOT" = y ]; then + whiptail_error --title 'ERROR: Restricted Boot Enabled' --msgbox "Restricted Boot is Enabled, forced boot not allowed.\n\nPress OK to return to the Main Menu" 0 80 + return + fi + # Run the menu selection in "force" mode, bypassing hash checks + if (whiptail_warning --title 'Unsafe Forced Boot Selected!' \ + --yesno "WARNING: You have chosen to skip all tamper checks and boot anyway.\n\nThis is an unsafe option!\n\nDo you want to proceed?" 0 80); then + mount_boot && kexec-select-boot -m -b /boot -c "grub.cfg" -g -f + fi } # gui-init start -TRACE "Under /bin/gui-init, start" +TRACE_FUNC # Use stored HOTP key branding if [ -r /boot/kexec_hotp_key ]; then HOTPKEY_BRANDING="$(cat /boot/kexec_hotp_key)" else - HOTPKEY_BRANDING="HOTP USB Security Dongle" + HOTPKEY_BRANDING="HOTP USB Security dongle" fi if [ -x /bin/hotp_verification ]; then - enable_usb + enable_usb fi -if detect_boot_device ; then - # /boot device with installed OS found - clean_boot_check +if detect_boot_device; then + # /boot device with installed OS found + clean_boot_check else - # can't determine /boot device or no OS installed, - # so fall back to interactive selection - mount_boot + # can't determine /boot device or no OS installed, + # so fall back to interactive selection + mount_boot fi # detect whether any GPG keys exist in the keyring, if not, initialize that first @@ -669,13 +658,13 @@ update_totp update_hotp if [ "$HOTP" = "Success" -a -n "$CONFIG_AUTO_BOOT_TIMEOUT" ]; then - prompt_auto_default_boot + prompt_auto_default_boot fi while true; do - TRACE "Under gui-init:while true loop" - skip_to_menu="false" - show_main_menu + TRACE_FUNC + skip_to_menu="false" + show_main_menu done recovery "Something failed during boot" diff --git a/initrd/bin/gui-init-basic b/initrd/bin/gui-init-basic index 95243e89c..033e561af 100755 --- a/initrd/bin/gui-init-basic +++ b/initrd/bin/gui-init-basic @@ -3,7 +3,7 @@ BOARD_NAME=${CONFIG_BOARD_NAME:-${CONFIG_BOARD}} MAIN_MENU_TITLE="${BOARD_NAME} | $CONFIG_BRAND_NAME Basic Boot Menu" -export BG_COLOR_MAIN_MENU="" +export BG_COLOR_MAIN_MENU="normal" . /etc/functions . /etc/gui_functions @@ -17,7 +17,7 @@ skip_to_menu="false" mount_boot() { - TRACE "Under /bin/gui-init:mount_boot" + TRACE_FUNC # Mount local disk if it is not already mounted while ! grep -q /boot /proc/mounts ; do # try to mount if CONFIG_BOOT_DEV exists @@ -27,8 +27,8 @@ mount_boot() fi # CONFIG_BOOT_DEV doesn't exist or couldn't be mounted, so give user options - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR - whiptail $BG_COLOR_ERROR --title "ERROR: No Bootable OS Found!" \ + BG_COLOR_MAIN_MENU="error" + whiptail_error --title "ERROR: No Bootable OS Found!" \ --menu " No bootable OS was found on the default boot device $CONFIG_BOOT_DEV. How would you like to proceed?" 0 80 4 \ 'b' ' Select a new boot device' \ @@ -44,7 +44,7 @@ mount_boot() if [ $? -eq 0 ]; then # update CONFIG_BOOT_DEV . /tmp/config - BG_COLOR_MAIN_MENU="" + BG_COLOR_MAIN_MENU="normal" fi ;; u ) @@ -63,7 +63,7 @@ mount_boot() prompt_auto_default_boot() { - TRACE "Under /bin/gui-init:prompt_auto_default_boot" + TRACE_FUNC echo -e "\n\n" if pause_automatic_boot; then echo -e "\n\nAttempting default boot...\n\n" @@ -73,9 +73,9 @@ prompt_auto_default_boot() show_main_menu() { - TRACE "Under /bin/gui-init:show_main_menu" + TRACE_FUNC date=`date "+%Y-%m-%d %H:%M:%S %Z"` - whiptail $BG_COLOR_MAIN_MENU --title "$MAIN_MENU_TITLE" \ + whiptail_type $BG_COLOR_MAIN_MENU --title "$MAIN_MENU_TITLE" \ --menu "$date" 0 80 10 \ 'd' ' Default boot' \ 'o' ' Options -->' \ @@ -102,8 +102,8 @@ show_main_menu() show_options_menu() { - TRACE "Under /bin/gui-init:show_options_menu" - whiptail $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Basic Options" \ + TRACE_FUNC + whiptail_type $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Basic Options" \ --menu "" 0 80 10 \ 'b' ' Boot Options -->' \ 'c' ' Change configuration settings -->' \ @@ -133,8 +133,8 @@ show_options_menu() show_boot_options_menu() { - TRACE "Under /bin/gui-init:show_boot_options_menu" - whiptail $BG_COLOR_MAIN_MENU --title "Boot Options" \ + TRACE_FUNC + whiptail_type $BG_COLOR_MAIN_MENU --title "Boot Options" \ --menu "Select A Boot Option" 0 80 10 \ 'm' ' Show OS boot menu' \ 'u' ' USB boot' \ @@ -157,14 +157,14 @@ show_boot_options_menu() select_os_boot_option() { - TRACE "Under /bin/gui-init:select_os_boot_option" + TRACE_FUNC mount_boot kexec-select-boot -m -b /boot -c "grub.cfg" -g -i } attempt_default_boot() { - TRACE "Under /bin/gui-init:attempt_default_boot" + TRACE_FUNC mount_boot DEFAULT_FILE=`find /boot/kexec_default.*.txt 2>/dev/null | head -1` @@ -176,14 +176,14 @@ attempt_default_boot() elif [ -r "$DEFAULT_FILE" ]; then kexec-select-boot -b /boot -c "grub.cfg" -g -i -s \ || recovery "Failed default boot" - elif (whiptail $BG_COLOR_WARNING --title 'No Default Boot Option Configured' \ + elif (whiptail_warning --title 'No Default Boot Option Configured' \ --yesno "There is no default boot option configured yet.\nWould you like to load a menu of boot options?\nOtherwise you will return to the main menu." 0 80) then kexec-select-boot -m -b /boot -c "grub.cfg" -g -i fi } # gui-init-basic start -TRACE "Under /bin/gui-init, start" +TRACE_FUNC # USB automatic boot (if configured) occurs before mounting /boot, this should # work even if no OS is installed @@ -204,7 +204,7 @@ if [ "$skip_to_menu" != "true" -a -n "$CONFIG_AUTO_BOOT_TIMEOUT" ]; then fi while true; do - TRACE "Under gui-init:while true loop" + TRACE_FUNC skip_to_menu="false" show_main_menu done diff --git a/initrd/bin/inject_firmware.sh b/initrd/bin/inject_firmware.sh index 0de9e33c1..f9e6556e6 100755 --- a/initrd/bin/inject_firmware.sh +++ b/initrd/bin/inject_firmware.sh @@ -96,7 +96,7 @@ chmod a+x "$INITRD_ROOT/init" # Linux ignores zeros between archive segments, so any extra padding is not # harmful. FW_INITRD="/tmp/inject_firmware_initrd.cpio.gz" -dd if="$ORIG_INITRD" of="$FW_INITRD" bs=512 conv=sync status=none +dd if="$ORIG_INITRD" of="$FW_INITRD" bs=512 conv=sync status=none > /dev/null 2>&1 # Pack up the new contents and append to the initrd. Don't spend time # compressing this. (cd "$INITRD_ROOT"; find . | cpio -o -H newc) >>"$FW_INITRD" diff --git a/initrd/bin/kexec-boot b/initrd/bin/kexec-boot index 3609c2d8d..fa37ebf99 100755 --- a/initrd/bin/kexec-boot +++ b/initrd/bin/kexec-boot @@ -4,7 +4,7 @@ set -e -o pipefail . /tmp/config . /etc/functions -TRACE "Under /bin/kexec-boot" +TRACE_FUNC dryrun="n" printfiles="n" @@ -151,13 +151,12 @@ if [ "$dryrun" = "y" ]; then exit 0; fi echo "Loading the new kernel:" echo "$kexeccmd" -eval "$kexeccmd" \ +# DO_WITH_DEBUG captures the debug output from stderr to the log, we don't need +# it on the console as well +DO_WITH_DEBUG eval "$kexeccmd" 2>/dev/null \ || die "Failed to load the new kernel" if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - #Repeat kexec command that will be executed since in debug - DEBUG "kexeccmd= $kexeccmd" - #Ask user if they want to continue booting without echoing back the input (-s) read -s -n 1 -p "[DEBUG] Continue booting? [Y/n]: " debug_boot_confirm echo @@ -171,7 +170,7 @@ if [ "$CONFIG_TPM" = "y" ]; then tpmr kexec_finalize fi -if [ -x /bin/io386 -a "$CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" = "y" ]; then +if [ -x /bin/io386 -a "$CONFIG_FINALIZE_PLATFORM_LOCKING" = "y" ]; then lock_chip fi diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 877e45092..ff95c1943 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -1,9 +1,9 @@ #!/bin/bash -# Unseal a disk key from TPM and add to a new initramfs +# Unseal a LUKS Disk Unlock Key from TPM and add to a new initramfs set -e -o pipefail . /etc/functions -TRACE "Under /bin/kexec-insert-key" +TRACE_FUNC TMP_KEY_DEVICES="/tmp/kexec/kexec_key_devices.txt" TMP_KEY_LVM="/tmp/kexec/kexec_key_lvm.txt" @@ -28,7 +28,7 @@ if [ -r "$TMP_KEY_LVM" ]; then die "$VOLUME_GROUP: unable to activate volume group" fi -# Measure the LUKS headers before we unseal the disk key +# Measure the LUKS headers before we unseal the LUKS Disk Unlock Key from TPM cat "$TMP_KEY_DEVICES" | cut -d\ -f1 | xargs /bin/qubes-measure-luks || die "LUKS measure failed" @@ -40,17 +40,33 @@ SECRET_CPIO=/tmp/secret/initrd.cpio bootdir=$(dirname "$INITRD") mkdir -p "$INITRD_DIR/etc" -# Attempt to unseal the disk key from the TPM +if [ -e /boot/kexec_lukshdr_hash.txt ] && [ -e /tmp/luksDump.txt ]; then + if ! cmp -s /boot/kexec_lukshdr_hash.txt /tmp/luksDump.txt >/dev/null 2>&1; then + #LUKS header hash part of detached signed hash digest under boot doesn't match qubes-measure-luks tmp file + warn "Encrypted disk keys have changed since the TPM Disk Unlock Key was sealed. If you did not make this change, the disk may be compromised" + exit 1 + else + #LUKS header hash part of detached signed hash digest matches + echo "+++ Encrypted disk keys have not been changed since sealed in TPM Disk Unlock Key" + #TODO: remove "+++" with boot info helper when added, same with "!!!" currently for info. + fi +else + warn "Could not check for tampering of Encrypted disk keys" + warn "Re-seal the TPM Disk Unlock Key by re-selecting your default boot option to enable this check (Options -> Boot Options -> Show OS boot menu)." +fi + +# Attempt to unseal the Disk Unlock Key from the TPM # should we give this some number of tries? unseal_failed="n" if ! kexec-unseal-key "$INITRD_DIR/secret.key"; then unseal_failed="y" echo - echo "!!! Failed to unseal the TPM LUKS disk key" + echo "!!! Failed to unseal the TPM LUKS Disk Unlock Key" fi # Override PCR 4 so that user can't read the key -DEBUG "Extending TPM PCR 4 to prevent further secret unsealing" +TRACE_FUNC +INFO "TPM: Extending PCR[4] to prevent any future secret unsealing" tpmr extend -ix 4 -ic generic || die 'Unable to scramble PCR' @@ -61,12 +77,13 @@ if [ "$unseal_failed" = "y" ]; then -n 1 \ -p "Do you wish to boot and use the LUKS Disk Recovery Key? [Y/n] " \ confirm_boot - + echo + if [ "$confirm_boot" != 'y' \ -a "$confirm_boot" != 'Y' \ -a -n "$confirm_boot" ] \ ; then - die "!!! Aborting boot due to failure to unseal TPM disk key" + die "!!! Aborting boot due to failure to unseal TPM Disk Unlock Key" fi fi @@ -75,7 +92,7 @@ echo '+++ Building initrd' # pad the initramfs (dracut doesn't pad the last gz blob) # without this the kernel init/initramfs.c fails to read # the subsequent uncompressed/compressed cpio -dd if="$INITRD" of="$SECRET_CPIO" bs=512 conv=sync || +dd if="$INITRD" of="$SECRET_CPIO" bs=512 conv=sync > /dev/null 2>&1 || die "Failed to copy initrd to /tmp" if [ "$unseal_failed" = "n" ]; then diff --git a/initrd/bin/kexec-iso-init b/initrd/bin/kexec-iso-init index ad283271a..250e8f1f3 100755 --- a/initrd/bin/kexec-iso-init +++ b/initrd/bin/kexec-iso-init @@ -4,7 +4,7 @@ set -e -o pipefail . /etc/functions . /tmp/config -TRACE "Under /bin/kexec-iso-init" +TRACE_FUNC MOUNTED_ISO_PATH="$1" ISO_PATH="$2" @@ -37,14 +37,15 @@ ADD_FILE=/tmp/kexec/kexec_iso_add.txt if [ -r $ADD_FILE ]; then NEW_ADD=`cat $ADD_FILE` ADD=$(eval "echo \"$NEW_ADD\"") - echo "+++ Overriding standard ISO kernel add arguments: $ADD" fi +echo "+++ Overriding standard ISO kernel arguments with additions: $ADD" + REMOVE_FILE=/tmp/kexec/kexec_iso_remove.txt if [ -r $REMOVE_FILE ]; then NEW_REMOVE=`cat $REMOVE_FILE` REMOVE=$(eval "echo \"$NEW_REMOVE\"") - echo "+++ Overriding standard ISO kernel remove arguments: $REMOVE" fi +echo "+++ Overriding standard ISO kernel arguments with suppressions: $REMOVE" # Call kexec and indicate that hashes have been verified DO_WITH_DEBUG kexec-select-boot -b /boot -d /media -p "$paramsdir" \ diff --git a/initrd/bin/kexec-parse-bls b/initrd/bin/kexec-parse-bls index a2d98faf9..92bc5f6c8 100755 --- a/initrd/bin/kexec-parse-bls +++ b/initrd/bin/kexec-parse-bls @@ -1,7 +1,7 @@ #!/bin/bash set -e -o pipefail . /etc/functions -TRACE "Under /bin/kexec-parse-bls" +TRACE_FUNC bootdir="$1" file="$2" diff --git a/initrd/bin/kexec-parse-boot b/initrd/bin/kexec-parse-boot index 4b0a05672..07e38e3d6 100755 --- a/initrd/bin/kexec-parse-boot +++ b/initrd/bin/kexec-parse-boot @@ -2,7 +2,7 @@ set -e -o pipefail . /etc/functions -TRACE "Under /bin/kexec-parse-boot" +TRACE_FUNC bootdir="$1" file="$2" diff --git a/initrd/bin/kexec-save-default b/initrd/bin/kexec-save-default index 6462ffb34..fda5d01a1 100755 --- a/initrd/bin/kexec-save-default +++ b/initrd/bin/kexec-save-default @@ -4,7 +4,7 @@ set -e -o pipefail . /tmp/config . /etc/functions -TRACE "Under /bin/kexec-save-default" +TRACE_FUNC while getopts "b:d:p:i:" arg; do case $arg in @@ -38,7 +38,7 @@ PRIMHASH_FILE="$paramsdir/kexec_primhdl_hash.txt" KEY_DEVICES="$paramsdir/kexec_key_devices.txt" KEY_LVM="$paramsdir/kexec_key_lvm.txt" -lvm_suggest=$(lvm vgscan | awk -F '"' {'print $1'} | tail -n +2) +lvm_suggest=$(lvm vgscan 2>/dev/null | awk -F '"' {'print $1'} | tail -n +2) num_lvm=$(echo "$lvm_suggest" | wc -l) if [ "$num_lvm" -eq 1 ] && [ -n "$lvm_suggest" ]; then lvm_volume_group="$lvm_suggest" @@ -71,7 +71,7 @@ fi #Reusable function when user wants to define new TPM DUK for lvms/disks prompt_for_existing_encrypted_lvms_or_disks() { - TRACE "Under kexec-save-default:prompt_for_existing_encrypted_lvms_or_disks" + TRACE_FUNC DEBUG "num_lvm: $num_lvm, lvm_suggest: $lvm_suggest, num_devices: $num_devices, devices_suggest: $devices_suggest" # Create an associative array to store the suggested LVMs and their paths @@ -195,7 +195,7 @@ if [ "$CONFIG_TPM" = "y" ] && [ "$CONFIG_TPM_NO_LUKS_DISK_UNLOCK" != "y" ] && [ DEBUG "LUKS TPM Disk Unlock Key was previously set up from $KEY_DEVICES" read \ -n 1 \ - -p "Do you want to reseal a disk key to the TPM [y/N]: " \ + -p "Do you want to reseal a Disk Unlock Key in the TPM [y/N]: " \ change_key_confirm echo @@ -218,16 +218,17 @@ if [ "$CONFIG_TPM" = "y" ] && [ "$CONFIG_TPM_NO_LUKS_DISK_UNLOCK" != "y" ] && [ save_key="y" fi else - DEBUG "No previous LUKS TPM Disk Unlock Key was set up, confirming to add a Disk Encryption Key to the TPM" + DEBUG "No previous LUKS TPM Disk Unlock Key was set up, confirming to add a Disk Unlock Key (DUK) to the TPM" read \ -n 1 \ - -p "Do you wish to add a disk encryption to the TPM [y/N]: " \ + -p "Do you wish to add a disk encryption key to the TPM [y/N]: " \ add_key_confirm + #TODO: still not convinced: disk encryption key? decryption key? everywhere TPM Disk Unlock Key. Confusing even more? echo if [ "$add_key_confirm" = "y" \ -o "$add_key_confirm" = "Y" ]; then - DEBUG "User confirmed desire to add a Disk Encryption Key to the TPM" + DEBUG "User confirmed desire to add a Disk Unlock Key (DUK) to the TPM" save_key="y" fi fi @@ -276,9 +277,14 @@ if [ ! -d $paramsdir ]; then fi if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then - sha256sum /tmp/secret/primary.handle >"$PRIMHASH_FILE" || - die "ERROR: Failed to Hash TPM2 primary key handle!" - DEBUG "TPM2 primary key handle hash saved to $PRIMHASH_FILE" + if [ -f /tmp/secret/primary.handle ]; then + DEBUG "Hashing TPM2 primary key handle..." + sha256sum /tmp/secret/primary.handle > "$PRIMHASH_FILE" || + die "ERROR: Failed to Hash TPM2 primary key handle!" + DEBUG "TPM2 primary key handle hash saved to $PRIMHASH_FILE" + else + die "ERROR: TPM2 primary key handle file does not exist!" + fi fi rm $paramsdir/kexec_default.*.txt 2>/dev/null || true diff --git a/initrd/bin/kexec-save-key b/initrd/bin/kexec-save-key index 6ab0668cb..a6ceb71ba 100755 --- a/initrd/bin/kexec-save-key +++ b/initrd/bin/kexec-save-key @@ -3,7 +3,7 @@ . /etc/functions -TRACE "kexec-save-key: start" +TRACE_FUNC set -e -o pipefail . /etc/functions diff --git a/initrd/bin/kexec-seal-key b/initrd/bin/kexec-seal-key index 1d43f3b84..558c579b5 100755 --- a/initrd/bin/kexec-seal-key +++ b/initrd/bin/kexec-seal-key @@ -1,20 +1,38 @@ #!/bin/bash -# This will generate a disk encryption key and seal / ecncrypt +# This will generate a disk encryption key and seal / encrypt # with the current PCRs and then store it in the TPM NVRAM. # It will then need to be bundled into initrd that is booted. set -e -o pipefail . /etc/functions +find_drk_key_slot() { + local temp_drk_key_slot="" + local keyslot + + for keyslot in "${luks_used_keyslots[@]}"; do + if [ -z "$temp_drk_key_slot" ]; then + DEBUG "Testing LUKS key slot $keyslot against $DISK_RECOVERY_KEY_FILE for Disk Recovery Key slot..." + if DO_WITH_DEBUG cryptsetup open --test-passphrase --key-slot "$keyslot" --key-file "$DISK_RECOVERY_KEY_FILE" "$dev"; then + temp_drk_key_slot="$keyslot" + DEBUG "Disk Recovery key slot is $temp_drk_key_slot" + break + fi + fi + done + + echo "$temp_drk_key_slot" +} + TPM_INDEX=3 TPM_SIZE=312 -KEY_FILE="/tmp/secret/secret.key" +DUK_KEY_FILE="/tmp/secret/secret.key" TPM_SEALED="/tmp/secret/secret.sealed" -RECOVERY_KEY="/tmp/secret/recovery.key" +DISK_RECOVERY_KEY_FILE="/tmp/secret/recovery.key" . /etc/functions . /tmp/config -TRACE "Under kexec-seal-key" +TRACE_FUNC paramsdir=$1 if [ -z "$paramsdir" ]; then @@ -23,11 +41,12 @@ fi KEY_DEVICES="$paramsdir/kexec_key_devices.txt" KEY_LVM="$paramsdir/kexec_key_lvm.txt" +key_devices=$(cat "$KEY_DEVICES" | cut -d\ -f1 | tr '\n' ' ') if [ ! -r "$KEY_DEVICES" ]; then die "No devices defined for disk encryption" else - DEBUG "Devices defined for disk encryption: $(cat "$KEY_DEVICES" | cut -d\ -f1 | tr '\n' ' ')" + DEBUG "Devices defined for disk encryption: $key_devices" fi if [ -r "$KEY_LVM" ]; then @@ -44,92 +63,160 @@ fi DEBUG "$(pcrs)" -# LUKS Key slot 0 is the manual recovery pass phrase -# that they user entered when they installed OS, -# key slot 1 is the one that we've generated. -read -s -p "Enter LUKS Disk Recovery Key/passphrase: " disk_password -echo -n "$disk_password" >"$RECOVERY_KEY" -echo -read -s -p "New LUKS TPM Disk Unlock Key passphrase for booting: " key_password -echo -read -s -p "Repeat LUKS TPM Disk Unlock Key passphrase for booting: " key_password2 -echo +luks_drk_passphrase_valid=0 +for dev in $key_devices ; do + attempts=0 + while [ $attempts -lt 3 ]; do + if [ "$luks_drk_passphrase_valid" == "0" ]; then + # Ask for the passphrase only once + read -s -p "Enter LUKS Disk Recovery Key (DRK) passphrase that can unlock: $key_devices: " disk_recovery_key_passphrase + #Using he provided passphrase as the DRK "keyfile" for unattended operations + echo -n "$disk_recovery_key_passphrase" >"$DISK_RECOVERY_KEY_FILE" + echo + fi -if [ "$key_password" != "$key_password2" ]; then - die "Key passphrases do not match" -fi + DEBUG "Testing $DISK_RECOVERY_KEY_FILE keyfile created from provided passphrase against $dev individual key slots" + if cryptsetup open $dev --test-passphrase --key-file "$DISK_RECOVERY_KEY_FILE" >/dev/null 2>&1; then + echo "++++++ $dev: LUKS device unlocked successfully with the DRK passphrase" + luks_drk_passphrase_valid=1 + break + else + attempts=$((attempts + 1)) + if [ "$attempts" == "3" ] && [ "$luks_drk_passphrase_valid" == "0" ]; then + die "Failed to unlock LUKS device $dev with the provided passphrase. Exiting..." + elif [ "$attempts" != "3" ] && [ "$luks_drk_passphrase_valid" == "1" ]; then + #We failed unlocking with DRK passphrase another LUKS container + die "LUKS device $key_devices cannot all be unlocked with same passphrase. Please make $key_devices devices unlockable with the same passphrase. Exiting" + else + warn "Failed to unlock LUKS device $dev with the provided passphrase. Please try again." + fi + fi + done +done + +attempts=0 +while [ $attempts -lt 3 ]; do + read -s -p "New LUKS TPM Disk Unlock Key (DUK) passphrase for booting: " key_password + echo + read -s -p "Repeat LUKS TPM Disk Unlock Key (DUK) passphrase for booting: " key_password2 + echo + if [ "$key_password" != "$key_password2" ]; then + attempts=$((attempts + 1)) + if [ "$attempts" == "3" ]; then + die "Disk Unlock Key (DUK) passphrases do not match. Exiting..." + else + warn "Disk Unlock Key (DUK) passphrases do not match. Please try again." + fi + else + break + fi +done # Generate key file echo "++++++ Generating new randomized 128 bytes key file that will be sealed/unsealed by LUKS TPM Disk Unlock Key passphrase" dd \ if=/dev/urandom \ - of="$KEY_FILE" \ + of="$DUK_KEY_FILE" \ bs=1 \ count=128 \ 2>/dev/null || die "Unable to generate 128 random bytes" -# Count the number of slots used on each device -for dev in $(cat "$KEY_DEVICES" | cut -d\ -f1); do - DEBUG "Checking number of slots used on $dev LUKS header" - #check if the device is a LUKS device with luks[1,2] - # Get the number of key slots used on the LUKS header. - # LUKS1 Format is : - # Slot 0: ENABLED - # Slot 1: ENABLED - # Slot 2: DISABLED - # Slot 3: DISABLED - #... - # Slot 7: DISABLED - # Luks2 only reports on enabled slots. - # luks2 Format is : - # 0: luks2 - # 1: luks2 - # Meaning that the number of slots used is the number of lines returned by a grep on the LUKS2 above format. - # We need to count the number of ENABLED slots for both LUKS1 and LUKS2 - # create regex pattern for both LUKS1 and LUKS2 - regex="Slot [0-9]*: ENABLED" - regex+="\|" - regex+="[0-9]*: luks2" - slots_used=$(cryptsetup luksDump "$dev" | grep -c "$regex" || die "Unable to get number of slots used on $dev") - - DEBUG "Number of slots used on $dev LUKS header: $slots_used" - # If slot1 is the only one used, warn and die with proper messages - if [ "$slots_used" -eq 1 ]; then - # Check if slot 1 is the only one existing - if [ "$(cryptsetup luksDump "$dev" | grep -c "Slot 1: ENABLED")" -eq 1 ] || [ "$(cryptsetup luksDump "$dev" | grep -c "1: luks2")" -eq 1 ]; then - warn "Slot 1 is the only one existing on $dev LUKS header. Heads cannot use it to store TPM sealed LUKS Disk Unlock Key" - warn "Slot 1 should not be the only slot existing on $dev LUKS header. Slot 0 should be used to store LUKS Disk Recovery Key/passphrase" - die "You can safely fix this before continuing through Heads recovery shell: cryptsetup luksAddKey $dev" - fi +previous_luks_header_version=0 +for dev in $key_devices; do + # Check and store LUKS version of the devices to be used later + luks_version=$(cryptsetup luksDump "$dev" | grep "Version" | cut -d: -f2 | tr -d '[:space:]') + if [ "$luks_version" == "2" ] && [ "$previous_luks_header_version" == "1" ]; then + die "$dev: LUKSv2 device detected while LUKSv1 device was detected previously. Exiting..." + fi + + if [ "$luks_version" == "1" ] && [ "$previous_luks_header_version" == "2" ]; then + die "$dev: LUKSv1 device detected while LUKSv2 device was detected previously. Exiting..." + fi + + if [ "$luks_version" == "2" ]; then + # LUKSv2 last key slot is 31 + duk_keyslot=31 + regex="^\s+([0-9]+):\s*luks2" + sed_command="s/^\s\+\([0-9]\+\):\s*luks2/\1/g" + previous_luks_header_version=2 + DEBUG "$dev: LUKSv2 device detected" + elif [ "$luks_version" == "1" ]; then + # LUKSv1 last key slot is 7 + duk_keyslot=7 + regex="Key Slot ([0-9]+): ENABLED" + sed_command='s/Key Slot \([0-9]\+\): ENABLED/\1/' + previous_luks_header_version=1 + DEBUG "$dev: LUKSv1 device detected" else - DEBUG "Slot 1 is not the only existing slot on $dev LUKS header." - DEBUG "$dev LUKS header's slot 1 will store LUKS Disk Unlock Key that TPM will seal/unseal with LUKS TPM Disk Unlock Key passphrase" + die "$dev: Unsupported LUKS version $luks_version" fi -done -# Remove all the old keys from slot 1 -for dev in $(cat "$KEY_DEVICES" | cut -d\ -f1); do - echo "++++++ $dev: Removing old LUKS TPM Disk Unlock Key in LUKS slot 1" - cryptsetup luksKillSlot \ - --key-file "$RECOVERY_KEY" \ - $dev 1 || - warn "$dev: removal of LUKS TPM Disk Unlock Key in LUKS slot 1 failed: might not exist. Continuing" - - echo "++++++ $dev: Adding LUKS TPM Disk Unlock Key to LUKS slot 1" - cryptsetup luksAddKey \ - --key-file "$RECOVERY_KEY" \ - --key-slot 1 \ - $dev "$KEY_FILE" || - die "$dev: Unable to add LUKS TPM Disk Unlock Key to LUKS slot 1" + # drk_key_slot will be the slot number where the passphrase was tested against as valid. We will keep that slot + drk_key_slot="-1" + + # Get all the key slots that are used on $dev + luks_used_keyslots=($(cryptsetup luksDump "$dev" | grep -E "$regex" | sed "$sed_command")) + DEBUG "$dev LUKS key slots: ${luks_used_keyslots[*]}" + + #Find the key slot that can be unlocked with the provided passphrase + drk_key_slot=$(find_drk_key_slot) + + # If we didn't find the DRK key slot, we exit (this should never happen) + if [ "$drk_key_slot" == "-1" ]; then + die "$dev: Unable to find a key slot that can be unlocked with provided passphrase. Exiting..." + fi + + # If the key slot is not the expected DUK or DRK key slot, we will ask the user to confirm the wipe + for keyslot in "${luks_used_keyslots[@]}"; do + if [ "$keyslot" != "$drk_key_slot" ]; then + #set wipe_desired to no by default + wipe_desired="no" + + if [ "$keyslot" != "$drk_key_slot" ] && [ "$keyslot" == "1" ]; then + wipe_desired="yes" + DEBUG "LUKS key slot $keyslot not DRK. Will wipe this DUK key slot silently" + elif [ "$keyslot" != "$drk_key_slot" ] && [ "$keyslot" != "$duk_keyslot" ]; then + # Heads expects key slot LUKSv1:7 or LUKSv2:31 to be used for TPM DUK setup. + # Ask user to confirm otherwise + warn "LUKS key slot $keyslot is not typical ($duk_keyslot expected) for TPM Disk Unlock Key setup" + read -p "Are you sure you want to wipe it? [y/N] " -n 1 -r + echo + # If user does not confirm, skip this slot + if [[ $REPLY =~ ^[Yy]$ ]]; then + wipe_desired="yes" + fi + elif [ "$keyslot" == "$duk_keyslot" ]; then + # If key slot is the expected DUK keyslot, we wipe it silently + DEBUG "LUKS key slot $keyslot is the expected DUK key slot. Will wipe this DUK key slot silently" + wipe_desired="yes" + fi + + if [ "$wipe_desired" == "yes" ] && [ "$keyslot" != "$drk_key_slot" ]; then + echo "++++++ $dev: Wiping LUKS key slot $keyslot" + DO_WITH_DEBUG cryptsetup luksKillSlot \ + --key-file "$DISK_RECOVERY_KEY_FILE" \ + $dev $keyslot || + warn "$dev: removal of LUKS slot $keyslot failed: Continuing" + fi + fi + done + + + echo "++++++ $dev: Adding LUKS TPM Disk Unlock Key to LUKS key slot $duk_keyslot" + DO_WITH_DEBUG cryptsetup luksAddKey \ + --key-file "$DISK_RECOVERY_KEY_FILE" \ + --new-key-slot $duk_keyslot \ + $dev "$DUK_KEY_FILE" || + die "$dev: Unable to add LUKS TPM Disk Unlock Key to LUKS key slot $duk_keyslot" done # Now that we have setup the new keys, measure the PCRs # We don't care what ends up in PCR 6; we just want # to get the /tmp/luksDump.txt file. We use PCR16 # since it should still be zero -cat "$KEY_DEVICES" | cut -d\ -f1 | xargs /bin/qubes-measure-luks || +echo "$key_devices" | xargs /bin/qubes-measure-luks || die "Unable to measure the LUKS headers" pcrf="/tmp/secret/pcrf.bin" @@ -139,7 +226,7 @@ tpmr pcrread -a 2 "$pcrf" tpmr pcrread -a 3 "$pcrf" # Note that PCR 4 needs to be set with the "normal-boot" path value, read it from event log. tpmr calcfuturepcr 4 >>"$pcrf" -if [ "$CONFIG_USB_KEYBOARD" = "y" -o -r /lib/modules/libata.ko -o -x /bin/hotp_verification ]; then +if [ "$CONFIG_USER_USB_KEYBOARD" = "y" -o -r /lib/modules/libata.ko -o -x /bin/hotp_verification ]; then DEBUG "Sealing LUKS TPM Disk Unlock Key with PCR5 involvement (additional kernel modules are loaded per board config)..." # Here, we take pcr 5 into consideration if modules are expected to be measured+loaded tpmr pcrread -a 5 "$pcrf" @@ -155,13 +242,13 @@ tpmr calcfuturepcr 6 "/tmp/luksDump.txt" >>"$pcrf" tpmr pcrread -a 7 "$pcrf" DO_WITH_DEBUG --mask-position 7 \ - tpmr seal "$KEY_FILE" "$TPM_INDEX" 0,1,2,3,4,5,6,7 "$pcrf" \ + tpmr seal "$DUK_KEY_FILE" "$TPM_INDEX" 0,1,2,3,4,5,6,7 "$pcrf" \ "$TPM_SIZE" "$key_password" || die "Unable to write LUKS TPM Disk Unlock Key to NVRAM" # should be okay if this fails shred -n 10 -z -u "$pcrf" 2>/dev/null || warn "Failed to delete pcrf file - continuing" -shred -n 10 -z -u "$KEY_FILE" 2>/dev/null || +shred -n 10 -z -u "$DUK_KEY_FILE" 2>/dev/null || warn "Failed to delete key file - continuing" mount -o rw,remount $paramsdir || warn "Failed to remount $paramsdir in RW - continuing" diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index edf3abba7..cc1283249 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -3,8 +3,9 @@ set -e -o pipefail . /tmp/config . /etc/functions +. /etc/gui_functions -TRACE "Under /bin/kexec-select-boot" +TRACE_FUNC add="" remove="" @@ -59,33 +60,38 @@ paramsdir="${paramsdir%%/}" PRIMHASH_FILE="$paramsdir/kexec_primhdl_hash.txt" if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then - if [ -r "$PRIMHASH_FILE" ]; then - sha256sum -c "$PRIMHASH_FILE" || + if [ -s "$PRIMHASH_FILE" ]; then + #PRIMHASH_FILE (normally /boot/kexec_primhdl_hash.txt) exists and is not empty + sha256sum -c "$PRIMHASH_FILE" >/dev/null 2>&1 || { echo "FATAL: Hash of TPM2 primary key handle mismatch!" warn "If you have not intentionally regenerated TPM2 primary key," warn "your system may have been compromised" DEBUG "Hash of TPM2 primary key handle mismatched for $PRIMHASH_FILE" + DEBUG "Contents of $PRIMHASH_FILE:" + DEBUG "$(cat $PRIMHASH_FILE)" } else warn "Hash of TPM2 primary key handle does not exist" - warn "Please rebuild the boot hash tree" + warn "Please rebuild the TPM2 primary key handle hash by setting a default OS to boot." + warn "Select Options-> Boot Options -> Show OS Boot Menu -> -> Make default" + #TODO: Simplify/Automatize TPM2 firmware upgrade process. Today: upgrade, reboot, reseal(type TPM Owner Password), resign, boot default_failed="y" DEBUG "Hash of TPM2 primary key handle does not exist under $PRIMHASH_FILE" fi fi verify_global_hashes() { - echo "+++ Checking verified boot hash file " + INFO "+++ Checking verified boot hash file " # Check the hashes of all the files if verify_checksums "$bootdir" "$gui_menu"; then - echo "+++ Verified boot hashes " + INFO "+++ Verified boot hashes " valid_hash='y' valid_global_hash='y' else if [ "$gui_menu" = "y" ]; then CHANGED_FILES=$(grep -v 'OK$' /tmp/hash_output | cut -f1 -d ':') - whiptail $BG_COLOR_ERROR --title 'ERROR: Boot Hash Mismatch' \ + whiptail_error --title 'ERROR: Boot Hash Mismatch' \ --msgbox "The following files failed the verification process:\n${CHANGED_FILES}\nExiting to a recovery shell" 0 80 fi die "$TMP_HASH_FILE: boot hash mismatch" @@ -101,7 +107,7 @@ verify_global_hashes() { else # root-hashes-gui.sh handles the GUI error menu, just die here if [ "$gui_menu" = "y" ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: Root Hash Mismatch' \ + whiptail_error --title 'ERROR: Root Hash Mismatch' \ --msgbox "The root hash check failed!\nExiting to a recovery shell" 0 80 fi die "root hash mismatch, see /tmp/hash_output_mismatches for details" @@ -110,16 +116,18 @@ verify_global_hashes() { } verify_rollback_counter() { + TRACE_FUNC TPM_COUNTER=$(grep counter $TMP_ROLLBACK_FILE | cut -d- -f2) + if [ -z "$TPM_COUNTER" ]; then die "$TMP_ROLLBACK_FILE: TPM counter not found?" fi - read_tpm_counter $TPM_COUNTER || + read_tpm_counter $TPM_COUNTER >/dev/null 2>&1 || die "Failed to read TPM counter" - sha256sum -c $TMP_ROLLBACK_FILE || - die "Invalid TPM counter state" + sha256sum -c $TMP_ROLLBACK_FILE >/dev/null 2>&1 || + die "Invalid TPM counter state. TPM Reset required" valid_rollback="y" } @@ -176,7 +184,7 @@ confirm_menu_option() { if [ "$gui_menu" = "y" ]; then default_text="Make default" [[ "$CONFIG_TPM_NO_LUKS_DISK_UNLOCK" = "y" ]] && default_text="${default_text} and boot" - whiptail $BG_COLOR_WARNING --title "Confirm boot details" \ + whiptail_warning --title "Confirm boot details" \ --menu "Confirm the boot details for $name:\n\n$(echo $kernel | fold -s -w 80) \n\n" 0 80 8 \ -- 'd' "${default_text}" 'y' "Boot one time" \ 2>/tmp/whiptail || die "Aborting boot attempt" @@ -200,7 +208,7 @@ parse_option() { } scan_options() { - echo "+++ Scanning for unsigned boot options" + INFO "+++ Scanning for unsigned boot options" option_file="/tmp/kexec_options.txt" scan_boot_options "$bootdir" "$config" "$option_file" if [ ! -s $option_file ]; then @@ -254,7 +262,7 @@ default_select() { option=$(head -n $default_index $TMP_MENU_FILE | tail -1) if [ "$option" != "$expectedoption" ]; then if [ "$gui_menu" = "y" ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: Boot Entry Has Changed' \ + whiptail_error --title 'ERROR: Boot Entry Has Changed' \ --msgbox "The list of boot entries has changed\n\nPlease set a new default" 0 80 fi warn "Boot entry has changed - please set a new default" @@ -264,7 +272,7 @@ default_select() { if [ "$CONFIG_BASIC" != "y" ]; then # Enforce that default option hashes are valid - echo "+++ Checking verified default boot hash file " + INFO "+++ Checking verified default boot hash file " # Check the hashes of all the files if (cd $bootdir && sha256sum -c "$TMP_DEFAULT_HASH_FILE" >/tmp/hash_output); then echo "+++ Verified default boot hashes " @@ -272,7 +280,7 @@ default_select() { else if [ "$gui_menu" = "y" ]; then CHANGED_FILES=$(grep -v 'OK$' /tmp/hash_output | cut -f1 -d ':') - whiptail $BG_COLOR_ERROR --title 'ERROR: Default Boot Hash Mismatch' \ + whiptail_error --title 'ERROR: Default Boot Hash Mismatch' \ --msgbox "The following files failed the verification process:\n${CHANGED_FILES}\nExiting to a recovery shell" 0 80 fi fi @@ -340,7 +348,7 @@ do_boot() { fi kexec-insert-key $INITRD || - die "!!! Failed to insert disk key into a new initrd" + die "!!! Failed to prepare TPM Disk Unlock Key for boot" kexec-boot -b "$bootdir" -e "$option" \ -a "$add" -r "$remove" -o "/tmp/secret/initrd.cpio" || @@ -381,9 +389,10 @@ while true; do if [ "$CONFIG_TPM" = "y" ]; then if [ ! -r "$TMP_KEY_DEVICES" ]; then # Extend PCR4 as soon as possible - DEBUG "Extending TPM PCR 4 to prevent further secret unsealing" + TRACE_FUNC + INFO "TPM: Extending PCR[4] to prevent further secret unsealing" tpmr extend -ix 4 -ic generic || - die "Failed to extend PCR 4" + die "Failed to extend TPM PCR[4]" fi fi diff --git a/initrd/bin/kexec-sign-config b/initrd/bin/kexec-sign-config index b5d3ac16c..52e6add6d 100755 --- a/initrd/bin/kexec-sign-config +++ b/initrd/bin/kexec-sign-config @@ -4,16 +4,19 @@ set -e -o pipefail . /tmp/config . /etc/functions -TRACE "Under /bin/kexec-sign-config" +TRACE_FUNC rollback="n" update="n" while getopts "p:c:ur" arg; do case $arg in - p) paramsdir="$OPTARG" ;; - c) counter="$OPTARG"; rollback="y" ;; - u) update="y" ;; - r) rollback="y" ;; + p) paramsdir="$OPTARG" ;; + c) + counter="$OPTARG" + rollback="y" + ;; + u) update="y" ;; + r) rollback="y" ;; esac done @@ -27,18 +30,21 @@ assert_signable confirm_gpg_card +# remount /boot as rw +mount -o remount,rw /boot + # update hashes in /boot before signing if [ "$update" = "y" ]; then ( cd /boot - find ./ -type f ! -path './kexec*' -print0 | xargs -0 sha256sum > /boot/kexec_hashes.txt + find ./ -type f ! -path './kexec*' -print0 | xargs -0 sha256sum >/boot/kexec_hashes.txt if [ -e /boot/kexec_default_hashes.txt ]; then DEFAULT_FILES=$(cat /boot/kexec_default_hashes.txt | cut -f3 -d ' ') - echo $DEFAULT_FILES | xargs sha256sum > /boot/kexec_default_hashes.txt + echo $DEFAULT_FILES | xargs sha256sum >/boot/kexec_default_hashes.txt fi #also save the file & directory structure to detect added files - print_tree > /boot/kexec_tree.txt + print_tree >/boot/kexec_tree.txt ) [ $? -eq 0 ] || die "$paramsdir: Failed to update hashes." @@ -52,23 +58,23 @@ if [ "$rollback" = "y" ]; then if [ -n "$counter" ]; then # use existing counter - read_tpm_counter $counter \ - || die "$paramsdir: Unable to read tpm counter '$counter'" + read_tpm_counter $counter >/dev/null 2>&1 || + die "$paramsdir: Unable to read tpm counter '$counter'" else # increment counter - check_tpm_counter $rollback_file \ - || die "$paramsdir: Unable to find/create tpm counter" + check_tpm_counter $rollback_file >/dev/null 2>&1 || + die "$paramsdir: Unable to find/create tpm counter" counter="$TPM_COUNTER" - increment_tpm_counter $counter \ - || die "$paramsdir: Unable to increment tpm counter" + increment_tpm_counter $counter >/dev/null 2>&1 || + die "$paramsdir: Unable to increment tpm counter" fi - sha256sum /tmp/counter-$counter > $rollback_file \ - || die "$paramsdir: Unable to create rollback file" + sha256sum /tmp/counter-$counter >$rollback_file || + die "$paramsdir: Unable to create rollback file" fi -param_files=`find $paramsdir/kexec*.txt` +param_files=$(find $paramsdir/kexec*.txt) if [ -z "$param_files" ]; then die "$paramsdir: No kexec parameter files to sign" fi @@ -77,12 +83,19 @@ for tries in 1 2 3; do if sha256sum $param_files | gpg \ --detach-sign \ -a \ - > $paramsdir/kexec.sig \ - ; then + >$paramsdir/kexec.sig \ + ; then # successful - update the validated params check_config $paramsdir + + # remount /boot as ro + mount -o remount,ro /boot + exit 0 fi done +# remount /boot as ro +mount -o remount,ro /boot + die "$paramsdir: Unable to sign kexec hashes" diff --git a/initrd/bin/kexec-unseal-key b/initrd/bin/kexec-unseal-key index d6566a625..346eda9b8 100755 --- a/initrd/bin/kexec-unseal-key +++ b/initrd/bin/kexec-unseal-key @@ -10,7 +10,7 @@ TPM_SIZE=312 . /etc/functions -TRACE "Under kexec-unseal-key" +TRACE_FUNC mkdir -p /tmp/secret @@ -38,8 +38,7 @@ for tries in 1 2 3; do exit 0 fi - DEBUG $(pcrs) - warn "Unable to unseal disk encryption key" + warn "Unable to unseal LUKS Disk Unlock Key from TPM" done die "Retry count exceeded..." diff --git a/initrd/bin/key-init b/initrd/bin/key-init index 44a9063f6..dcfaf5295 100755 --- a/initrd/bin/key-init +++ b/initrd/bin/key-init @@ -1,19 +1,35 @@ #!/bin/bash set -e -o pipefail . /etc/functions +. /etc/gui_functions -TRACE "Under /bin/key-init" +TRACE_FUNC # Post processing of keys -# Import user's keys -gpg --import /.gnupg/keys/*.key /.gnupg/keys/*.asc 2>/dev/null || true +# Good system clock is required for GPG to work properly. +# if system year is less then 2024, prompt user to set correct time +if [ "$(date +%Y)" -lt 2024 ]; then + if whiptail_warning --title "System Time Incorrect" \ + --yesno "The system time is incorrect. Please set the correct time." \ + 0 80 --yes-button Continue --no-button Skip --clear; then + change-time.sh + fi +fi + +# Import user's keys if they exist +if [ -d /.gnupg/keys ]; then + # This is legacy location for user's keys. cbfs-init takes for granted that keyring and trustdb are in /.gnupg + # oem-factory-reset generates keyring and trustdb which cbfs-init dumps to /.gnupg + # TODO: Remove individual key imports. This is still valid for distro keys only below. + gpg --import /.gnupg/keys/*.key /.gnupg/keys/*.asc 2>/dev/null || warn "Importing user's keys failed" +fi # Import trusted distro keys allowed for ISO signing -gpg --homedir=/etc/distro/ --import /etc/distro/keys/* 2>/dev/null || true +gpg --homedir=/etc/distro/ --import /etc/distro/keys/* 2>/dev/null || warn "Importing distro keys failed" #Set distro keys trust level to ultimate (trust anything that was signed with these keys) -gpg --homedir=/etc/distro/ --list-keys --fingerprint --with-colons|sed -E -n -e 's/^fpr:::::::::([0-9A-F]+):$/\1:6:/p' |gpg --homedir=/etc/distro/ --import-ownertrust 2>/dev/null || true -gpg --homedir=/etc/distro/ --update-trust 2>/dev/null || true +gpg --homedir=/etc/distro/ --list-keys --fingerprint --with-colons|sed -E -n -e 's/^fpr:::::::::([0-9A-F]+):$/\1:6:/p' |gpg --homedir=/etc/distro/ --import-ownertrust 2>/dev/null || warn "Setting distro keys ultimate trust failed" +gpg --homedir=/etc/distro/ --update-trust 2>/dev/null || warn "Updating distro keys trust failed" # Add user's keys to the list of trusted keys for ISO signing -gpg --export | gpg --homedir=/etc/distro/ --import 2>/dev/null || true +gpg --export | gpg --homedir=/etc/distro/ --import 2>/dev/null || warn "Adding user's keys to distro keys failed" diff --git a/initrd/bin/lock_chip b/initrd/bin/lock_chip index 8bf316b71..26c9c1c78 100755 --- a/initrd/bin/lock_chip +++ b/initrd/bin/lock_chip @@ -1,21 +1,25 @@ -#!/bin/sh +#!/bin/bash # For this to work: -# - io386 module needs to be enabled in board config (sandy/ivy/haswell know to work) -# - coreboot config need to enable CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y without enabling CONFIG_INTEL_CHIPSET_LOCKDOWN +# - io386 module needs to be enabled in board config +# - =Skylake: same as above and CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM=y, CONFIG_SPI_FLASH_SMM=y and mode (eg: CONFIG_BOOTMEDIA_LOCK_WHOLE_RO=y) # - Heads is actually doing the CONFIG_INTEL_CHIPSET_LOCKDOWN equivalent here. -# TODO: If more platforms are able to enable CONFIG_INTEL_CHIPSET_LOCKDOWN in the future, have board config export APM_CNT and FIN_CODE and modify this script accordingly -#include ash shell functions (TRACE requires it) -. /etc/ash_functions +. /etc/functions -TRACE "Under /bin/lock_chip" -if [ "$CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" = "y" ]; then +TRACE_FUNC +if [ "$CONFIG_FINALIZE_PLATFORM_LOCKING" = "y" ]; then APM_CNT=0xb2 FIN_CODE=0xcb fi if [ -n "$APM_CNT" -a -n "$FIN_CODE" ]; then - echo "Finalizing chipset" + # PR0 lockdown is enabled by setting a lock bit (FLOCKDN) in the SPI controller, + # which prevents further changes to the SPI controller configuration. The flash + # will become write protected in the range specified in the PR0 register. Once + # the protection is set and locked, it cannot be disabled + # until the next system reset. + echo "Finalizing chipset Write Protection through SMI PR0 lockdown call" io386 -o b -b x $APM_CNT $FIN_CODE else echo "NOT Finalizing chipset" diff --git a/initrd/bin/media-scan b/initrd/bin/media-scan index e22cddec4..eebed2752 100755 --- a/initrd/bin/media-scan +++ b/initrd/bin/media-scan @@ -5,7 +5,7 @@ set -e -o pipefail . /etc/gui_functions . /tmp/config -TRACE "Under /bin/media-scan" +TRACE_FUNC #Booting from external media should be authenticated if supported gpg_auth || die "GPG authentication failed" @@ -47,7 +47,7 @@ get_menu_option() { MENU_OPTIONS="$MENU_OPTIONS a Abort" - whiptail $BG_COLOR_MAIN_MENU --title "Select your ISO boot option" \ + whiptail_type $BG_COLOR_MAIN_MENU --title "Select your ISO boot option" \ --menu "Choose the ISO boot option [1-$n]:" 0 80 8 \ -- $MENU_OPTIONS \ 2>/tmp/whiptail || die "Aborting boot attempt" diff --git a/initrd/bin/mount-usb b/initrd/bin/mount-usb index 22846a247..8acad1357 100755 --- a/initrd/bin/mount-usb +++ b/initrd/bin/mount-usb @@ -1,9 +1,10 @@ #!/bin/bash # Mount a USB device . /etc/functions +. /etc/gui_functions . /etc/luks-functions -TRACE "Under /bin/mount-usb" +TRACE_FUNC function usage() { cat < /tmp/usb_block_devices if [ -z "$(cat /tmp/usb_block_devices)" ]; then if [ -x /bin/whiptail ]; then - whiptail $BG_COLOR --title 'USB Drive Missing' \ + whiptail_warning --title 'USB Drive Missing' \ --msgbox "Insert your USB drive and press Enter to continue." 0 80 else echo "+++ USB Drive Missing! Insert your USB drive and press Enter to continue." @@ -92,7 +93,7 @@ if [ -z "$(cat /tmp/usb_block_devices)" ]; then list_usb_storage > /tmp/usb_block_devices if [ -z "$(cat /tmp/usb_block_devices)" ]; then if [ -x /bin/whiptail ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: USB Drive Missing' \ + whiptail_error --title 'ERROR: USB Drive Missing' \ --msgbox "USB Drive Missing! Aborting mount attempt.\n\nPress Enter to continue." 0 80 else echo "!!! ERROR: USB Drive Missing! Aborting mount. Press Enter to continue." @@ -135,7 +136,7 @@ else done < /tmp/usb_disk_list MENU_OPTIONS="$MENU_OPTIONS a Abort" - whiptail $BG_COLOR --title "Select your USB disk" \ + whiptail --title "Select your USB disk" \ --menu "Choose your USB disk [1-$n, a to abort]:" 0 80 8 \ -- $MENU_OPTIONS \ 2>/tmp/whiptail diff --git a/initrd/bin/network-init-recovery b/initrd/bin/network-init-recovery index c7b93b84f..fb09d2ff9 100755 --- a/initrd/bin/network-init-recovery +++ b/initrd/bin/network-init-recovery @@ -2,60 +2,147 @@ . /etc/functions -TRACE "Under /bin/network-init-recovery" +TRACE_FUNC -# bring up the ethernet; maybe should do DHCP? -ifconfig lo 127.0.0.1 +mobile_tethering() +{ + TRACE_FUNC + #Tethering over USB for Mobile phones supporting CDC (Android Pixel 6a+, Librem phone, etc.) + if [ -e /lib/modules/cdc_ether.ko ]; then + #prompt user if he wants to enable USB tethering and skip if not + echo "" + echo "USB tethering support is available for mobile phones supporting CDC NCM/EEM tethering" + read -p "Do you want to enable USB tethering now? (Y/n)" -n 1 -r REPLY + echo "" + if [[ $REPLY =~ ^[Nn]$ ]]; then + echo "USB tethering not enabled, skipping..." + return 0 + fi + + #first enable USB controllers + enable_usb + + echo "" + echo "Please connect your mobile phone to a USB port and enable internet connection sharing." + echo "* Android: Select the 'Charging this device via USB' notification and enable tethering." + echo "* Linux: Set the wired connection's IPv4 method on the mobile phone to 'Shared to other computers'." + echo "Heads supports CDC-NCM and CDC-EEM. Android phones using RNDIS and Apple phones are not supported." + echo "" + read -p "Press Enter to continue..." -n 1 -r + + network_modules="mii usbnet cdc_ether cdc_ncm cdc_eem" + for module in $(echo $network_modules); do + if [ -f /lib/modules/$module.ko ]; then + insmod /lib/modules/$module.ko + fi + done -network_modules="e1000 e1000e igb sfc mdio mlx4_core mlx4_en" -for module in `echo $network_modules`; do - if [ -f /lib/modules/$module.ko ]; then - insmod /lib/modules/$module.ko + if ! [ -e /sys/class/net/usb0 ]; then + echo "" + echo "No tethering network interface was found." + echo "* Make sure the phone supports CDC-NCM or CDC-EEM. Many, but not all, Android and Linux phones support these." + echo "* Android phones requiring RNDIS and Apple phones are not supported." + echo "* Make sure the cable used works with data and that the phone has tethering enabled." + echo "" + read -p "Press Enter to continue..." -n 1 -r + fi + fi +} + +ethernet_activation() +{ + TRACE_FUNC + #Prompt user if he wants to enable ethernet and skip if not + read -p "Do you want to enable Ethernet now? (Y/n)" -n 1 -r REPLY + echo "" + if [[ $REPLY =~ ^[Nn]$ ]]; then + echo "Ethernet not enabled, skipping..." + return 0 fi -done -if [ -e /sys/class/net/eth0 ]; then - #Randomize eth0 MAC address of maximized boards + echo "Loading Ethernet network modules..." + network_modules="e1000 e1000e igb sfc mdio mlx4_core mlx4_en" + for module in $(echo $network_modules); do + if [ -f /lib/modules/$module.ko ]; then + insmod /lib/modules/$module.ko + fi + done +} + +# bring up the ethernet interface +ifconfig lo 127.0.0.1 + +mobile_tethering +ethernet_activation + +if [ -e /sys/class/net/usb0 ]; then + dev=usb0 + echo "USB tethering network interface detected as $dev" +elif [ -e /sys/class/net/eth0 ]; then + dev=eth0 + echo "Ethernet network interface detected as $dev" +else + echo "No network interface detected, please check your hardware and board configuration" + exit 1 +fi + +if [ -n "$dev" ]; then + + #Randomize MAC address for maximized boards if echo "$CONFIG_BOARD" | grep -q maximized; then - ifconfig eth0 down - echo "Generating random MAC address (might take a while)..." + ifconfig $dev down + echo "Generating random MAC address..." mac=$(generate_random_mac_address) - echo "Assigning randomly generated MAC: $mac to eth0..." - ifconfig eth0 hw ether $mac - ifconfig eth0 up + echo "Assigning randomly generated MAC: $mac to $dev..." + ifconfig $dev hw ether $mac + ifconfig $dev up fi - # Set up static IP + # Set up static IP if configured in board config if [ ! -z "$CONFIG_BOOT_STATIC_IP" ]; then - ifconfig eth0 $CONFIG_BOOT_STATIC_IP - #Get ip from DHCP - elif [ -e /sbin/udhcpc ];then - if udhcpc -T 1 -q; then + echo "Setting static IP: $CONFIG_BOOT_STATIC_IP" + ifconfig $dev $CONFIG_BOOT_STATIC_IP + echo "No NTP sync with static IP: no DNS server nor gateway defined, set time manually" + # Set up DHCP if no static IP + elif [ -e /sbin/udhcpc ]; then + echo "Getting IP from first DHCP server answering. This may take a while..." + if udhcpc -T 1 -i $dev -q; then if [ -e /sbin/ntpd ]; then - DNS_SERVER=$(grep nameserver /etc/resolv.conf|awk -F " " {'print $2'}) - killall ntpd 2&>1 > /dev/null - if ! ntpd -d -N -n -q -p $DNS_SERVER > /dev/ttyprintk; then - if ! ntpd -d -d -N -n -q -p ntp.pool.org> /dev/ttyprintk; then - echo "NTP sync unsuccessful." > /dev/tty0 + DNS_SERVER=$(grep nameserver /etc/resolv.conf | awk -F " " {'print $2'}) + killall ntpd 2 &>1 >/dev/null + echo "Attempting to sync time with NTP server: $DNS_SERVER..." + if ! ntpd -d -N -n -q -p $DNS_SERVER; then + echo "NTP sync unsuccessful with DNS server" + echo "Attempting NTP time sync with pool.ntp.org..." + if ! ntpd -d -d -N -n -q -p pool.ntp.org; then + echo "NTP sync unsuccessful." + else + echo "NTP time sync successful." fi fi + echo "Syncing hardware clock with system time in UTC/GMT timezone..." hwclock -w - echo "" > /dev/tty0 - date=`date "+%Y-%m-%d %H:%M:%S %Z"` - echo "Time: $date" > /dev/tty0 + echo "" + date=$(date "+%Y-%m-%d %H:%M:%S %Z") + echo "Time: $date" fi - fi + fi fi - - ifconfig eth0 > /dev/ttyprintk - + if [ -e /bin/dropbear ]; then # Set up the ssh server, allow root logins and log to stderr if [ ! -d /etc/dropbear ]; then mkdir /etc/dropbear fi - dropbear -B -R 2>/dev/ttyprintk + echo "Starting dropbear ssh server..." + # Make sure dropbear is not already running + killall dropbear > /dev/null 2>&1 || true + # Start dropbear with root login and log to stderr + # -B background + # -R create host keys + dropbear -B -R fi - echo "" > /dev/tty0 - ifconfig eth0 | head -2 > /dev/tty0 + echo "" + echo "Network setup complete:" + ifconfig $dev fi diff --git a/initrd/bin/nitropad-shutdown.sh b/initrd/bin/nitropad-shutdown.sh deleted file mode 100755 index e449bc311..000000000 --- a/initrd/bin/nitropad-shutdown.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/ash - -# Method to access IT5570 IO Depth 2 registers -it5570_i2ec() { - # TODO: Use /dev/port instead of iotools - - # Address high byte - iotools io_write8 0x2e 0x2e - iotools io_write8 0x2f 0x11 - iotools io_write8 0x2e 0x2f - iotools io_write8 0x2f $(($2>>8 & 0xff)) - - # Address low byte - iotools io_write8 0x2e 0x2e - iotools io_write8 0x2f 0x10 - iotools io_write8 0x2e 0x2f - iotools io_write8 0x2f $(($2 & 0xff)) - - # Data - iotools io_write8 0x2e 0x2e - iotools io_write8 0x2f 0x12 - iotools io_write8 0x2e 0x2f - - case $1 in - "r") - iotools io_read8 0x2f - ;; - "w") - iotools io_write8 0x2f "$3" - ;; - esac -} - -# shut down using EC external watchdog reset -it5570_i2ec w 0x1f01 0x20 -it5570_i2ec w 0x1f07 0x01 diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 656f85f7e..48b52d583 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -5,10 +5,11 @@ set -o pipefail ## External files sourced . /etc/functions +. /etc/gui_functions . /etc/luks-functions . /tmp/config -TRACE "Under /bin/oem-factory-reset" +TRACE_FUNC # use TERM to exit on error trap "exit 1" TERM @@ -22,12 +23,10 @@ CANCEL="--no-button Cancel" HEIGHT="0" WIDTH="80" +# Default values USER_PIN_DEF=123456 ADMIN_PIN_DEF=12345678 TPM_PASS_DEF=12345678 -USER_PIN="" -ADMIN_PIN="" -TPM_PASS="" GPG_GEN_KEY_IN_MEMORY="n" GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD="n" @@ -38,10 +37,75 @@ MAX_HOTP_GPG_PIN_LENGTH=25 CUSTOM_PASS_AFFECTED_COMPONENTS="" # Default GPG Algorithm is RSA +# p256 also supported (TODO: nk3 supports RSA 4096 in secure element in firmare v1.7.1. Switch!? GPG_ALGO="RSA" -# Default RSA key length +# Default RSA key length is 3072 bits for OEM key gen. 4096 are way longer to generate in smartcard RSA_KEY_LENGTH=3072 +# If we use complex generated passphrases, we will really try hard to make the +# user record them +MAKE_USER_RECORD_PASSPHRASES= + +# Function to handle --mode parameter +handle_mode() { + local mode=$1 + case $mode in + oem) + DEBUG "OEM mode selected" + CUSTOM_SINGLE_PASS=$(generate_passphrase --number_words 2 --max_length $MAX_HOTP_GPG_PIN_LENGTH) + USER_PIN=$CUSTOM_SINGLE_PASS + ADMIN_PIN=$CUSTOM_SINGLE_PASS + TPM_PASS=$CUSTOM_SINGLE_PASS + # User doesn't know this password, really badger them to record it + MAKE_USER_RECORD_PASSPHRASES=y + + title_text="OEM Factory Reset Mode" + ;; + user) + DEBUG "User mode selected" + USER_PIN=$(generate_passphrase --number_words 2 --max_length $MAX_HOTP_GPG_PIN_LENGTH) + ADMIN_PIN=$(generate_passphrase --number_words 2 --max_length $MAX_HOTP_GPG_PIN_LENGTH) + TPM_PASS=$ADMIN_PIN + # User doesn't know this password, really badger them to record it + MAKE_USER_RECORD_PASSPHRASES=y + + title_text="User Re-Ownership Mode" + ;; + *) + warn "Unknown oem-factory-reset lauched mode, setting PINs to weak defaults" + USER_PIN=$USER_PIN_DEF + ADMIN_PIN=$ADMIN_PIN_DEF + TPM_PASS=$ADMIN_PIN_DEF + ;; + esac +} + +# Parse command-line arguments +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + --mode) + MODE="$2" + shift # past argument + shift # past value + ;; + *) + shift # past unrecognized argument + ;; + esac +done + +# Handle the --mode parameter if provided +if [[ -n "$MODE" ]]; then + handle_mode "$MODE" +fi + +#Override RSA_KEY_LENGTH to 2048 bits for Canokey under qemu testing boards until canokey fixes +if [[ "$CONFIG_BOARD_NAME" == qemu-* ]]; then + DEBUG "Overriding RSA_KEY_LENGTH to 2048 bits for Canokey under qemu testing boards" + RSA_KEY_LENGTH=2048 +fi + GPG_USER_NAME="OEM Key" GPG_KEY_NAME=$(date +%Y%m%d%H%M%S) GPG_USER_MAIL="oem-${GPG_KEY_NAME}@example.com" @@ -52,210 +116,221 @@ SKIP_BOOT="n" die() { - local msg=$1 - if [ -n "$msg" ]; then - echo -e "\n$msg" - fi - kill -s TERM $TOP_PID - exit 1 + local msg=$1 + if [ -n "$msg" ]; then + echo -e "\n$msg" + fi + kill -s TERM $TOP_PID + exit 1 } -whiptail_error() { - local msg=$1 - if [ "$msg" = "" ]; then - die "whiptail error: An error msg is required" - fi - whiptail $BG_COLOR_ERROR --msgbox "${msg}\n\n" $HEIGHT $WIDTH $BG_COLOR_ERROR --title "Error" +local_whiptail_error() { + local msg=$1 + if [ "$msg" = "" ]; then + die "whiptail error: An error msg is required" + fi + whiptail_error --msgbox "${msg}\n\n" $HEIGHT $WIDTH --title "Error" } whiptail_error_die() { - whiptail_error "$@" - die + local_whiptail_error "$@" + die } mount_boot() { - TRACE "Under oem-factory-reset:mount_boot" - # Mount local disk if it is not already mounted. - # Added so that 'o' can be typed early at boot to enter directly into OEM Factory Reset - if ! grep -q /boot /proc/mounts; then - # try to mount if CONFIG_BOOT_DEV exists - if [ -e "$CONFIG_BOOT_DEV" ]; then - mount -o ro $CONFIG_BOOT_DEV /boot || die "Failed to mount $CONFIG_BOOT_DEV. Please change boot device under Configuration > Boot Device" - fi - fi + TRACE_FUNC + # Mount local disk if it is not already mounted. + # Added so that 'o' can be typed early at boot to enter directly into OEM Factory Reset + if ! grep -q /boot /proc/mounts; then + # try to mount if CONFIG_BOOT_DEV exists + if [ -e "$CONFIG_BOOT_DEV" ]; then + mount -o ro $CONFIG_BOOT_DEV /boot || die "Failed to mount $CONFIG_BOOT_DEV. Please change boot device under Configuration > Boot Device" + fi + fi } -#Generate a gpg master key: no expiration date, RSA 4096 bits +reset_nk3_secret_app() { + TRACE_FUNC + + # Reset Nitrokey 3 Secrets app PIN with $ADMIN_PIN (default 12345678, or customised) + if lsusb | grep -q "20a0:42b2" && [ -x /bin/hotp_verification ]; then + echo + warn "Resetting Nitrokey 3's Secrets app with PIN. Physical presence (touch) will be required" + # TODO: change message when https://github.com/Nitrokey/nitrokey-hotp-verification/issues/41 is fixed + # Reset Nitrokey 3 secret app with PIN + # Do 3 attempts to reset Nitrokey 3 Secrets app if return code is 3 (no touch) + for attempt in 1 2 3; do + if /bin/hotp_verification reset "${ADMIN_PIN}"; then + echo + return 0 + else + error_code=$? + if [ $error_code -eq 3 ] && [ $attempt -lt 3 ]; then + whiptail --msgbox "Nitrokey 3 requires physical presence: touch the dongle when requested" $HEIGHT $WIDTH --title "Nk3 cecrets app reset attempt: $attempt/3" + else + whiptail_error_die "Nitrokey 3's Secrets app reset failed with error:$error_code. Contact Nitrokey support" + fi + fi + done + fi +} + +#Generate a gpg master key: no expiration date, ${RSA_KEY_LENGTH} bits #This key will be used to sign 3 subkeys: encryption, authentication and signing #The master key and subkeys will be copied to backup, and the subkeys moved from memory keyring to the smartcard generate_inmemory_RSA_master_and_subkeys() { - TRACE "Under oem-factory-reset:generate_inmemory_RSA_master_and_subkeys" - echo "Generating GPG key material in memory:" - - echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits master key..." - # Generate GPG master key - { - echo "Key-Type: RSA" # RSA key - echo "Key-Length: ${RSA_KEY_LENGTH}" # RSA key length - echo "Key-Usage: sign" # RSA key usage - echo "Name-Real: ${GPG_USER_NAME}" # User name - echo "Name-Comment: ${GPG_USER_COMMENT}" # User comment - echo "Name-Email: ${GPG_USER_MAIL}" # User email - echo "Expire-Date: 0" # No expiration date - echo "Passphrase: ${ADMIN_PIN}" # Admin PIN - echo "%commit" # Commit changes - } | gpg --command-fd=0 --status-fd=1 --batch --gen-key >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key generation failed!\n\n$ERROR" - fi - - echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits signing subkey..." - # Add signing subkey - { - echo addkey # add key in --edit-key mode - echo 4 # RSA (sign only) - echo ${RSA_KEY_LENGTH} # Signing key size set to RSA_KEY_LENGTH - echo 0 # No expiration date - echo ${ADMIN_PIN} # Local keyring admin pin - echo y # confirm - echo save # save changes and commit to keyring - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key "${GPG_USER_MAIL}" \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key signing subkey generation failed!\n\n$ERROR" - fi - - echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits encryption subkey..." - #Add encryption subkey - { - echo addkey # add key in --edit-key mode - echo 6 # RSA (encrypt only) - echo ${RSA_KEY_LENGTH} # Encryption key size set to RSA_KEY_LENGTH - echo 0 # No expiration date - echo ${ADMIN_PIN} # Local keyring admin pin - echo y # confirm - echo save # save changes and commit to keyring - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key "${GPG_USER_MAIL}" \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key encryption subkey generation failed!\n\n$ERROR" - fi - - echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits authentication subkey..." - #Add authentication subkey - { - #Authentication subkey needs gpg in expert mode to select RSA custom mode (8) - # in order to disable encryption and signing capabilities of subkey - # and then enable authentication capability - echo addkey # add key in --edit-key mode - echo 8 # RSA (set your own capabilities) - echo S # disable sign capability - echo E # disable encryption capability - echo A # enable authentication capability - echo Q # Quit - echo ${RSA_KEY_LENGTH} # Authentication key size set to RSA_KEY_LENGTH - echo 0 # No expiration date - echo ${ADMIN_PIN} # Local keyring admin pin - echo y # confirm - echo save # save changes and commit to keyring - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --expert --edit-key "${GPG_USER_MAIL}" \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key authentication subkey generation failed!\n\n$ERROR" - fi - - DEBUG "Setting public key to ultimate trust..." - #Set the public key to the ultimate trust - { - echo trust # trust key in --edit-key mode - echo 5 # ultimate trust - echo y # confirm - echo save # save changes and commit to keyring - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key "${GPG_USER_MAIL}" \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key setting public key to ultimate trust failed!\n\n$ERROR" - fi + TRACE_FUNC + + echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits master key..." + # Generate GPG master key + { + echo "Key-Type: RSA" # RSA key + echo "Key-Length: ${RSA_KEY_LENGTH}" # RSA key length + echo "Key-Usage: sign" # RSA key usage + echo "Name-Real: ${GPG_USER_NAME}" # User name + echo "Name-Comment: ${GPG_USER_COMMENT}" # User comment + echo "Name-Email: ${GPG_USER_MAIL}" # User email + echo "Expire-Date: 0" # No expiration date + echo "Passphrase: ${ADMIN_PIN}" # Admin PIN + echo "%commit" # Commit changes + } | DO_WITH_DEBUG gpg --expert --batch --command-fd=0 --status-fd=1 --pinentry-mode=loopback --generate-key >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key generation failed!\n\n$ERROR" + fi + + echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits signing subkey..." + # Add signing subkey + { + echo addkey # add key in --edit-key mode + echo 4 # RSA (sign only) + echo ${RSA_KEY_LENGTH} # Signing key size set to RSA_KEY_LENGTH + echo 0 # No expiration date + echo ${ADMIN_PIN} # Local keyring admin pin + echo y # confirm + echo save # save changes and commit to keyring + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key "${GPG_USER_MAIL}" \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key signing subkey generation failed!\n\n$ERROR" + fi + + echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits encryption subkey..." + #Add encryption subkey + { + echo addkey # add key in --edit-key mode + echo 6 # RSA (encrypt only) + echo ${RSA_KEY_LENGTH} # Encryption key size set to RSA_KEY_LENGTH + echo 0 # No expiration date + echo ${ADMIN_PIN} # Local keyring admin pin + echo y # confirm + echo save # save changes and commit to keyring + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key "${GPG_USER_MAIL}" \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key encryption subkey generation failed!\n\n$ERROR" + fi + + echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits authentication subkey..." + #Add authentication subkey + { + #Authentication subkey needs gpg in expert mode to select RSA custom mode (8) + # in order to disable encryption and signing capabilities of subkey + # and then enable authentication capability + echo addkey # add key in --edit-key mode + echo 8 # RSA (set your own capabilities) + echo S # disable sign capability + echo E # disable encryption capability + echo A # enable authentication capability + echo Q # Quit + echo ${RSA_KEY_LENGTH} # Authentication key size set to RSA_KEY_LENGTH + echo 0 # No expiration date + echo ${ADMIN_PIN} # Local keyring admin pin + echo y # confirm + echo save # save changes and commit to keyring + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --expert --edit-key "${GPG_USER_MAIL}" \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key authentication subkey generation failed!\n\n$ERROR" + fi } #Generate a gpg master key: no expiration date, p256 key (ECC) #This key will be used to sign 3 subkeys: encryption, authentication and signing #The master key and subkeys will be copied to backup, and the subkeys moved from memory keyring to the smartcard generate_inmemory_p256_master_and_subkeys() { - TRACE "Under oem-factory-reset:generate_inmemory_p256_master_and_subkeys" - - echo "Generating GPG p256 bits master key..." - { - echo "Key-Type: ECDSA" # ECDSA key - echo "Key-Curve: nistp256" # ECDSA key curve - echo "Key-Usage: cert" # ECDSA key usage - echo "Name-Real: ${GPG_USER_NAME}" # User name - echo "Name-Comment: ${GPG_USER_COMMENT}" # User comment - echo "Name-Email: ${GPG_USER_MAIL}" # User email - echo "Passphrase: ${ADMIN_PIN}" # Local keyring admin pin - echo "Expire-Date: 0" # No expiration date - echo "%commit" # Commit changes - } | gpg --expert --batch --command-fd=0 --status-fd=1 --pinentry-mode=loopback --generate-key \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG p256 Key generation failed!\n\n$ERROR" - fi - - #Keep Master key fingerprint for add key calls - MASTER_KEY_FP=$(gpg --list-secret-keys --with-colons | grep fpr | cut -d: -f10) - - echo "Generating GPG nistp256 signing subkey..." - { - echo addkey # add key in --edit-key mode - echo 11 # ECC own set capability - echo Q # sign already present, do not modify - echo 3 # P-256 - echo 0 # no expiration - echo ${ADMIN_PIN} # Local keyring admin pin - echo save # save changes and commit to keyring - } | gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key ${MASTER_KEY_FP} >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR_MSG=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "Failed to add ECC nistp256 signing key to master key\n\n${ERROR_MSG}" - fi - - echo "Generating GPG nistp256 encryption subkey..." - { - echo addkey - echo 12 # ECC own set capability - echo Q # Quit - echo 3 # P-256 - echo 0 # no expiration - echo ${ADMIN_PIN} # Local keyring admin pin - echo save # save changes and commit to keyring - } | gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key ${MASTER_KEY_FP} >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR_MSG=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "Failed to add ECC nistp256 encryption key to master key\n\n${ERROR_MSG}" - fi - - echo "Generating GPG nistp256 authentication subkey..." - { - echo addkey # add key in --edit-key mode - echo 11 # ECC own set capability - echo S # deactivate sign - echo A # activate auth - echo Q # Quit - echo 3 # P-256 - echo 0 # no expiration - echo ${ADMIN_PIN} # Local keyring admin pin - echo save # save changes and commit to keyring - } | gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key ${MASTER_KEY_FP} >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR_MSG=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "Failed to add ECC nistp256 authentication key to master key\n\n${ERROR_MSG}" - fi + TRACE_FUNC + + echo "Generating GPG p256 bits master key..." + { + echo "Key-Type: ECDSA" # ECDSA key + echo "Key-Curve: nistp256" # ECDSA key curve + echo "Key-Usage: cert" # ECDSA key usage + echo "Name-Real: ${GPG_USER_NAME}" # User name + echo "Name-Comment: ${GPG_USER_COMMENT}" # User comment + echo "Name-Email: ${GPG_USER_MAIL}" # User email + echo "Passphrase: ${ADMIN_PIN}" # Local keyring admin pin + echo "Expire-Date: 0" # No expiration date + echo "%commit" # Commit changes + } | DO_WITH_DEBUG gpg --expert --batch --command-fd=0 --status-fd=1 --pinentry-mode=loopback --generate-key \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG p256 Key generation failed!\n\n$ERROR" + fi + + #Keep Master key fingerprint for add key calls + MASTER_KEY_FP=$(gpg --list-secret-keys --with-colons | grep fpr | cut -d: -f10) + + echo "Generating GPG nistp256 signing subkey..." + { + echo addkey # add key in --edit-key mode + echo 11 # ECC own set capability + echo Q # sign already present, do not modify + echo 3 # P-256 + echo 0 # No validity/expiration date + echo ${ADMIN_PIN} # Local keyring admin pin + echo save # save changes and commit to keyring + } | DO_WITH_DEBUG gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key ${MASTER_KEY_FP} >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR_MSG=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "Failed to add ECC nistp256 signing key to master key\n\n${ERROR_MSG}" + fi + + echo "Generating GPG nistp256 encryption subkey..." + { + echo addkey + echo 12 # ECC own set capability + echo Q # Quit + echo 3 # P-256 + echo 0 # No validity/expiration date + echo ${ADMIN_PIN} # Local keyring admin pin + echo save # save changes and commit to keyring + } | DO_WITH_DEBUG gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key ${MASTER_KEY_FP} >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR_MSG=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "Failed to add ECC nistp256 encryption key to master key\n\n${ERROR_MSG}" + fi + + echo "Generating GPG nistp256 authentication subkey..." + { + echo addkey # add key in --edit-key mode + echo 11 # ECC own set capability + echo S # deactivate sign + echo A # activate auth + echo Q # Quit + echo 3 # P-256 + echo 0 # no expiration + echo ${ADMIN_PIN} # Local keyring admin pin + echo save # save changes and commit to keyring + } | DO_WITH_DEBUG gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key ${MASTER_KEY_FP} >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR_MSG=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "Failed to add ECC nistp256 authentication key to master key\n\n${ERROR_MSG}" + fi } @@ -266,140 +341,141 @@ generate_inmemory_p256_master_and_subkeys() { # The master key was already used to sign the subkeys, so it is not needed anymore # Delete the master key from the keyring once key to card is done (already backed up on LUKS private partition) keytocard_subkeys_to_smartcard() { - TRACE "Under oem-factory-reset:keytocard_subkeys_to_smartcard" - - #make sure usb ready and USB Security Dongle ready to communicate with - enable_usb - enable_usb_storage - gpg --card-status >/dev/null 2>&1 || die "Error getting GPG card status" - - gpg_key_factory_reset - - echo "Moving subkeys to smartcard..." - { - echo "key 1" #Toggle on Signature key in --edit-key mode on local keyring - echo "keytocard" #Move Signature key to smartcard - echo "1" #Select Signature key keyslot on smartcard - echo "${ADMIN_PIN}" #Local keyring Subkey PIN - echo "${ADMIN_PIN_DEF}" #Smartcard Admin PIN - echo "0" #No expiration date - echo "key 1" #Toggle off Signature key - echo "key 2" #Toggle on Encryption key - echo "keytocard" #Move Encryption key to smartcard - echo "2" #Select Encryption key keyslot on smartcard - echo "${ADMIN_PIN}" #Local keyring Subkey PIN - echo "${ADMIN_PIN_DEF}" #Smartcard Admin PIN - echo "key 2" #Toggle off Encryption key - echo "key 3" #Toggle on Authentication key - echo "keytocard" #Move Authentication key to smartcard - echo "3" #Select Authentication key keyslot on smartcard - echo "${ADMIN_PIN}" #Local keyring Subkey PIN - echo "${ADMIN_PIN_DEF}" #Smartcard Admin PIN - echo "key 3" #Toggle off Authentication key - echo "save" #Save changes and commit to keyring - } | gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key "${GPG_USER_MAIL}" \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key moving subkeys to smartcard failed!\n\n$ERROR" - fi - - TRACE "oem-factory-reset:keytocard_subkeys_to_smartcard done" + TRACE_FUNC + + #make sure usb ready and USB Security dongle ready to communicate with + enable_usb + enable_usb_storage + gpg --card-status >/dev/null 2>&1 || die "Error getting GPG card status" + + gpg_key_factory_reset + + echo "Moving subkeys to smartcard..." + { + echo "key 1" #Toggle on Signature key in --edit-key mode on local keyring + echo "keytocard" #Move Signature key to smartcard + echo "1" #Select Signature key key slot on smartcard + echo "${ADMIN_PIN}" #Local keyring Subkey PIN + echo "${ADMIN_PIN_DEF}" #Smartcard Admin PIN + echo "0" #No expiration date + echo "key 1" #Toggle off Signature key + echo "key 2" #Toggle on Encryption key + echo "keytocard" #Move Encryption key to smartcard + echo "2" #Select Encryption key key slot on smartcard + echo "${ADMIN_PIN}" #Local keyring Subkey PIN + echo "${ADMIN_PIN_DEF}" #Smartcard Admin PIN + echo "key 2" #Toggle off Encryption key + echo "key 3" #Toggle on Authentication key + echo "keytocard" #Move Authentication key to smartcard + echo "3" #Select Authentication key slot on smartcard + echo "${ADMIN_PIN}" #Local keyring Subkey PIN + echo "${ADMIN_PIN_DEF}" #Smartcard Admin PIN + echo "key 3" #Toggle off Authentication key + echo "save" #Save changes and commit to keyring + } | DO_WITH_DEBUG gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --edit-key "${GPG_USER_MAIL}" \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key moving subkeys to smartcard failed!\n\n$ERROR" + fi + + TRACE_FUNC } #Whiptail prompt to insert to be wiped thumb drive prompt_insert_to_be_wiped_thumb_drive() { - TRACE "Under oem-factory-reset:prompt_insert_to_be_wiped_thumb_drive" - #Whiptail warning about having only desired to be wiped thumb drive inserted - whiptail $BG_COLOR_WARNING --title 'WARNING: Please insert the thumb drive to be wiped' \ - --msgbox "The thumb drive will be WIPED next.\n\nPlease connect only the thumb drive to be wiped and disconnect others." 0 80 || - die "Error displaying warning about having only desired to be wiped thumb drive inserted" + TRACE_FUNC + #Whiptail warning about having only desired to be wiped thumb drive inserted + whiptail_warning --title 'WARNING: Please insert the thumb drive to be wiped' \ + --msgbox "The thumb drive will be WIPED next.\n\nPlease connect only the thumb drive to be wiped and disconnect others." 0 80 || + die "Error displaying warning about having only desired to be wiped thumb drive inserted" } #export master key and subkeys to thumbdrive's private LUKS contained partition export_master_key_subkeys_and_revocation_key_to_private_LUKS_container() { - TRACE "Under oem-factory-reset:export_master_key_subkeys_and_revocation_key_to_private_LUKS_container" - - #Sanity check on passed arguments - while [ $# -gt 0 ]; do - case "$1" in - --mode) - mode="$2" - shift - shift - ;; - --device) - device="$2" - shift - shift - ;; - --mountpoint) - mountpoint="$2" - shift - shift - ;; - --pass) - pass="${2}" - shift - shift - ;; - *) - die "Error: unknown argument: $1" - ;; - esac - done - - mount-usb --mode "$mode" --device "$device" --mountpoint "$mountpoint" --pass "$pass" || die "Error mounting thumb drive's private partition" - - #Export master key and subkeys to thumb drive - DEBUG "Exporting master key and subkeys to private LUKS container's partition..." - - gpg --export-secret-key --armor --pinentry-mode loopback --passphrase="${pass}" "${GPG_USER_MAIL}" >"$mountpoint"/privkey.sec || - die "Error exporting master key to private LUKS container's partition" - gpg --export-secret-subkeys --armor --pinentry-mode loopback --passphrase="${pass}" "${GPG_USER_MAIL}" >"$mountpoint"/subkeys.sec || - die "Error exporting subkeys to private LUKS container's partition" - #copy whole keyring to thumb drive, including revocation key and trust database - cp -af ~/.gnupg "$mountpoint"/.gnupg || die "Error copying whole keyring to private LUKS container's partition" - #Unmount private LUKS container's mount point - umount "$mountpoint" || die "Error unmounting private LUKS container's mount point" - - TRACE "oem-factory-reset:export_master_key_subkeys_and_revocation_key_to_private_LUKS_container done" + TRACE_FUNC + + #Sanity check on passed arguments + while [ $# -gt 0 ]; do + case "$1" in + --mode) + mode="$2" + shift + shift + ;; + --device) + device="$2" + shift + shift + ;; + --mountpoint) + mountpoint="$2" + shift + shift + ;; + --pass) + pass="${2}" + shift + shift + ;; + *) + die "Error: unknown argument: $1" + ;; + esac + done + + mount-usb --mode "$mode" --device "$device" --mountpoint "$mountpoint" --pass "$pass" || die "Error mounting thumb drive's private partition" + + #Export master key and subkeys to thumb drive + DEBUG "Exporting master key and subkeys to private LUKS container's partition..." + + gpg --export-secret-key --armor --pinentry-mode loopback --passphrase="${pass}" "${GPG_USER_MAIL}" >"$mountpoint"/privkey.sec || + die "Error exporting master key to private LUKS container's partition" + gpg --export-secret-subkeys --armor --pinentry-mode loopback --passphrase="${pass}" "${GPG_USER_MAIL}" >"$mountpoint"/subkeys.sec || + die "Error exporting subkeys to private LUKS container's partition" + #copy whole keyring to thumb drive, including revocation key and trust database + cp -af ~/.gnupg "$mountpoint"/.gnupg || die "Error copying whole keyring to private LUKS container's partition" + #Unmount private LUKS container's mount point + umount "$mountpoint" || die "Error unmounting private LUKS container's mount point" + + TRACE_FUNC } #Export public key to thumb drive's public partition export_public_key_to_thumbdrive_public_partition() { - TRACE "Under oem-factory-reset:export_public_key_to_thumbdrive_public_partition" - - #Sanity check on passed arguments - while [ $# -gt 0 ]; do - case "$1" in - --mode) - mode="$2" - shift - shift - ;; - --device) - device="$2" - shift - shift - ;; - --mountpoint) - mountpoint="$2" - shift - shift - ;; - *) - die "Error: unknown argument: $1" - ;; - esac - done - - #pass non-empty arguments to --pass, --mountpoint, --device, --mode - mount-usb --device "$device" --mode "$mode" --mountpoint "$mountpoint" || die "Error mounting thumb drive's public partition" - gpg --export --armor "${GPG_USER_MAIL}" >"$mountpoint"/pubkey.asc || die "Error exporting public key to thumb drive's public partition" - umount "$mountpoint" || die "Error unmounting thumb drive's public partition" - - TRACE "oem-factory-reset:export_public_key_to_thumbdrive_public_partition done" + TRACE_FUNC + + #Sanity check on passed arguments + while [ $# -gt 0 ]; do + case "$1" in + --mode) + mode="$2" + shift + shift + ;; + --device) + device="$2" + shift + shift + ;; + --mountpoint) + mountpoint="$2" + shift + shift + ;; + *) + die "Error: unknown argument: $1" + ;; + esac + done + + #pass non-empty arguments to --pass, --mountpoint, --device, --mode + mount-usb --device "$device" --mode "$mode" --mountpoint "$mountpoint" || die "Error mounting thumb drive's public partition" + #TODO: reuse "Obtain GPG key ID" so that pubkey on public thumb drive partition is named after key ID + gpg --export --armor "${GPG_USER_MAIL}" >"$mountpoint"/pubkey.asc || die "Error exporting public key to thumb drive's public partition" + umount "$mountpoint" || die "Error unmounting thumb drive's public partition" + + TRACE_FUNC } # Select thumb drive and LUKS container size for GPG key export @@ -407,457 +483,481 @@ export_public_key_to_thumbdrive_public_partition() { # - thumb_drive # - thumb_drive_luks_percent select_thumb_drive_for_key_material() { - TRACE "Under oem-factory-reset:wipe_thumb_drive_and_copy_gpg_key_material" - - #enable usb storage - enable_usb - enable_usb_storage - - prompt_insert_to_be_wiped_thumb_drive - - #loop until user chooses a disk - thumb_drive="" - while [ -z "$thumb_drive" ]; do - #list usb storage devices - list_usb_storage disks >/tmp/usb_disk_list - # Abort if: - # - no disks found (prevent file_selector's nonsense prompt) - # - file_selector fails for any reason - # - user aborts (file_selector succeeds but FILE is empty) - if [ $(cat /tmp/usb_disk_list | wc -l) -gt 0 ] && - file_selector --show-size "/tmp/usb_disk_list" "Select USB device to partition" && - [ -n "$FILE" ]; then - # Obtain size of thumb drive to be wiped with fdisk - disk_size_bytes="$(blockdev --getsize64 "$FILE")" - if [ "$disk_size_bytes" -lt "$((128*1024*1024))" ]; then - warn "Thumb drive size is less than 128MB!" - warn "LUKS container needs to be at least 8MB!" - warn "If the next operation fails, try with a bigger thumb drive" - fi - - select_luks_container_size_percent - thumb_drive_luks_percent="$(cat /tmp/luks_container_size_percent)" - - if ! confirm_thumb_drive_format "$FILE" "$thumb_drive_luks_percent"; then - warn "Thumb drive wipe aborted by user!" - continue - fi - - #User chose and confirmed a thumb drive and its size to be wiped - thumb_drive=$FILE - else - #No USB storage device detected - warn "No USB storage device detected! Aborting OEM Factory Reset / Re-Ownership" - sleep 3 - die "No USB storage device detected! User decided to not wipe any thumb drive" - fi - done - thumb_drive_luks_percent="$(cat /tmp/luks_container_size_percent)" + TRACE_FUNC + + #enable usb storage + enable_usb + enable_usb_storage + + prompt_insert_to_be_wiped_thumb_drive + + #loop until user chooses a disk + thumb_drive="" + while [ -z "$thumb_drive" ]; do + #list usb storage devices + list_usb_storage disks >/tmp/usb_disk_list + # Abort if: + # - no disks found (prevent file_selector's nonsense prompt) + # - file_selector fails for any reason + # - user aborts (file_selector succeeds but FILE is empty) + if [ $(cat /tmp/usb_disk_list | wc -l) -gt 0 ] && + file_selector --show-size "/tmp/usb_disk_list" "Select USB device to partition" && + [ -n "$FILE" ]; then + # Obtain size of thumb drive to be wiped with fdisk + disk_size_bytes="$(blockdev --getsize64 "$FILE")" + if [ "$disk_size_bytes" -lt "$((128 * 1024 * 1024))" ]; then + warn "Thumb drive size is less than 128MB!" + warn "LUKS container needs to be at least 8MB!" + warn "If the next operation fails, try with a bigger thumb drive" + fi + + select_luks_container_size_percent + thumb_drive_luks_percent="$(cat /tmp/luks_container_size_percent)" + + if ! confirm_thumb_drive_format "$FILE" "$thumb_drive_luks_percent"; then + warn "Thumb drive wipe aborted by user!" + continue + fi + + #User chose and confirmed a thumb drive and its size to be wiped + thumb_drive=$FILE + else + #No USB storage device detected + warn "No USB storage device detected! Aborting OEM Factory Reset / Re-Ownership" + sleep 3 + die "No USB storage device detected! User decided to not wipe any thumb drive" + fi + done + thumb_drive_luks_percent="$(cat /tmp/luks_container_size_percent)" } #Wipe a thumb drive and export master key and subkeys to it # $1 - thumb drive block device # $2 - LUKS container percentage [1-99] wipe_thumb_drive_and_copy_gpg_key_material() { - TRACE "Under oem-factory-reset:wipe_thumb_drive_and_copy_gpg_key_material" + TRACE_FUNC - local thumb_drive thumb_drive_luks_percent - thumb_drive="$1" - thumb_drive_luks_percent="$2" + local thumb_drive thumb_drive_luks_percent + thumb_drive="$1" + thumb_drive_luks_percent="$2" - #Wipe thumb drive with a LUKS container of size $(cat /tmp/luks_container_size_percent) - prepare_thumb_drive "$thumb_drive" "$thumb_drive_luks_percent" "${ADMIN_PIN}" - #Export master key and subkeys to thumb drive first partition - export_master_key_subkeys_and_revocation_key_to_private_LUKS_container --mode rw --device "$thumb_drive"1 --mountpoint /media --pass "${ADMIN_PIN}" - #Export public key to thumb drive's public partition - export_public_key_to_thumbdrive_public_partition --mode rw --device "$thumb_drive"2 --mountpoint /media + #Wipe thumb drive with a LUKS container of size $(cat /tmp/luks_container_size_percent) + prepare_thumb_drive "$thumb_drive" "$thumb_drive_luks_percent" "${ADMIN_PIN}" + #Export master key and subkeys to thumb drive first partition + export_master_key_subkeys_and_revocation_key_to_private_LUKS_container --mode rw --device "$thumb_drive"1 --mountpoint /media --pass "${ADMIN_PIN}" + #Export public key to thumb drive's public partition + export_public_key_to_thumbdrive_public_partition --mode rw --device "$thumb_drive"2 --mountpoint /media - TRACE "Under oem-factory-reset:wipe_thumb_drive_and_copy_gpg_key_material done" + TRACE_FUNC } gpg_key_factory_reset() { - TRACE "Under oem-factory-reset:gpg_key_factory_reset" - - #enable usb storage - enable_usb - - # Factory reset GPG card - echo "GPG factory reset of USB Security Dongle's smartcard..." - { - echo admin # admin menu - echo factory-reset # factory reset smartcard - echo y # confirm - echo yes # confirm - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key factory reset failed!\n\n$ERROR" - fi - # If Nitrokey Storage is inserted, reset AES keys as well - if lsusb | grep -q "20a0:4109" && [ -x /bin/hotp_verification ]; then - /bin/hotp_verification regenerate ${ADMIN_PIN_DEF} - killall -9 scdaemon - fi - # Toggle forced sig (good security practice, forcing PIN request for each signature request) - if gpg --card-status | grep "Signature PIN" | grep -q "not forced"; then - DEBUG "GPG toggling forcesig on since off..." - { - echo admin # admin menu - echo forcesig # toggle forcesig - echo ${ADMIN_PIN_DEF} # local keyring PIN - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key forcesig toggle on failed!\n\n$ERROR" - fi - fi - # use p256 for key generation if requested - if [ "$GPG_ALGO" = "p256" ]; then - { - echo admin # admin menu - echo key-attr # key attributes - echo 2 # ECC - echo 3 # P-256 - echo ${ADMIN_PIN_DEF} # local keyring PIN - echo 2 # ECC - echo 3 # P-256 - echo ${ADMIN_PIN_DEF} # local keyring PIN - echo 2 # ECC - echo 3 # P-256 - echo ${ADMIN_PIN_DEF} # local keyring PIN - } | gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "Setting key to NIST-P256 in USB Security Dongle failed." - fi - # fallback to RSA key generation by default - elif [ "$GPG_ALGO" = "RSA" ]; then - DEBUG "GPG setting RSA key length to ${RSA_KEY_LENGTH} bits..." - # Set RSA key length - { - echo admin - echo key-attr - echo 1 # RSA - echo ${RSA_KEY_LENGTH} #Signing key size set to RSA_KEY_LENGTH - echo ${ADMIN_PIN_DEF} #Local keyring PIN - echo 1 # RSA - echo ${RSA_KEY_LENGTH} #Encryption key size set to RSA_KEY_LENGTH - echo ${ADMIN_PIN_DEF} #Local keyring PIN - echo 1 # RSA - echo ${RSA_KEY_LENGTH} #Authentication key size set to RSA_KEY_LENGTH - echo ${ADMIN_PIN_DEF} #Local keyring PIN - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "Setting key attributed to RSA ${RSA_KEY_LENGTH} bits in USB Security Dongle failed." - fi - else - #Unknown GPG_ALGO - whiptail_error_die "Unknown GPG_ALGO: $GPG_ALGO" - fi - - TRACE "oem-factory-reset:gpg_key_factory_reset done" + TRACE_FUNC + + #enable usb storage + enable_usb + + # Factory reset GPG card + echo "GPG factory reset of USB Security dongle's OpenPGP smartcard..." + { + echo admin # admin menu + echo factory-reset # factory reset smartcard + echo y # confirm + echo yes # confirm + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key factory reset failed!\n\n$ERROR" + fi + + # If Nitrokey Storage is inserted, reset AES keys as well + if lsusb | grep -q "20a0:4109" && [ -x /bin/hotp_verification ]; then + DEBUG "Nitrokey Storage detected, resetting AES keys..." + /bin/hotp_verification regenerate ${ADMIN_PIN_DEF} + DEBUG "Restarting scdaemon to remove possible exclusive lock of dongle" + killall -9 scdaemon + fi + + # Toggle forced sig (good security practice, forcing PIN request for each signature request) + if gpg --card-status | grep "Signature PIN" | grep -q "not forced"; then + DEBUG "GPG toggling forcesig on since off..." + { + echo admin # admin menu + echo forcesig # toggle forcesig + echo ${ADMIN_PIN_DEF} # local keyring PIN + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key forcesig toggle on failed!\n\n$ERROR" + fi + fi + + # use p256 for key generation if requested + if [ "$GPG_ALGO" = "p256" ]; then + { + echo admin # admin menu + echo key-attr # key attributes + echo 2 # ECC + echo 3 # P-256 + echo ${ADMIN_PIN_DEF} # local keyring PIN + echo 2 # ECC + echo 3 # P-256 + echo ${ADMIN_PIN_DEF} # local keyring PIN + echo 2 # ECC + echo 3 # P-256 + echo ${ADMIN_PIN_DEF} # local keyring PIN + } | DO_WITH_DEBUG gpg --expert --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "Setting key to NIST-P256 in USB Security dongle failed." + fi + # fallback to RSA key generation by default + elif [ "$GPG_ALGO" = "RSA" ]; then + DEBUG "GPG setting RSA key length to ${RSA_KEY_LENGTH} bits..." + # Set RSA key length + { + echo admin + echo key-attr + echo 1 # RSA + echo ${RSA_KEY_LENGTH} #Signing key size set to RSA_KEY_LENGTH + echo ${ADMIN_PIN_DEF} #Local keyring PIN + echo 1 # RSA + echo ${RSA_KEY_LENGTH} #Encryption key size set to RSA_KEY_LENGTH + echo ${ADMIN_PIN_DEF} #Local keyring PIN + echo 1 # RSA + echo ${RSA_KEY_LENGTH} #Authentication key size set to RSA_KEY_LENGTH + echo ${ADMIN_PIN_DEF} #Local keyring PIN + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "Setting key attributed to RSA ${RSA_KEY_LENGTH} bits in USB Security dongle failed." + fi + else + #Unknown GPG_ALGO + whiptail_error_die "Unknown GPG_ALGO: $GPG_ALGO" + fi + + TRACE_FUNC } generate_OEM_gpg_keys() { - TRACE "Under oem-factory-reset:generate_OEM_gpg_keys" - - #This function simply generates subkeys in smartcard following smarcard config from gpg_key_factory_reset - echo "Generating GPG keys in USB Security Dongle's smartcard..." - { - echo admin # admin menu - echo generate # generate keys - echo n # Do not export keys - echo ${ADMIN_PIN_DEF} # Default admin PIN since we just factory reset - echo ${USER_PIN_DEF} # Default user PIN since we just factory reset - echo 0 # No key expiration - echo ${GPG_USER_NAME} # User name - echo ${GPG_USER_MAIL} # User email - echo ${GPG_USER_COMMENT} # User comment - echo ${USER_PIN_DEF} # Default user PIN since we just factory reset - } | gpg --command-fd=0 --status-fd=2 --pinentry-mode=loopback --card-edit \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output) - whiptail_error_die "GPG Key automatic keygen failed!\n\n$ERROR" - fi - - TRACE "oem-factory-reset:generate_OEM_gpg_keys done" + TRACE_FUNC + + #This function simply generates subkeys in smartcard following smarcard config from gpg_key_factory_reset + echo "Generating GPG keys in USB Security dongle's OpenPGP smartcard..." + { + echo admin # admin menu + echo generate # generate keys + echo n # Do not export keys + echo ${ADMIN_PIN_DEF} # Default admin PIN since we just factory reset + echo ${USER_PIN_DEF} # Default user PIN since we just factory reset + echo 0 # No key expiration + echo ${GPG_USER_NAME} # User name + echo ${GPG_USER_MAIL} # User email + echo ${GPG_USER_COMMENT} # User comment + echo ${USER_PIN_DEF} # Default user PIN since we just factory reset + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=2 --pinentry-mode=loopback --card-edit \ + >/tmp/gpg_card_edit_output 2>&1 + #This outputs to console \ + # "gpg: checking the trustdb" + # "gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model" + # "gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u" + #TODO: Suppress this output to console (stdout shown in DEBUG mode)? + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output) + whiptail_error_die "GPG Key automatic keygen failed!\n\n$ERROR" + fi + + TRACE_FUNC } gpg_key_change_pin() { - TRACE "Under oem-factory-reset:gpg_key_change_pin" - DEBUG "Changing GPG key PIN" - # 1 = user PIN, 3 = admin PIN - PIN_TYPE=$1 - PIN_ORIG=${2} - PIN_NEW=${3} - # Change PIN - { - echo admin # admin menu - echo passwd # change PIN - echo ${PIN_TYPE} # 1 = user PIN, 3 = admin PIN - echo ${PIN_ORIG} # old PIN - echo ${PIN_NEW} # new PIN - echo ${PIN_NEW} # confirm new PIN - echo q # quit - echo q - } | gpg --command-fd=0 --status-fd=2 --pinentry-mode=loopback --card-edit \ - >/tmp/gpg_card_edit_output 2>&1 - if [ $? -ne 0 ]; then - ERROR=$(cat /tmp/gpg_card_edit_output | fold -s) - whiptail_error_die "GPG Key PIN change failed!\n\n$ERROR" - fi - - TRACE "oem-factory-reset:gpg_key_change_pin done" + TRACE_FUNC + + DEBUG "Changing GPG key PIN" + # 1 = user PIN, 3 = admin PIN + PIN_TYPE=$1 + PIN_ORIG=${2} + PIN_NEW=${3} + # Change PIN + { + echo admin # admin menu + echo passwd # change PIN + echo ${PIN_TYPE} # 1 = user PIN, 3 = admin PIN + echo ${PIN_ORIG} # old PIN + echo ${PIN_NEW} # new PIN + echo ${PIN_NEW} # confirm new PIN + echo q # quit + echo q + } | DO_WITH_DEBUG gpg --command-fd=0 --status-fd=2 --pinentry-mode=loopback --card-edit \ + >/tmp/gpg_card_edit_output 2>&1 + if [ $? -ne 0 ]; then + ERROR=$(cat /tmp/gpg_card_edit_output | fold -s) + whiptail_error_die "GPG Key PIN change failed!\n\n$ERROR" + fi + + TRACE_FUNC } generate_checksums() { - TRACE "Under oem-factory-reset:generate_checksums" - - # ensure /boot mounted - if ! grep -q /boot /proc/mounts; then - mount -o rw /boot || whiptail_error_die "Unable to mount /boot" - else - mount -o remount,rw /boot || whiptail_error_die "Unable to mount /boot" - fi - - #Check if previous LUKS TPM Disk Unlock Key was set - if [ -e /boot/kexec_key_devices.txt ]; then - TPM_DISK_ENCRYPTION_KEY_SET=1 - fi - - # clear any existing checksums/signatures - rm /boot/kexec* 2>/dev/null - - # create Heads TPM counter - if [ "$CONFIG_TPM" = "y" ]; then - if [ "$CONFIG_IGNORE_ROLLBACK" != "y" ]; then - tpmr counter_create \ - -pwdc '' \ - -la -3135106223 | - tee /tmp/counter || - whiptail_error_die "Unable to create TPM counter" - TPM_COUNTER=$(cut -d: -f1 /dev/null 2>&1 || - whiptail_error_die "Unable to increment tpm counter" - - # create rollback file - sha256sum /tmp/counter-$TPM_COUNTER >/boot/kexec_rollback.txt 2>/dev/null || - whiptail_error_die "Unable to create rollback file" - else - ## needs to exist for initial call to unseal-hotp - echo "0" >/boot/kexec_hotp_counter - fi - fi - - # set default boot option only if no LUKS TPM Disk Unlock Key previously set - if [ -z "$TPM_DISK_ENCRYPTION_KEY_SET" ]; then - set_default_boot_option - fi - - DEBUG "Generating hashes" - ( - set -e -o pipefail - cd /boot - find ./ -type f ! -path './kexec*' -print0 | - xargs -0 sha256sum >/boot/kexec_hashes.txt 2>/dev/null - print_tree >/boot/kexec_tree.txt - ) - [ $? -eq 0 ] || whiptail_error_die "Error generating kexec hashes" - - param_files=$(find /boot/kexec*.txt) - [ -z "$param_files" ] && - whiptail_error_die "No kexec parameter files to sign" - - if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" -a "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "n" ]; then - #The local keyring used to generate in memory subkeys is still valid since no key has been moved to smartcard - #Local keyring passwd is ADMIN_PIN. We need to set USER_PIN to ADMIN_PIN to be able to sign next in this boot session - DEBUG "Setting GPG User PIN to GPG Admin PIN so local keyring can be used to detach-sign kexec files next" - USER_PIN=$ADMIN_PIN - fi - - DEBUG "Detach-signing boot files under kexec.sig: ${param_files}" - if sha256sum $param_files 2>/dev/null | gpg \ - --pinentry-mode loopback \ - --passphrase "${USER_PIN}" \ - --digest-algo SHA256 \ - --detach-sign \ - -a \ - >/boot/kexec.sig 2>/tmp/error; then - # successful - update the validated params - if ! check_config /boot >/dev/null 2>/tmp/error; then - cat /tmp/error - ret=1 - else - ret=0 - fi - else - cat /tmp/error - ret=1 - fi - - # done writing to /boot, switch back to RO - mount -o ro,remount /boot - - if [ $ret = 1 ]; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Error signing kexec boot files:\n\n$ERROR" - fi - - TRACE "oem-factory-reset:generate_checksums done" + TRACE_FUNC + + # ensure /boot mounted + if ! grep -q /boot /proc/mounts; then + mount -o rw /boot || whiptail_error_die "Unable to mount /boot" + else + mount -o remount,rw /boot || whiptail_error_die "Unable to mount /boot" + fi + + #Check if previous LUKS TPM Disk Unlock Key was set + if [ -e /boot/kexec_key_devices.txt ]; then + TPM_DISK_ENCRYPTION_KEY_SET=1 + fi + + # clear any existing checksums/signatures + rm /boot/kexec* 2>/dev/null + + # create Heads TPM counter + if [ "$CONFIG_TPM" = "y" ]; then + if [ "$CONFIG_IGNORE_ROLLBACK" != "y" ]; then + tpmr counter_create \ + -pwdc '' \ + -la -3135106223 | + tee /tmp/counter >/dev/null 2>&1 || + whiptail_error_die "Unable to create TPM counter" + TPM_COUNTER=$(cut -d: -f1 /dev/null 2>&1 || + whiptail_error_die "Unable to increment tpm counter" + + # create rollback file + sha256sum /tmp/counter-$TPM_COUNTER >/boot/kexec_rollback.txt 2>/dev/null || + whiptail_error_die "Unable to create rollback file" + else + ## needs to exist for initial call to unseal-hotp + echo "0" >/boot/kexec_hotp_counter + fi + fi + + # set default boot option only if no LUKS TPM Disk Unlock Key previously set + if [ -z "$TPM_DISK_ENCRYPTION_KEY_SET" ]; then + set_default_boot_option + fi + + DEBUG "Generating hashes" + ( + set -e -o pipefail + cd /boot + find ./ -type f ! -path './kexec*' -print0 | + xargs -0 sha256sum >/boot/kexec_hashes.txt 2>/dev/null + print_tree >/boot/kexec_tree.txt + ) + [ $? -eq 0 ] || whiptail_error_die "Error generating kexec hashes" + + param_files=$(find /boot/kexec*.txt) + [ -z "$param_files" ] && + whiptail_error_die "No kexec parameter files to sign" + + if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" -a "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "n" ]; then + #The local keyring used to generate in memory subkeys is still valid since no key has been moved to smartcard + #Local keyring passwd is ADMIN_PIN. We need to set USER_PIN to ADMIN_PIN to be able to sign next in this boot session + DEBUG "Setting GPG User PIN to GPG Admin PIN so local keyring can be used to detach-sign kexec files next" + USER_PIN=$ADMIN_PIN + fi + + DEBUG "Detach-signing boot files under kexec.sig: ${param_files}" + + if sha256sum $param_files 2>/dev/null | gpg \ + --pinentry-mode loopback \ + --passphrase-file <(echo -n "$USER_PIN") \ + --digest-algo SHA256 \ + --detach-sign \ + -a \ + >/boot/kexec.sig 2>/tmp/error; then + # successful - update the validated params + if ! check_config /boot >/dev/null 2>/tmp/error; then + cat /tmp/error + ret=1 + else + ret=0 + fi + else + cat /tmp/error + ret=1 + fi + + # done writing to /boot, switch back to RO + mount -o ro,remount /boot + + if [ $ret = 1 ]; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Error signing kexec boot files:\n\n$ERROR" + fi + + TRACE_FUNC } set_default_boot_option() { - TRACE "Under oem-factory-reset:set_default_boot_option" - - option_file="/tmp/kexec_options.txt" - tmp_menu_file="/tmp/kexec/kexec_menu.txt" - hash_file="/boot/kexec_default_hashes.txt" - - mkdir -p /tmp/kexec/ - rm $option_file 2>/dev/null - # parse boot options from grub.cfg - for i in $(find /boot -name "grub.cfg"); do - kexec-parse-boot "/boot" "$i" >>$option_file - done - # FC29/30+ may use BLS format grub config files - # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault - # only parse these if $option_file is still empty - if [ ! -s $option_file ] && [ -d "/boot/loader/entries" ]; then - for i in $(find /boot -name "grub.cfg"); do - kexec-parse-bls "/boot" "$i" "/boot/loader/entries" >>$option_file - done - fi - [ ! -s $option_file ] && - whiptail_error_die "Failed to parse any boot options" - - # sort boot options - sort -r $option_file | uniq >$tmp_menu_file - - ## save first option as default - entry=$(head -n 1 $tmp_menu_file | tail -1) - - # clear existing default configs - rm "/boot/kexec_default.*.txt" 2>/dev/null - - # get correct index for entry - index=$(grep -n "$entry" $option_file | cut -f1 -d ':') - - # write new config - echo "$entry" >/boot/kexec_default.$index.txt - - # validate boot option - (cd /boot && /bin/kexec-boot -b "/boot" -e "$entry" -f | - xargs sha256sum >$hash_file 2>/dev/null) || - whiptail_error_die "Failed to create hashes of boot files" - - TRACE "oem-factory-reset:set_default_boot_option done" + TRACE_FUNC + + option_file="/tmp/kexec_options.txt" + tmp_menu_file="/tmp/kexec/kexec_menu.txt" + hash_file="/boot/kexec_default_hashes.txt" + + mkdir -p /tmp/kexec/ + rm $option_file 2>/dev/null + # parse boot options from grub.cfg + for i in $(find /boot -name "grub.cfg"); do + kexec-parse-boot "/boot" "$i" >>$option_file + done + # FC29/30+ may use BLS format grub config files + # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault + # only parse these if $option_file is still empty + if [ ! -s $option_file ] && [ -d "/boot/loader/entries" ]; then + for i in $(find /boot -name "grub.cfg"); do + kexec-parse-bls "/boot" "$i" "/boot/loader/entries" >>$option_file + done + fi + [ ! -s $option_file ] && + whiptail_error_die "Failed to parse any boot options" + + # sort boot options + sort -r $option_file | uniq >$tmp_menu_file + + ## save first option as default + entry=$(head -n 1 $tmp_menu_file | tail -1) + + # clear existing default configs + rm "/boot/kexec_default.*.txt" 2>/dev/null + + # get correct index for entry + index=$(grep -n "$entry" $option_file | cut -f1 -d ':') + + # write new config + echo "$entry" >/boot/kexec_default.$index.txt + + # validate boot option + (cd /boot && /bin/kexec-boot -b "/boot" -e "$entry" -f | + xargs sha256sum >$hash_file 2>/dev/null) || + whiptail_error_die "Failed to create hashes of boot files" + + TRACE_FUNC } report_integrity_measurements() { - TRACE "Under oem-factory-reset:report_integrity_measurements" - - #check for GPG key in keyring - GPG_KEY_COUNT=$(gpg -k 2>/dev/null | wc -l) - if [ "$GPG_KEY_COUNT" -ne 0 ]; then - # Check and report TOTP - # update the TOTP code every thirty seconds - date=$(date "+%Y-%m-%d %H:%M:%S %Z") - seconds=$(date "+%s") - half=$(expr \( "$seconds" % 60 \) / 30) - if [ "$CONFIG_TPM" != "y" ]; then - TOTP="NO TPM" - elif [ "$half" != "$last_half" ]; then - last_half=$half - TOTP=$(unseal-totp) >/dev/null 2>&1 - fi - - # Check and report on HOTP status - if [ -x /bin/hotp_verification ]; then - HOTP=$(unseal-hotp) >/dev/null 2>&1 - enable_usb - if ! hotp_verification info >/dev/null 2>&1; then - whiptail $CONFIG_WARNING_BG_COLOR --title 'WARNING: Please insert your HOTP enabled USB Security Dongle' --msgbox "Your HOTP enabled USB Security Dongle was not detected.\n\nPlease remove it and insert it again." 0 80 - fi - # Don't output HOTP codes to screen, so as to make replay attacks harder - hotp_verification check $HOTP - case "$?" in - 0) - HOTP="Success" - ;; - 4) - HOTP="Invalid code" - MAIN_MENU_BG_COLOR=$CONFIG_ERROR_BG_COLOR - ;; - *) - HOTP="Error checking code, Insert USB Security Dongle and retry" - MAIN_MENU_BG_COLOR=$CONFIG_WARNING_BG_COLOR - ;; - esac - else - HOTP='N/A' - fi - # Check for detached signed digest and report on /boot integrity status - check_config /boot force - TMP_HASH_FILE="/tmp/kexec/kexec_hashes.txt" - - if (cd /boot && sha256sum -c "$TMP_HASH_FILE" >/tmp/hash_output); then - HASH="OK" - else - HASH="ALTERED" - fi - - #Show results - whiptail $MAIN_MENU_BG_COLOR --title "Measured Integrity Report" --msgbox "$date\nTOTP: $TOTP | HOTP: $HOTP\n/BOOT INTEGRITY: $HASH\n\nPress OK to continue or Ctrl+Alt+Delete to reboot" 0 80 - fi - - TRACE "oem-factory-reset:report_integrity_measurements done" + TRACE_FUNC + + #check for GPG key in keyring + GPG_KEY_COUNT=$(gpg -k 2>/dev/null | wc -l) + if [ "$GPG_KEY_COUNT" -ne 0 ]; then + # Check and report TOTP + # update the TOTP code every thirty seconds + date=$(date "+%Y-%m-%d %H:%M:%S %Z") + seconds=$(date "+%s") + half=$(expr \( "$seconds" % 60 \) / 30) + if [ "$CONFIG_TPM" != "y" ]; then + TOTP="NO TPM" + elif [ "$half" != "$last_half" ]; then + last_half=$half + TOTP=$(unseal-totp) >/dev/null 2>&1 + fi + + # Check and report on HOTP status + if [ -x /bin/hotp_verification ]; then + HOTP="Unverified" + enable_usb + for attempt in 1 2 3; do + if ! hotp_verification info >/dev/null 2>&1; then + whiptail_warning --title "WARNING: Please insert your HOTP enabled USB Security dongle (Attempt $attempt/3)" --msgbox "Your HOTP enabled USB Security dongle was not detected.\n\nPlease remove it and insert it again." 0 80 + else + break + fi + done + + if [ $attempt -eq 3 ]; then + die "No HOTP enabled USB Security dongle detected. Please disable 'CONFIG_HOTPKEY' in the board config and rebuild." + fi + + # Don't output HOTP codes to screen, so as to make replay attacks harder + HOTP=$(unseal-hotp) >/dev/null 2>&1 + hotp_verification check $HOTP + case "$?" in + 0) + HOTP="Success" + ;; + 4) + HOTP="Invalid code" + BG_COLOR_MAIN_MENU="error" + ;; + *) + HOTP="Error checking code, Insert USB Security dongle and retry" + BG_COLOR_MAIN_MENU="warning" + ;; + esac + else + HOTP='N/A' + fi + # Check for detached signed digest and report on /boot integrity status + check_config /boot force + TMP_HASH_FILE="/tmp/kexec/kexec_hashes.txt" + + if (cd /boot && sha256sum -c "$TMP_HASH_FILE" >/tmp/hash_output); then + HASH="OK" + else + HASH="ALTERED" + fi + + #Show results + whiptail_type $BG_COLOR_MAIN_MENU --title "Measured Integrity Report" --msgbox "$date\nTOTP: $TOTP | HOTP: $HOTP\n/BOOT INTEGRITY: $HASH\n\nPress OK to continue or Ctrl+Alt+Delete to reboot" 0 80 + fi + + TRACE_FUNC } usb_security_token_capabilities_check() { - TRACE "Under /bin/oem-factory-reset:usb_security_token_capabilities_check" - - enable_usb - # ... first set board config preference - if [ -n "$CONFIG_GPG_ALGO" ]; then - GPG_ALGO=$CONFIG_GPG_ALGO - DEBUG "Setting GPG_ALGO to (board-)configured: $CONFIG_GPG_ALGO" - fi - # ... overwrite with usb-token capability - if lsusb | grep -q "20a0:42b2"; then - GPG_ALGO="p256" - DEBUG "Nitrokey 3 detected: Setting GPG_ALGO to: $GPG_ALGO" - fi + TRACE_FUNC + + echo -e "\nChecking for USB Security dongle...\n" + + enable_usb + # ... first set board config preference + if [ -n "$CONFIG_GPG_ALGO" ]; then + GPG_ALGO=$CONFIG_GPG_ALGO + DEBUG "Setting GPG_ALGO to (board-)configured: $CONFIG_GPG_ALGO" + fi + # ... overwrite with usb-token capability + if lsusb | grep -q "20a0:42b2"; then + GPG_ALGO="p256" + DEBUG "Nitrokey 3 detected: Setting GPG_ALGO to: $GPG_ALGO" + fi + + #TODO: put everything related to USB Security dongle here } ## main script start # check for args -if [ "$1" != "" ]; then - title_text=$1 -else - title_text="OEM Factory Reset / Re-Ownership" +if [ -z "$title_text" ]; then + title_text="OEM Factory Reset / Re-Ownership" fi if [ "$2" != "" ]; then - bg_color=$2 + bg_color=$2 else - bg_color="" + bg_color="" fi # show warning prompt if [ "$CONFIG_TPM" = "y" ]; then - TPM_STR=" * ERASE the TPM and own it with a password\n" + TPM_STR=" * ERASE the TPM and own it with a password\n" else - TPM_STR="" + TPM_STR="" fi -if ! whiptail --yesno " +if ! whiptail_warning --yesno " This operation will automatically:\n $TPM_STR * ERASE any keys or passwords on the GPG smart card,\n @@ -867,8 +967,8 @@ $TPM_STR * Sign all of the files in /boot with the new GPG key\n\n It requires that you already have an OS installed on a\n dedicated /boot partition. Do you wish to continue?" \ - $HEIGHT $WIDTH $CONTINUE $CANCEL $CLEAR $bg_color --title "$title_text"; then - exit 1 + $HEIGHT $WIDTH $CONTINUE $CANCEL $CLEAR --title "$title_text"; then + exit 1 fi #Make sure /boot is mounted if board config defines default @@ -880,194 +980,203 @@ report_integrity_measurements clear #Prompt user for use of default configuration options +TRACE_FUNC echo -e -n "Would you like to use default configuration options?\nIf N, you will be prompted for each option [Y/n]: " read -n 1 use_defaults if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then - #Give general guidance to user on how to answer prompts - echo - echo "****************************************************" - echo "**** Factory Reset / Re-Ownership Questionnaire ****" - echo "****************************************************" - echo "The following questionnaire will help you configure the security components of your system." - echo "Each prompt requires a single letter answer: eg. (Y/n)." - echo -e "If you don't know what to answer, pressing Enter will select the default answer for that prompt: eg. Y, above.\n" - - # Re-ownership of encrypted disk key, content and passphrase - echo -e -n "\n\nWould you like to change the current LUKS Disk Recovery Key passphrase?\n (Highly recommended if you didn't install the Operating System yourself, so that past configured passphrase would not permit to access content.\n Note that without re-encrypting disk, a backed up header could be restored to access encrypted content with old passphrase) [y/N]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "y" \ - -o "$prompt_output" == "Y" ]; then - luks_new_Disk_Recovery_Key_passphrase_desired=1 - echo -e "\n" - fi - - echo -e -n "Would you like to re-encrypt LUKS encrypted container and generate new LUKS Disk Recovery Key?\n (Highly recommended if you didn't install the operating system yourself: this would prevent any LUKS backed up header to be restored to access encrypted data) [y/N]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "y" \ - -o "$prompt_output" == "Y" ]; then - test_luks_current_disk_recovery_key_passphrase - luks_new_Disk_Recovery_Key_desired=1 - echo -e "\n" - fi - - #Prompt to ask if user wants to generate GPG key material in memory or on smartcard - echo -e -n "Would you like to format an encrypted USB Thumb drive to store GPG key material?\n (Required to enable GPG authentication) [y/N]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "y" \ - -o "$prompt_output" == "Y" ] \ - ; then - GPG_GEN_KEY_IN_MEMORY="y" - echo " ++++ Master key and subkeys will be generated in memory, backed up to dedicated LUKS container +++" - echo -e -n "Would you like in-memory generated subkeys to be copied to USB Security Dongle's smartcard?\n (Highly recommended so the smartcard is used on daily basis and backup is kept safe, but not required) [Y/n]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "n" \ - -o "$prompt_output" == "N" ]; then - warn "Subkeys will NOT be copied to USB Security Dongle's smartcard" - warn "Your GPG key material backup thumb drive should be cloned to a second thumb drive for redundancy for production environements" - GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD="n" - else - echo "++++ Subkeys will be copied to USB Security Dongle's smartcard ++++" - warn "Please keep your GPG key material backup thumb drive safe" - GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD="y" - fi - else - echo "GPG key material will be generated on USB Security Dongle's smartcard without backup" - GPG_GEN_KEY_IN_MEMORY="n" - GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD="n" - fi - - # Dynamic messages to be given to user in terms of security components that will be applied - # based on previous answers - CUSTOM_PASS_AFFECTED_COMPONENTS="\n" - # Adapt message to be given to user in terms of security components that will be applied. - if [ -n "$luks_new_Disk_Recovery_Key_passphrase_desired" -o -n "$luks_new_Disk_Recovery_Key_passphrase" ]; then - CUSTOM_PASS_AFFECTED_COMPONENTS+="LUKS Disk Recovery Key passphrase\n" - fi - if [ "$CONFIG_TPM" = "y" ]; then - CUSTOM_PASS_AFFECTED_COMPONENTS+="TPM Owner Password\n" - fi - if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then - CUSTOM_PASS_AFFECTED_COMPONENTS+="GPG Key material backup passphrase (Same as GPG Admin PIN)\n" - fi - CUSTOM_PASS_AFFECTED_COMPONENTS+="GPG Admin PIN\n" - # Only show GPG User PIN as affected component if GPG_GEN_KEY_IN_MEMORY not requested or GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD is - if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then - CUSTOM_PASS_AFFECTED_COMPONENTS+="GPG User PIN\n" - fi - - # Inform user of security components affected for the following prompts - echo - echo -e "The following Security Components will be configured with defaults or further chosen PINs/passwords: + #Give general guidance to user on how to answer prompts + echo + echo "****************************************************" + echo "**** Factory Reset / Re-Ownership Questionnaire ****" + echo "****************************************************" + echo "The following questionnaire will help you configure the security components of your system." + echo "Each prompt requires a single letter answer: eg. (Y/n)." + echo -e "If you don't know what to answer, pressing Enter will select the default answer for that prompt: eg. Y, above.\n" + + # Re-ownership of LUKS encrypted Disk: key, content and passphrase + echo -e -n "\n\nWould you like to change the current LUKS Disk Recovery Key passphrase?\n (Highly recommended if you didn't install the Operating System yourself, so that past configured passphrase would not permit to access content.\n Note that without re-encrypting disk, a backed up header could be restored to access encrypted content with old passphrase) [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" \ + -o "$prompt_output" == "Y" ]; then + luks_new_Disk_Recovery_Key_passphrase_desired=1 + echo -e "\n" + fi + + echo -e -n "Would you like to re-encrypt LUKS encrypted container and generate new LUKS Disk Recovery Key?\n (Highly recommended if you didn't install the operating system yourself: this would prevent any LUKS backed up header to be restored to access encrypted data) [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" \ + -o "$prompt_output" == "Y" ]; then + TRACE_FUNC + test_luks_current_disk_recovery_key_passphrase + luks_new_Disk_Recovery_Key_desired=1 + echo -e "\n" + fi + + #Prompt to ask if user wants to generate GPG key material in memory or on smartcard + echo -e -n "Would you like to format an encrypted USB Thumb drive to store GPG key material?\n (Required to enable GPG authentication) [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" \ + -o "$prompt_output" == "Y" ] \ + ; then + GPG_GEN_KEY_IN_MEMORY="y" + echo " ++++ Master key and subkeys will be generated in memory, backed up to dedicated LUKS container +++" + echo -e -n "Would you like in-memory generated subkeys to be copied to USB Security dongle's OpenPGP smartcard?\n (Highly recommended so the smartcard is used on daily basis and backup is kept safe, but not required) [Y/n]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "n" \ + -o "$prompt_output" == "N" ]; then + warn "Subkeys will NOT be copied to USB Security dongle's OpenPGP smartcard" + warn "Your GPG key material backup thumb drive should be cloned to a second thumb drive for redundancy for production environements" + GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD="n" + else + echo "++++ Subkeys will be copied to USB Security dongle's OpenPGP smartcard ++++" + warn "Please keep your GPG key material backup thumb drive safe" + GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD="y" + fi + else + echo "GPG key material will be generated on USB Security dongle's OpenPGP smartcard without backup" + GPG_GEN_KEY_IN_MEMORY="n" + GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD="n" + fi + + # Dynamic messages to be given to user in terms of security components that will be applied + # based on previous answers + CUSTOM_PASS_AFFECTED_COMPONENTS="\n" + # Adapt message to be given to user in terms of security components that will be applied. + if [ -n "$luks_new_Disk_Recovery_Key_passphrase_desired" -o -n "$luks_new_Disk_Recovery_Key_passphrase" ]; then + CUSTOM_PASS_AFFECTED_COMPONENTS+="LUKS Disk Recovery Key passphrase\n" + fi + if [ "$CONFIG_TPM" = "y" ]; then + CUSTOM_PASS_AFFECTED_COMPONENTS+="TPM Owner Password\n" + fi + if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then + CUSTOM_PASS_AFFECTED_COMPONENTS+="GPG Key material backup passphrase (Same as GPG Admin PIN)\n" + fi + CUSTOM_PASS_AFFECTED_COMPONENTS+="GPG Admin PIN\n" + # Only show GPG User PIN as affected component if GPG_GEN_KEY_IN_MEMORY not requested or GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD is + if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then + CUSTOM_PASS_AFFECTED_COMPONENTS+="GPG User PIN\n" + fi + + # Inform user of security components affected for the following prompts + echo + echo -e "The following Security Components will be configured with defaults or further chosen PINs/passwords: $CUSTOM_PASS_AFFECTED_COMPONENTS\n" - # Prompt to change default passwords - echo -e -n "Would you like to set a single custom password to all previously stated security components? [y/N]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "y" \ - -o "$prompt_output" == "Y" ]; then - echo -e "\nThe chosen custom password must be between 8 and $MAX_HOTP_GPG_PIN_LENGTH characters in length.\n" - echo - while [[ ${#CUSTOM_SINGLE_PASS} -lt 8 ]] || [[ ${#CUSTOM_SINGLE_PASS} -gt $MAX_HOTP_GPG_PIN_LENGTH ]]; do - echo -e -n "Enter the custom password: " - read CUSTOM_SINGLE_PASS - done - echo - TPM_PASS=${CUSTOM_SINGLE_PASS} - USER_PIN=${CUSTOM_SINGLE_PASS} - ADMIN_PIN=${CUSTOM_SINGLE_PASS} - - # Only set if user said desired - if [ -n "$luks_new_Disk_Recovery_Key_passphrase_desired" ]; then - luks_new_Disk_Recovery_Key_passphrase=${CUSTOM_SINGLE_PASS} - fi - else - echo -e -n "Would you like to set distinct PINs/passwords to configure previously stated security components? [y/N]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "y" \ - -o "$prompt_output" == "Y" ]; then - echo -e "\nThey must be each at least 8 characters in length.\n" - echo - if [ "$CONFIG_TPM" = "y" ]; then - while [[ ${#TPM_PASS} -lt 8 ]]; do - echo -e -n "Enter desired TPM Owner Password: " - read TPM_PASS - done - fi - while [[ ${#ADMIN_PIN} -lt 8 ]] || [[ ${#ADMIN_PIN} -gt $MAX_HOTP_GPG_PIN_LENGTH ]]; do - echo -e -n "\nThis PIN should be between 8 to $MAX_HOTP_GPG_PIN_LENGTH characters in length.\n" - echo -e -n "Enter desired GPG Admin PIN: " - read ADMIN_PIN - done - #USER PIN not required in case of GPG_GEN_KEY_IN_MEMORY not requested of if GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD is - # That is, if keys were NOT generated in memory (on smartcard only) or - # if keys were generated in memory but are to be moved from local keyring to smartcard - if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then - while [[ ${#USER_PIN} -lt 8 ]] || [[ ${#USER_PIN} -gt $MAX_HOTP_GPG_PIN_LENGTH ]]; do - echo -e -n "\nThis PIN should be between 8 to $MAX_HOTP_GPG_PIN_LENGTH characters in length.\n" - echo -e -n "Enter desired GPG User PIN: " - read USER_PIN - done - fi - echo - fi - fi - - if [ -n "$luks_new_Disk_Recovery_Key_passphrase_desired" -a -z "$luks_new_Disk_Recovery_Key_passphrase" ]; then - # We catch here if changing LUKS Disk Recovery Key passphrase was desired - # but yet undone. This is if not being covered by the single password - echo -e "\nEnter desired replacement for current LUKS Disk Recovery Key passphrase (At least 8 characters long):" - while [[ ${#luks_new_Disk_Recovery_Key_passphrase} -lt 8 ]]; do - { - read -r luks_new_Disk_Recovery_Key_passphrase - } - done - #We test that current LUKS Disk Recovery Key passphrase is known prior of going further - test_luks_current_disk_recovery_key_passphrase - echo -e "\n" - fi - - # Prompt to change default GnuPG key information - echo -e -n "Would you like to set custom user information for the GnuPG key? [y/N]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "y" \ - -o "$prompt_output" == "Y" ]; then - echo -e "\n\n" - echo -e "We will generate a GnuPG (PGP) keypair identifiable with the following text form:" - echo -e "Real Name (Comment) email@address.org" - - echo -e "\nEnter your Real Name (Optional):" - read -r GPG_USER_NAME - - echo -e "\nEnter your email@adress.org:" - read -r GPG_USER_MAIL - while ! $(expr "$GPG_USER_MAIL" : '.*@' >/dev/null); do - { - echo -e "\nEnter your email@address.org:" - read -r GPG_USER_MAIL - } - done - - echo -e "\nEnter Comment (Optional, to distinguish this key from others with same previous attributes. Must be smaller then 60 characters):" - read -r GPG_USER_COMMENT - while [[ ${#GPG_USER_COMMENT} -gt 60 ]]; do - { - echo -e "\nEnter Comment (Optional, to distinguish this key from others with same previous attributes. Must be smaller then 60 characters):" - read -r GPG_USER_COMMENT - } - done - fi - - if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then - select_thumb_drive_for_key_material - fi + # Prompt to change default passwords + echo -e -n "Would you like to set a single custom password to all previously stated security components? [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" \ + -o "$prompt_output" == "Y" ]; then + echo -e "\nThe chosen custom password must be between 8 and $MAX_HOTP_GPG_PIN_LENGTH characters in length." + while [[ ${#CUSTOM_SINGLE_PASS} -lt 8 ]] || [[ ${#CUSTOM_SINGLE_PASS} -gt $MAX_HOTP_GPG_PIN_LENGTH ]]; do + echo -e -n "Enter the custom password: " + read CUSTOM_SINGLE_PASS + done + echo + TPM_PASS=${CUSTOM_SINGLE_PASS} + USER_PIN=${CUSTOM_SINGLE_PASS} + ADMIN_PIN=${CUSTOM_SINGLE_PASS} + + # Only set if user said desired + if [ -n "$luks_new_Disk_Recovery_Key_passphrase_desired" ]; then + luks_new_Disk_Recovery_Key_passphrase=${CUSTOM_SINGLE_PASS} + fi + + # The user knows this password, we don't need to badger them to + # record it + MAKE_USER_RECORD_PASSPHRASES= + else + echo -e -n "Would you like to set distinct PINs/passwords to configure previously stated security components? [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" \ + -o "$prompt_output" == "Y" ]; then + echo -e "\nThe TPM Owner Password and Admin PIN must be at least 8, the User PIN at least 6 characters in length.\n" + echo + if [ "$CONFIG_TPM" = "y" ]; then + while [[ ${#TPM_PASS} -lt 8 ]]; do + echo -e -n "Enter desired TPM Owner Password: " + read TPM_PASS + done + fi + while [[ ${#ADMIN_PIN} -lt 6 ]] || [[ ${#ADMIN_PIN} -gt $MAX_HOTP_GPG_PIN_LENGTH ]]; do + echo -e -n "\nThis PIN should be between 6 to $MAX_HOTP_GPG_PIN_LENGTH characters in length.\n" + echo -e -n "Enter desired GPG Admin PIN: " + read ADMIN_PIN + done + #USER PIN not required in case of GPG_GEN_KEY_IN_MEMORY not requested of if GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD is + # That is, if keys were NOT generated in memory (on smartcard only) or + # if keys were generated in memory but are to be moved from local keyring to smartcard + if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then + while [[ ${#USER_PIN} -lt 6 ]] || [[ ${#USER_PIN} -gt $MAX_HOTP_GPG_PIN_LENGTH ]]; do + echo -e -n "\nThis PIN should be between 6 to $MAX_HOTP_GPG_PIN_LENGTH characters in length.\n" + echo -e -n "Enter desired GPG User PIN: " + read USER_PIN + done + fi + echo + # The user knows these passwords, we don't need to + # badger them to record them + MAKE_USER_RECORD_PASSPHRASES= + fi + fi + + if [ -n "$luks_new_Disk_Recovery_Key_passphrase_desired" -a -z "$luks_new_Disk_Recovery_Key_passphrase" ]; then + # We catch here if changing LUKS Disk Recovery Key passphrase was desired + # but yet undone. This is if not being covered by the single password + echo -e "\nEnter desired replacement for current LUKS Disk Recovery Key passphrase (At least 8 characters long):" + while [[ ${#luks_new_Disk_Recovery_Key_passphrase} -lt 8 ]]; do + { + read -r luks_new_Disk_Recovery_Key_passphrase + } + done + #We test that current LUKS Disk Recovery Key passphrase is known prior of going further + TRACE_FUNC + test_luks_current_disk_recovery_key_passphrase + echo -e "\n" + fi + + # Prompt to change default GnuPG key information + echo -e -n "Would you like to set custom user information for the GnuPG key? [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" \ + -o "$prompt_output" == "Y" ]; then + echo -e "\n\n" + echo -e "We will generate a GnuPG (PGP) keypair identifiable with the following text form:" + echo -e "Real Name (Comment) email@address.org" + + echo -e "\nEnter your Real Name (Optional):" + read -r GPG_USER_NAME + + echo -e "\nEnter your email@adress.org:" + read -r GPG_USER_MAIL + while ! $(expr "$GPG_USER_MAIL" : '.*@' >/dev/null); do + { + echo -e "\nEnter your email@address.org:" + read -r GPG_USER_MAIL + } + done + + echo -e "\nEnter Comment (Required: Use this to distinguish this key from others, e.g., its purpose or usage context. Must be 1-60 characters):" + while true; do + read -r GPG_USER_COMMENT + if [[ ${#GPG_USER_COMMENT} -ge 1 && ${#GPG_USER_COMMENT} -le 60 ]]; then + break + fi + echo -e "\nComment must be 1-60 characters long. Please try again:" + done + fi + + if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then + select_thumb_drive_for_key_material + fi fi # If nothing is stored in custom variables, we set them to their defaults @@ -1078,49 +1187,48 @@ if [ "$ADMIN_PIN" == "" ]; then ADMIN_PIN=${ADMIN_PIN_DEF}; fi ## sanity check the USB, GPG key, and boot device before proceeding further if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" ]; then - # Prompt to insert USB drive if desired - echo -e -n "\nWould you like to export your public key to an USB drive? [y/N]: " - read -n 1 prompt_output - echo - if [ "$prompt_output" == "y" \ - -o "$prompt_output" == "Y" ] \ - ; then - GPG_EXPORT=1 - # mount USB over /media only if not already mounted - if ! grep -q /media /proc/mounts; then - # mount USB in rw - if ! mount-usb --mode rw 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Unable to mount USB on /media:\n\n${ERROR}" - fi - else - #/media already mounted, make sure it is in r+w mode - if ! mount -o remount,rw /media 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Unable to remount in read+write USB on /media:\n\n${ERROR}" - fi - fi - else - GPG_EXPORT=0 - # needed for USB Security Dongle below and is ensured via mount-usb in case of GPG_EXPORT=1 - enable_usb - fi + # Prompt to insert USB drive if desired + echo -e -n "\nWould you like to export your public key to an USB drive? [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" \ + -o "$prompt_output" == "Y" ] \ + ; then + GPG_EXPORT=1 + # mount USB over /media only if not already mounted + if ! grep -q /media /proc/mounts; then + # mount USB in rw + if ! mount-usb --mode rw 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Unable to mount USB on /media:\n\n${ERROR}" + fi + else + #/media already mounted, make sure it is in r+w mode + if ! mount -o remount,rw /media 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Unable to remount in read+write USB on /media:\n\n${ERROR}" + fi + fi + else + GPG_EXPORT=0 + # needed for USB Security dongle below and is ensured via mount-usb in case of GPG_EXPORT=1 + enable_usb + fi fi -# ensure USB Security Dongle connected if GPG_GEN_KEY_IN_MEMORY=n or if GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD=y +# ensure USB Security dongle connected if GPG_GEN_KEY_IN_MEMORY=n or if GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD=y if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then - echo -e "\nChecking for USB Security Dongle...\n" - enable_usb - if ! gpg --card-status >/dev/null 2>&1; then - whiptail_error "Can't access USB Security Dongle; \nPlease remove and reinsert, then press Enter." - if ! gpg --card-status >/dev/null 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Unable to detect USB Security Dongle:\n\n${ERROR}" - fi - fi - - #Now that USB Security Dongle is detected, we can check its capabilities and limitations - usb_security_token_capabilities_check + enable_usb + if ! gpg --card-status >/dev/null 2>&1; then + local_whiptail_error "Can't access USB Security dongle; \nPlease remove and reinsert, then press Enter." + if ! gpg --card-status >/dev/null 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Unable to detect USB Security dongle:\n\n${ERROR}" + fi + fi + + #Now that USB Security dongle is detected, we can check its capabilities and limitations + usb_security_token_capabilities_check fi assert_signable @@ -1130,42 +1238,42 @@ assert_signable # clear gpg-agent cache so that next gpg calls doesn't have past keyring in memory killall gpg-agent >/dev/null 2>&1 || true # clear local keyring -rm -rf /.gnupg/* >/dev/null 2>&1 || true +rm -rf /.gnupg/*.kbx /.gnupg/*.gpg >/dev/null 2>&1 || true # detect and set /boot device echo -e "\nDetecting and setting boot device...\n" if ! detect_boot_device; then - SKIP_BOOT="y" + SKIP_BOOT="y" else - echo -e "Boot device set to $CONFIG_BOOT_DEV\n" + echo -e "Boot device set to $CONFIG_BOOT_DEV\n" fi # update configs if [[ "$SKIP_BOOT" == "n" ]]; then - replace_config /etc/config.user "CONFIG_BOOT_DEV" "$CONFIG_BOOT_DEV" - combine_configs + replace_config /etc/config.user "CONFIG_BOOT_DEV" "$CONFIG_BOOT_DEV" + combine_configs fi if [ -n "$luks_new_Disk_Recovery_Key_desired" -a -n "$luks_new_Disk_Recovery_Key_passphrase_desired" ]; then - #Reencryption of disk, LUKS Disk Recovery Key and LUKS Disk Recovery Key passphrase change is requested - luks_change_passphrase - luks_reencrypt + #Reencryption of disk, LUKS Disk Recovery Key and LUKS Disk Recovery Key passphrase change is requested + luks_reencrypt + luks_change_passphrase elif [ -n "$luks_new_Disk_Recovery_Key_desired" -a -z "$luks_new_Disk_Recovery_Key_passphrase_desired" ]; then - #Reencryption of disk was requested but not passphrase change - luks_reencrypt + #Reencryption of disk was requested but not passphrase change + luks_reencrypt elif [ -z "$luks_new_Disk_Recovery_Key_desired" -a -n "$luks_new_Disk_Recovery_Key_passphrase_desired" ]; then - #Passphrase change is requested without disk reencryption - luks_change_passphrase + #Passphrase change is requested without disk reencryption + luks_change_passphrase fi ## reset TPM and set password if [ "$CONFIG_TPM" = "y" ]; then - echo -e "\nResetting TPM...\n" - tpmr reset "$TPM_PASS" >/dev/null 2>/tmp/error + echo -e "\nResetting TPM...\n" + tpmr reset "$TPM_PASS" >/dev/null 2>/tmp/error fi if [ $? -ne 0 ]; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Error resetting TPM:\n\n${ERROR}" + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Error resetting TPM:\n\n${ERROR}" fi # clear local keyring @@ -1176,24 +1284,30 @@ gpg --list-keys >/dev/null 2>&1 #Generate keys in memory and copy to smartcard if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then - if [ "$GPG_ALGO" == "RSA" ]; then - # Generate GPG master key - generate_inmemory_RSA_master_and_subkeys - elif [ "$GPG_ALGO" == "p256" ]; then - generate_inmemory_p256_master_and_subkeys - else - die "Unsupported GPG_ALGO: $GPG_ALGO" - fi - wipe_thumb_drive_and_copy_gpg_key_material "$thumb_drive" "$thumb_drive_luks_percent" - set_user_config "CONFIG_HAVE_GPG_KEY_BACKUP" "y" - if [ "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then - keytocard_subkeys_to_smartcard - fi + # Reset Nitrokey 3 Secrets app before generating keys in memory + reset_nk3_secret_app + if [ "$GPG_ALGO" == "RSA" ]; then + # Generate GPG master key + generate_inmemory_RSA_master_and_subkeys + elif [ "$GPG_ALGO" == "p256" ]; then + generate_inmemory_p256_master_and_subkeys + else + die "Unsupported GPG_ALGO: $GPG_ALGO" + fi + wipe_thumb_drive_and_copy_gpg_key_material "$thumb_drive" "$thumb_drive_luks_percent" + set_user_config "CONFIG_HAVE_GPG_KEY_BACKUP" "y" + if [ "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then + keytocard_subkeys_to_smartcard + fi else - #Generate GPG key and subkeys on smartcard only - echo -e "\nResetting USB Security Dongle's GPG smartcard...\n(this will take around 3 minutes...)\n" - gpg_key_factory_reset - generate_OEM_gpg_keys + #enable usb storage + enable_usb + #Reset Nitrokey 3 secret app + reset_nk3_secret_app + #Generate GPG key and subkeys on smartcard only + echo -e "\nResetting USB Security dongle's OpenPGP smartcard with GPG...\n(this may take up to 3 minutes...)\n" + gpg_key_factory_reset + generate_OEM_gpg_keys fi # Obtain GPG key ID @@ -1203,131 +1317,152 @@ PUBKEY="/tmp/${GPG_GEN_KEY}.asc" # export pubkey to file if ! gpg --export --armor "$GPG_GEN_KEY" >"${PUBKEY}" 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "GPG Key gpg export to file failed!\n\n$ERROR" + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "GPG Key gpg export to file failed!\n\n$ERROR" fi #Applying custom GPG PINs to the smartcard if they were provided if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then - #Only apply smartcard PIN change if smartcard only or if keytocard op is expected next - if [ "${USER_PIN}" != "" -o "${ADMIN_PIN}" != "" ]; then - echo -e "\nChanging default GPG Admin PIN\n" - gpg_key_change_pin "3" "${ADMIN_PIN_DEF}" "${ADMIN_PIN}" - echo -e "\nChanging default GPG User PIN\n" - gpg_key_change_pin "1" "${USER_PIN_DEF}" "${USER_PIN}" - fi + #Only apply smartcard PIN change if smartcard only or if keytocard op is expected next + if [ "${USER_PIN}" != "${USER_PIN_DEF}" -o "${ADMIN_PIN}" != "${ADMIN_PIN_DEF}" ]; then + echo -e "\nChanging default GPG Admin PIN\n" + gpg_key_change_pin "3" "${ADMIN_PIN_DEF}" "${ADMIN_PIN}" + echo -e "\nChanging default GPG User PIN\n" + gpg_key_change_pin "1" "${USER_PIN_DEF}" "${USER_PIN}" + fi fi ## export pubkey to USB if [ "$GPG_EXPORT" != "0" ]; then - echo -e "\nExporting generated key to USB...\n" - # copy to USB - if ! cp "${PUBKEY}" "/media/${GPG_GEN_KEY}.asc" 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Key export error: unable to copy ${GPG_GEN_KEY}.asc to /media:\n\n$ERROR" - fi - mount -o remount,ro /media 2>/dev/null + echo -e "\nExporting generated key to USB...\n" + # copy to USB + if ! cp "${PUBKEY}" "/media/${GPG_GEN_KEY}.asc" 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Key export error: unable to copy ${GPG_GEN_KEY}.asc to /media:\n\n$ERROR" + fi + mount -o remount,ro /media 2>/dev/null fi # ensure key imported locally -if ! cat "$PUBKEY" | gpg --import >/dev/null 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Error importing GPG key:\n\n$ERROR" +if ! cat "$PUBKEY" | DO_WITH_DEBUG gpg --import >/dev/null 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Error importing GPG key:\n\n$ERROR" fi # update /.gnupg/trustdb.gpg to ultimately trust all user provided public keys if ! gpg --list-keys --fingerprint --with-colons 2>/dev/null | - sed -E -n -e 's/^fpr:::::::::([0-9A-F]+):$/\1:6:/p' | - gpg --import-ownertrust >/dev/null 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Error importing GPG ownertrust:\n\n$ERROR" + sed -E -n -e 's/^fpr:::::::::([0-9A-F]+):$/\1:6:/p' | + gpg --import-ownertrust >/dev/null 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Error importing GPG ownertrust:\n\n$ERROR" fi if ! gpg --update-trust >/dev/null 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Error updating GPG ownertrust:\n\n$ERROR" + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Error updating GPG ownertrust:\n\n$ERROR" fi # Do not attempt to flash the key to ROM if we are running in QEMU based on CONFIG_BOARD_NAME matching glob pattern containing qemu-* # We check for qemu-* instead of ^qemu- because CONFIG_BOARD_NAME could be renamed to UNTESTED-qemu-* in a probable future if [[ "$CONFIG_BOARD_NAME" == qemu-* ]]; then - warn "Skipping flash of GPG key to ROM because we are running in QEMU without internal flashing support." - warn "Please review boards/qemu*/qemu*.md documentation to extract public key from raw disk and inject at build time" - warn "Also review boards/qemu*/qemu*.config to tweak CONFIG_* options you might need to turn on/off manually at build time" + warn "Skipping flash of GPG key to ROM because we are running in QEMU without internal flashing support." + warn "Please review boards/qemu*/qemu*.md documentation to extract public key from raw disk and inject at build time" + warn "Also review boards/qemu*/qemu*.config to tweak CONFIG_* options you might need to turn on/off manually at build time" else - #We are not running in QEMU, so flash the key to ROM - - ## flash generated key to ROM - echo -e "\nReading current firmware...\n(this will take a minute or two)\n" - /bin/flash.sh -r /tmp/oem-setup.rom >/dev/null 2>/tmp/error - if [ ! -s /tmp/oem-setup.rom ]; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Error reading current firmware:\n\n$ERROR" - fi - - # clear any existing heads/gpg files from current firmware - for i in $(cbfs.sh -o /tmp/oem-setup.rom -l | grep -e "heads/"); do - cbfs.sh -o /tmp/oem-setup.rom -d "$i" - done - # add heads/gpg files to current firmware - - if [ -e /.gnupg/pubring.kbx ]; then - cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/.gnupg/pubring.kbx" -f /.gnupg/pubring.kbx - if [ -e /.gnupg/pubring.gpg ]; then - rm /.gnupg/pubring.gpg - fi - elif [ -e /.gnupg/pubring.gpg ]; then - cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/.gnupg/pubring.gpg" -f /.gnupg/pubring.gpg - fi - if [ -e /.gnupg/trustdb.gpg ]; then - cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/.gnupg/trustdb.gpg" -f /.gnupg/trustdb.gpg - fi - - # persist user config changes (boot device) - if [ -e /etc/config.user ]; then - cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/etc/config.user" -f /etc/config.user - fi - - # flash updated firmware image - echo -e "\nAdding generated key to current firmware and re-flashing...\n" - if ! /bin/flash.sh /tmp/oem-setup.rom 2>/tmp/error; then - ERROR=$(tail -n 1 /tmp/error | fold -s) - whiptail_error_die "Error flashing updated firmware image:\n\n$ERROR" - fi + #We are not running in QEMU, so flash the key to ROM + + ## flash generated key to ROM + echo -e "\nReading current firmware...\n(this may take up to two minutes...)\n" + /bin/flash.sh -r /tmp/oem-setup.rom >/dev/null 2>/tmp/error + if [ ! -s /tmp/oem-setup.rom ]; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Error reading current firmware:\n\n$ERROR" + fi + + # clear any existing heads/gpg files from current firmware + for i in $(cbfs.sh -o /tmp/oem-setup.rom -l | grep -e "heads/"); do + cbfs.sh -o /tmp/oem-setup.rom -d "$i" + done + # add heads/gpg files to current firmware + + if [ -e /.gnupg/pubring.kbx ]; then + cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/.gnupg/pubring.kbx" -f /.gnupg/pubring.kbx + if [ -e /.gnupg/pubring.gpg ]; then + rm /.gnupg/pubring.gpg + fi + elif [ -e /.gnupg/pubring.gpg ]; then + cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/.gnupg/pubring.gpg" -f /.gnupg/pubring.gpg + fi + if [ -e /.gnupg/trustdb.gpg ]; then + cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/.gnupg/trustdb.gpg" -f /.gnupg/trustdb.gpg + fi + + # persist user config changes (boot device) + if [ -e /etc/config.user ]; then + cbfs.sh -o /tmp/oem-setup.rom -a "heads/initrd/etc/config.user" -f /etc/config.user + fi + + # flash updated firmware image + echo -e "\nAdding generated key to current firmware and re-flashing...\n" + if ! /bin/flash.sh /tmp/oem-setup.rom 2>/tmp/error; then + ERROR=$(tail -n 1 /tmp/error | fold -s) + whiptail_error_die "Error flashing updated firmware image:\n\n$ERROR" + fi fi ## sign files in /boot and generate checksums if [[ "$SKIP_BOOT" == "n" ]]; then - echo -e "\nSigning boot files and generating checksums...\n" - generate_checksums + echo -e "\nUpdating checksums and signing all files in /boot...\n" + generate_checksums fi # passphrases set to be empty first -passphrases="\n" +passphrases="" # Prepare whiptail output of configured secrets if [ -n "$luks_new_Disk_Recovery_Key_passphrase" -o -n "$luks_new_Disk_Recovery_Key_passphrase_desired" ]; then - passphrases+="LUKS Disk Recovery Key passphrase: ${luks_new_Disk_Recovery_Key_passphrase}\n" + passphrases+="LUKS Disk Recovery Key passphrase: ${luks_new_Disk_Recovery_Key_passphrase}\n" fi if [ "$CONFIG_TPM" = "y" ]; then - passphrases+="TPM Owner Password: ${TPM_PASS}\n" + passphrases+="TPM Owner Password: ${TPM_PASS}\n" +fi + +#if nk3 detected, we add the NK3 Secre App PIN. Detect by product ID +if lsusb | grep -q "20a0:42b2"; then + passphrases+="Nitrokey 3 Secrets app PIN: ${ADMIN_PIN}\n" fi #GPG PINs output passphrases+="GPG Admin PIN: ${ADMIN_PIN}\n" #USER PIN was configured if GPG_GEN_KEY_IN_MEMORY is not active or if GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD is active if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD" = "y" ]; then - passphrases+="GPG User PIN: ${USER_PIN}\n" + passphrases+="GPG User PIN: ${USER_PIN}\n" fi #If user decided to generate keys in memory, we add the thumb drive passphrase if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then - passphrases+="GPG key material backup passphrase: ${ADMIN_PIN}\n" + passphrases+="GPG key material backup passphrase: ${ADMIN_PIN}\n" fi -## Show to user current configured secrets prior of rebooting -whiptail --msgbox " - $(echo -e "$passphrases" | fold -w $((WIDTH-5)))" \ - $HEIGHT $WIDTH --title "Configured secrets" +# Show configured secrets in whiptail and loop until user confirms qr code was scanned +while true; do + whiptail --msgbox "$(echo -e "$passphrases" | fold -w $((WIDTH - 5)))" \ + $HEIGHT $WIDTH --title "Configured secrets" + if [ "$MAKE_USER_RECORD_PASSPHRASES" != y ]; then + # Passwords were user-supplied or not complex, we do not need to + # badger the user to record them + break + fi + #Tell user to scan the QR code containing all configured secrets + echo -e "\nScan the QR code below to save the secrets to a secure location" + qrenc "$(echo -e "$passphrases")" + # Prompt user to confirm scanning of qrcode on console prompt not whiptail: y/n + echo -e -n "Please confirm you have scanned the QR code above and/or written down the secrets? [y/N]: " + read -n 1 prompt_output + echo + if [ "$prompt_output" == "y" -o "$prompt_output" == "Y" ]; then + break + fi +done ## all done -- reboot whiptail --msgbox " @@ -1335,7 +1470,7 @@ whiptail --msgbox " After rebooting, you will need to generate new TOTP/HOTP secrets\n when prompted in order to complete the setup process.\n\n Press Enter to reboot.\n" \ - $HEIGHT $WIDTH --title "OEM Factory Reset / Re-Ownership Complete" + $HEIGHT $WIDTH --title "OEM Factory Reset / Re-Ownership Complete" # Clean LUKS secrets luks_secrets_cleanup diff --git a/initrd/bin/oem-system-info-xx30 b/initrd/bin/oem-system-info-xx30 index 489a5d78d..41f57d278 100755 --- a/initrd/bin/oem-system-info-xx30 +++ b/initrd/bin/oem-system-info-xx30 @@ -1,58 +1,54 @@ #!/bin/bash # System Info -BOARD_NAME=${CONFIG_BOARD_NAME:-${CONFIG_BOARD}} +BOARD_NAME=${CONFIG_BOARD_NAME:-${CONFIG_BOARD}} MAIN_MENU_TITLE="${BOARD_NAME} | Extended System Information" -export BG_COLOR_MAIN_MENU="" +export BG_COLOR_MAIN_MENU="normal" . /etc/functions +. /etc/gui_functions . /etc/luks-functions . /tmp/config -TRACE "Under /bin/oem-system-info-xx30" - - battery_charge="$(print_battery_charge)" - battery_health="$(print_battery_health)" - if [ -n $battery_charge -a -n $battery_health ];then - battery_status="\nBattery charge: $battery_charge% Battery health: $battery_health%\n" - fi - - usb="$(lsusb)" - pci="$(lspci)" - - camera="None|Unknown" - if echo "$usb" |grep -s "04f2:b2db"; then camera="Yes"; fi #t430 - if echo "$usb" |grep -s "04f2:b2ea"; then camera="Yes"; fi #x230 - if echo "$usb" |grep -s "5986:02d2"; then camera="Yes"; fi #x230 - - - bluetooth="None|Unkown" - if echo "$usb" |grep -s "0a5c:21e6"; then bluetooth="BCM20702 Bluetooth 4.0"; fi - - wifi="None|Unkown" - if echo "$pci" |grep -s "8086:0085"; then wifi="Intel Centrino Advanced-N 6205"; fi - if echo "$pci" |grep -s "168c:0034"; then wifi="Qualcomm Atheros AR9462"; fi - if echo "$pci" |grep -s "168c:0030"; then wifi="Qualcomm Atheros AR93xx"; fi - - mouse="None|Uknown" - if grep -s "TouchPad" /sys/class/input/mouse*/device/name; then mouse="Synaptic TouchPad"; fi - - know_devices="$(echo -e "Camera: ${camera}\nBluetooth: ${bluetooth}\nWifi: ${wifi}\nMouse: ${mouse}")" - - echo -e "PCI USB" > /tmp/devices_usb_pci - for l in $(seq 16); do - row1="$(echo "$pci"|sed -n ${l}p|cut -d " " -f 5)" - row2="$(echo "$usb"|sed -n ${l}p|cut -d " " -f 6)" - row3="$(echo "$know_devices"|sed -n ${l}p)" - echo "${row1} | ${row2} ${row3}" >> /tmp/devices_usb_pci - done - - memtotal=$(cat /proc/meminfo | grep 'MemTotal' | tr -s ' ' | cut -f2 -d ' ') - memtotal=$((${memtotal} / 1024 / 1024 + 1)) - cpustr=$(cat /proc/cpuinfo | grep 'model name' | uniq | sed -r 's/\(R\)//;s/\(TM\)//;s/CPU //;s/model name.*: //') - kernel=$(uname -s -r) - - FB_OPTIONS="" - if whiptail --version |grep "fbwhiptail"; then FB_OPTIONS="--text-size 12"; fi - whiptail $BG_COLOR_MAIN_MENU $FB_OPTIONS --title 'System Info' \ - --msgbox "${BOARD_NAME}\nFW_VER: ${FW_VER}\nKernel: ${kernel}\nCPU: ${cpustr} RAM: ${memtotal} GB $battery_status\n$(fdisk -l | grep -e '/dev/sd.:' -e '/dev/nvme.*:' | sed 's/B,.*/B/')\n\n$(cat /tmp/devices_usb_pci)" 0 80 +TRACE_FUNC + +battery_status="$(print_battery_state)" + +usb="$(lsusb)" +pci="$(lspci)" + +camera="None|Unknown" +if echo "$usb" | grep -s "04f2:b2db"; then camera="Yes"; fi # t430 +if echo "$usb" | grep -s "04f2:b2ea"; then camera="Yes"; fi # x230 +if echo "$usb" | grep -s "5986:02d2"; then camera="Yes"; fi # x230 + +bluetooth="None|Unknown" +if echo "$usb" | grep -s "0a5c:21e6"; then bluetooth="BCM20702 Bluetooth 4.0"; fi + +wifi="None|Unknown" +if echo "$pci" | grep -s "8086:0085"; then wifi="Intel Centrino Advanced-N 6205"; fi +if echo "$pci" | grep -s "168c:0034"; then wifi="Qualcomm Atheros AR9462"; fi +if echo "$pci" | grep -s "168c:0030"; then wifi="Qualcomm Atheros AR93xx"; fi + +mouse="None|Unknown" +if grep -s "TouchPad" /sys/class/input/mouse*/device/name; then mouse="Synaptic TouchPad"; fi + +known_devices="$(echo -e "Camera: ${camera}\nBluetooth: ${bluetooth}\nWifi: ${wifi}\nMouse: ${mouse}")" + +echo -e "PCI USB" >/tmp/devices_usb_pci +for l in $(seq 16); do + row1="$(echo "$pci" | sed -n ${l}p | cut -d " " -f 5)" + row2="$(echo "$usb" | sed -n ${l}p | cut -d " " -f 6)" + row3="$(echo "$known_devices" | sed -n ${l}p)" + echo "${row1} | ${row2} ${row3}" >>/tmp/devices_usb_pci +done + +memtotal=$(cat /proc/meminfo | grep 'MemTotal' | tr -s ' ' | cut -f2 -d ' ') +memtotal=$((${memtotal} / 1024 / 1024 + 1)) +cpustr=$(cat /proc/cpuinfo | grep 'model name' | uniq | sed -r 's/\(R\)//;s/\(TM\)//;s/CPU //;s/model name.*: //') +kernel=$(uname -s -r) + +FB_OPTIONS="" +if whiptail --version | grep "fbwhiptail"; then FB_OPTIONS="--text-size 12"; fi +whiptail_type $BG_COLOR_MAIN_MENU $FB_OPTIONS --title 'System Info' \ + --msgbox "${BOARD_NAME}\nFW_VER: ${FW_VER}\nKernel: ${kernel}\nCPU: ${cpustr} RAM: ${memtotal} GB $battery_status\n$(fdisk -l | grep -e '/dev/sd.:' -e '/dev/nvme.*:' | sed 's/B,.*/B/')\n\n$(cat /tmp/devices_usb_pci)" 0 80 diff --git a/initrd/bin/poweroff b/initrd/bin/poweroff index a27da23b8..bbf0a7496 100755 --- a/initrd/bin/poweroff +++ b/initrd/bin/poweroff @@ -1,18 +1,13 @@ -#!/bin/ash -. /etc/ash_functions +#!/bin/bash +. /etc/functions -TRACE "Under /bin/poweroff" +TRACE_FUNC # Shut down TPM if [ "$CONFIG_TPM" = "y" ]; then tpmr shutdown fi -# Run special EC-based poweroff for Nitropad-Nxx -if [ "$CONFIG_BOARD" = "nitropad-nv41" ] || [ "$CONFIG_BOARD" = "nitropad-ns50" ]; then - /bin/nitropad-shutdown.sh -fi - # Sync all mounted filesystems echo s > /proc/sysrq-trigger diff --git a/initrd/bin/qubes-measure-luks b/initrd/bin/qubes-measure-luks index 0e3c7801d..fc6ef2227 100755 --- a/initrd/bin/qubes-measure-luks +++ b/initrd/bin/qubes-measure-luks @@ -3,7 +3,7 @@ # a PCR so that we can detect disk swap attacks. . /etc/functions -TRACE "Under /bin/qubes-measure-luks" +TRACE_FUNC DEBUG "Arguments passed to qubes-measure-luks: $@" # Measure the LUKS headers into PCR 6 @@ -19,6 +19,7 @@ sha256sum /tmp/lukshdr-* >/tmp/luksDump.txt || die "Unable to hash LUKS headers" DEBUG "Removing /tmp/lukshdr-*" rm /tmp/lukshdr-* -DEBUG "Extending TPM PCR 6 with hash of LUKS headers from /tmp/luksDump.txt" +TRACE_FUNC +INFO "TPM: Extending PCR[6] with hash of LUKS headers from /tmp/luksDump.txt" tpmr extend -ix 6 -if /tmp/luksDump.txt || die "Unable to extend PCR" diff --git a/initrd/bin/reboot b/initrd/bin/reboot index 26255f12c..ce7e6947d 100755 --- a/initrd/bin/reboot +++ b/initrd/bin/reboot @@ -1,7 +1,7 @@ -#!/bin/ash -. /etc/ash_functions +#!/bin/bash +. /etc/functions -TRACE "Under /bin/reboot" +TRACE_FUNC if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then #Generalize user prompt to continue reboot or go to recovery shell @@ -17,11 +17,6 @@ if [ "$CONFIG_TPM" = "y" ]; then tpmr shutdown fi -# Run special EC-based poweroff for Nitropad-Nxx -if [ "$CONFIG_BOARD" = "nitropad-nv41" ] || [ "$CONFIG_BOARD" = "nitropad-ns50" ]; then - /bin/nitropad-shutdown.sh -fi - # Sync all mounted filesystems echo s > /proc/sysrq-trigger diff --git a/initrd/bin/root-hashes-gui.sh b/initrd/bin/root-hashes-gui.sh index 94533bcb0..67881f554 100755 --- a/initrd/bin/root-hashes-gui.sh +++ b/initrd/bin/root-hashes-gui.sh @@ -14,7 +14,7 @@ export CONFIG_ROOT_DIRLIST_PRETTY=$(echo $CONFIG_ROOT_DIRLIST | sed -e 's/^/\//; update_root_checksums() { if ! detect_root_device; then - whiptail $BG_COLOR_ERROR --title 'ERROR: No Valid Root Disk Found' \ + whiptail_error --title 'ERROR: No Valid Root Disk Found' \ --msgbox "No Valid Root Disk Found" 0 80 die "No Valid Root Disk Found" fi @@ -23,7 +23,7 @@ update_root_checksums() { if ! grep -q /boot /proc/mounts ; then if ! mount -o rw /boot; then unmount_root_device - whiptail $BG_COLOR_ERROR --title 'ERROR: Unable to mount /boot' \ + whiptail_error --title 'ERROR: Unable to mount /boot' \ --msgbox "Unable to mount /boot" 0 80 die "Unable to mount /boot" fi @@ -32,7 +32,9 @@ update_root_checksums() { fi echo "+++ Calculating hashes for all files in $CONFIG_ROOT_DIRLIST_PRETTY " - cd $ROOT_MOUNT && find ${CONFIG_ROOT_DIRLIST} -type f ! -name '*kexec*' -print0 | xargs -0 sha256sum | tee ${HASH_FILE} + # Intentional wordsplit + # shellcheck disable=SC2086 + (cd "$ROOT_MOUNT" && find ${CONFIG_ROOT_DIRLIST} -type f ! -name '*kexec*' -print0 | xargs -0 sha256sum) >"${HASH_FILE}" # switch back to ro mode mount -o ro,remount /boot @@ -46,7 +48,7 @@ update_root_checksums() { } check_root_checksums() { if ! detect_root_device; then - whiptail $BG_COLOR_ERROR --title 'ERROR: No Valid Root Disk Found' \ + whiptail_error --title 'ERROR: No Valid Root Disk Found' \ --msgbox "No Valid Root Disk Found" 0 80 die "No Valid Root Disk Found" fi @@ -55,7 +57,7 @@ check_root_checksums() { if ! grep -q /boot /proc/mounts ; then if ! mount -o ro /boot; then unmount_root_device - whiptail $BG_COLOR_ERROR --title 'ERROR: Unable to mount /boot' \ + whiptail_error --title 'ERROR: Unable to mount /boot' \ --msgbox "Unable to mount /boot" 0 80 die "Unable to mount /boot" fi @@ -63,7 +65,7 @@ check_root_checksums() { # check that root hash file exists if [ ! -f ${HASH_FILE} ]; then - if (whiptail $BG_COLOR_WARNING --title 'WARNING: No Root Hash File Found' \ + if (whiptail_warning --title 'WARNING: No Root Hash File Found' \ --yesno "\nIf you just enabled root hash checking feature, \nthen you need to create the initial hash file. \nOtherwise, This could be caused by tampering. @@ -79,20 +81,20 @@ check_root_checksums() { echo "+++ Checking root hash file signature " if ! sha256sum `find /boot/kexec*.txt` | gpgv /boot/kexec.sig - > /tmp/hash_output; then ERROR=`cat /tmp/hash_output` - whiptail $BG_COLOR_ERROR --title 'ERROR: Signature Failure' \ + whiptail_error --title 'ERROR: Signature Failure' \ --msgbox "The signature check on hash files failed:\n${CHANGED_FILES}\nExiting to a recovery shell" 0 80 unmount_root_device die 'Invalid signature' fi echo "+++ Checking for new files in $CONFIG_ROOT_DIRLIST_PRETTY " - find ${CONFIG_ROOT_DIRLIST} -type f ! -name '*kexec*' | sort > /tmp/new_file_list + (cd "$ROOT_MOUNT" && find ${CONFIG_ROOT_DIRLIST} -type f ! -name '*kexec*') | sort > /tmp/new_file_list cut -d' ' -f3- ${HASH_FILE} | sort | diff -U0 - /tmp/new_file_list > /tmp/new_file_diff || new_files_found=y if [ "$new_files_found" == "y" ]; then grep -E -v '^[+-]{3}|[@]{2} ' /tmp/new_file_diff > /tmp/new_file_diff2 # strip any output that's not a file mv /tmp/new_file_diff2 /tmp/new_file_diff CHANGED_FILES_COUNT=$(wc -l /tmp/new_file_diff | cut -f1 -d ' ') - whiptail $BG_COLOR_ERROR --title 'ERROR: Files Added/Removed in Root ' \ + whiptail_error --title 'ERROR: Files Added/Removed in Root ' \ --msgbox "${CHANGED_FILES_COUNT} files were added/removed in root!\n\nHit OK to review the list of files.\n\nType \"q\" to exit the list and return to the menu." 0 80 echo "Type \"q\" to exit the list and return to the menu." >> /tmp/new_file_diff @@ -102,7 +104,7 @@ check_root_checksums() { fi echo "+++ Checking hashes for all files in $CONFIG_ROOT_DIRLIST_PRETTY (this might take a while) " - if cd $ROOT_MOUNT && sha256sum -c ${HASH_FILE} > /tmp/hash_output 2>/dev/null; then + if (cd $ROOT_MOUNT && sha256sum -c ${HASH_FILE} > /tmp/hash_output 2>/dev/null); then echo "+++ Verified root hashes " valid_hash='y' unmount_root_device @@ -129,7 +131,7 @@ check_root_checksums() { else CHANGED_FILES=$(grep -v 'OK$' /tmp/hash_output | cut -f1 -d ':' | tee -a /tmp/hash_output_mismatches) CHANGED_FILES_COUNT=$(wc -l /tmp/hash_output_mismatches | cut -f1 -d ' ') - whiptail $BG_COLOR_ERROR --title 'ERROR: Root Hash Mismatch' \ + whiptail_error --title 'ERROR: Root Hash Mismatch' \ --msgbox "${CHANGED_FILES_COUNT} files failed the verification process!\n\nHit OK to review the list of files.\n\nType \"q\" to exit the list and return to the menu." 0 80 unmount_root_device @@ -156,37 +158,220 @@ check_root_checksums() { fi fi } + +# Open an LVM volume group, then continue looking for more layers in the 'root' +# logical volume. +open_block_device_lvm() { + TRACE_FUNC + local VG="$1" + + if ! lvm vgchange -ay "$VG"; then + DEBUG "Can't open LVM VG: $VG" + return 1 + fi + + # Use the LV 'root'. This is the default name used by Qubes. There's no + # way to configure this at the moment. + if ! [ -e "/dev/mapper/$VG-root" ]; then + DEBUG "LVM volume group does not have 'root' logical volume" + return 1 + fi + + # Use the root LV now + open_block_device_layers "/dev/mapper/$VG-root" +} + +# Open a LUKS device, then continue looking for more layers. +open_block_device_luks() { + TRACE_FUNC + local DEVICE="$1" + local LUKSDEV + LUKSDEV="$(basename "$DEVICE")_crypt" + + # Open the LUKS device. This may prompt interactively for the passphrase, so + # hook it up to the console even if stdout/stdin have been redirected. + if ! cryptsetup open "$DEVICE" "$LUKSDEV"; then + DEBUG "Can't open LUKS volume: $DEVICE" + return 1 + fi + + open_block_device_layers "/dev/mapper/$LUKSDEV" +} + +# Open block device layers to access /root recursively. If another layer (LUKS +# or LVM) can be identified, open it and recurse into the new device. When all +# recognized layers are opened, print the final block device and exit +# successfully (open_root_device will try to mount it). +# +# This only fails if we can recognize another LUKS or LVM layer, but cannot open +# it. It succeeds otherwise, even if no layers are recognized, because we +# should try to mount the block device directly in that case. +open_block_device_layers() { + TRACE_FUNC + local DEVICE="$1" + local VG + + if ! [ -e "$DEVICE" ]; then + DEBUG "Block device doesn't exit: $DEVICE" + # This shouldn't really happen, we thought we opened the last layer + # successfully. The call stack reveals what LUKS/LVM2 layers have been + # opened so far. + DEBUG_STACK + return 1 + fi + + # Try to open a LUKS layer + if cryptsetup isLuks "$DEVICE" &>/dev/null; then + open_block_device_luks "$DEVICE" || return 1 + # Try to open an LVM layer + elif VG="$(find_lvm_vg_name "$DEVICE")"; then + open_block_device_lvm "$VG" || return 1 + else + # The given block device exists but is not any layer we understand. Stop + # opening layers and try to mount it. + echo "$DEVICE" + fi +} + +# Try to open a block device as /root. open_block_device_layers() is used to +# open LUKS and LVM layers before mounting the filesystem. +# +# This function does not clean up anything if it is unsuccessful. Use +# try_open_root_device() to also clean up when unsuccessful. +open_root_device_no_clean_up() { + TRACE_FUNC + local DEVICE="$1" + local FS_DEVICE + + # Open LUKS/LVM and get the name of the block device that should contain the + # filesystem. If there are no LUKS/LVM layers, FS_DEVICE is just DEVICE. + FS_DEVICE="$(open_block_device_layers "$DEVICE")" || return 1 + + # Mount the device + if ! mount -o ro "$FS_DEVICE" "$ROOT_MOUNT" &>/dev/null; then + DEBUG "Can't mount filesystem on $FS_DEVICE from $DEVICE" + return 1 + fi + + # The filesystem must have all of the directories configured. (Intentional + # word-split) + # shellcheck disable=SC2086 + if ! (cd "$ROOT_MOUNT" && ls -d $CONFIG_ROOT_DIRLIST &>/dev/null); then + DEBUG "Root filesystem on $DEVICE lacks one of the configured directories: $CONFIG_ROOT_DIRLIST" + return 1 + fi + + # Root is mounted now and the directories are present + return 0 +} + +# If an LVM VG is open, close any layers within it, then close the LVM VG. +close_block_device_lvm() { + TRACE_FUNC + local VG="$1" + + # We always use the LV 'root' currently + local LV="/dev/mapper/$VG-root" + if [ -e "$LV" ]; then + close_block_device_layers "$LV" + fi + + # The LVM VG might be open even if no 'root' LV exists, still try to close it. + lvm vgchange -an "$VG" || \ + DEBUG "Can't close LVM VG: $VG" +} + +# If a LUKS device is open, close any layers within the LUKS device, then close +# the LUKS device. +close_block_device_luks() { + TRACE_FUNC + local DEVICE="$1" + local LUKSDEV + LUKSDEV="$(basename "$DEVICE")_crypt" + + if [ -e "/dev/mapper/$LUKSDEV" ]; then + # Close inner layers before trying to close LUKS + close_block_device_layers "/dev/mapper/$LUKSDEV" + cryptsetup close "$LUKSDEV" || \ + DEBUG "Can't close LUKS volume: $LUKSDEV" + fi +} + +# Close the root device, including unmounting the filesystem and closing all +# layers. This can close a partially-opened device if an error occurs. +close_block_device_layers() { + TRACE_FUNC + local DEVICE="$1" + local VG + + if ! [ -e "$DEVICE" ]; then + DEBUG "Block device doesn't exit: $DEVICE" + # Like in open_root_device(), this shouldn't really happen, show the layers + # up to this point via the call stack. + DEBUG_STACK + return 1 + fi + + if cryptsetup isLuks "$DEVICE"; then + close_block_device_luks "$DEVICE" + elif VG="$(find_lvm_vg_name "$DEVICE")"; then + close_block_device_lvm "$VG" + fi + # Otherwise, we've handled all the layers we understood, there's nothing left + # to do. +} + +# Try to open the root device, and clean up if unsuccessful. +open_root_device() { + TRACE_FUNC + if ! open_root_device_no_clean_up "$1"; then + unmount_root_device + return 1 + fi + + return 0 +} + +# Close the root device, including unmounting the filesystem and closing all +# layers. This can close a partially-opened device if an error occurs. This +# never fails, if an error occurs it still tries to close anything it can. +close_root_device() { + TRACE_FUNC + local DEVICE="$1" + + # Unmount the filesystem if it is mounted. If it is not mounted, ignore the + # failure. If it is mounted but can't be unmounted, this will fail and we + # will fail to close any LUKS/LVM layers too. + umount "$ROOT_MOUNT" &>/dev/null || true + + close_block_device_layers "$DEVICE" || true +} + # detect and set /root device # mount /root if successful detect_root_device() { + TRACE_FUNC + echo "+++ Detecting root device " if [ ! -e $ROOT_MOUNT ]; then mkdir -p $ROOT_MOUNT fi - # unmount $ROOT_MOUNT to be safe - cd / && umount $ROOT_MOUNT 2>/dev/null + # Ensure nothing is opened/mounted + unmount_root_device # check $CONFIG_ROOT_DEV if set/valid - if [ -e "$CONFIG_ROOT_DEV" ]; then - if cryptsetup isLuks $CONFIG_ROOT_DEV >/dev/null 2>&1; then - if cryptsetup open $CONFIG_ROOT_DEV rootdisk; then - if mount -o ro /dev/mapper/rootdisk $ROOT_MOUNT >/dev/null 2>&1; then - if cd $ROOT_MOUNT && ls -d $CONFIG_ROOT_DIRLIST >/dev/null 2>&1; then # CONFIG_ROOT_DEV is valid device and contains an installed OS - return 0 - fi - fi - fi - fi + if [ -e "$CONFIG_ROOT_DEV" ] && open_root_device "$CONFIG_ROOT_DEV"; then + return 0 fi # generate list of possible boot devices - fdisk -l | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" > /tmp/disklist + fdisk -l 2>/dev/null | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" > /tmp/disklist # filter out extraneous options > /tmp_root_device_list - for i in `cat /tmp/disklist`; do + while IFS= read -r -u 10 i; do # remove block device from list if numeric partitions exist DEV_NUM_PARTITIONS=$((`ls -1 $i* | wc -l`-1)) if [ ${DEV_NUM_PARTITIONS} -eq 0 ]; then @@ -194,33 +379,25 @@ detect_root_device() else ls $i* | tail -${DEV_NUM_PARTITIONS} >> /tmp_root_device_list fi - done - - # iterate thru possible options and check for LUKS - for i in `cat /tmp_root_device_list`; do - if cryptsetup isLuks $i >/dev/null 2>&1; then - if cryptsetup open $i rootdisk; then - if mount -o ro /dev/mapper/rootdisk $ROOT_MOUNT >/dev/null 2>&1; then - if cd $ROOT_MOUNT && ls -d $CONFIG_ROOT_DIRLIST >/dev/null 2>&1; then - # CONFIG_ROOT_DEV is valid device and contains an installed OS - CONFIG_ROOT_DEV="$i" - return 0 - fi - fi - fi + done 10/dev/null - cryptsetup close rootdisk + [ -e "$CONFIG_ROOT_DEV" ] && close_root_device "$CONFIG_ROOT_DEV" } checkonly="n" @@ -254,7 +431,7 @@ while true; do if ! grep -q /boot /proc/mounts ; then if ! mount -o ro /boot; then unmount_root_device - whiptail $BG_COLOR_ERROR --title 'ERROR: Unable to mount /boot' \ + whiptail_error --title 'ERROR: Unable to mount /boot' \ --msgbox "Unable to mount /boot" 0 80 die "Unable to mount /boot" fi diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 1abbf8b11..6ef5319d5 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -1,48 +1,49 @@ #!/bin/bash -# Retrieve the sealed TOTP secret and initialize a USB Security Dongle with it +# Retrieve the sealed TOTP secret and initialize a USB Security dongle with it . /etc/functions +. /etc/gui_functions HOTP_SECRET="/tmp/secret/hotp.key" HOTP_COUNTER="/boot/kexec_hotp_counter" HOTP_KEY="/boot/kexec_hotp_key" -mount_boot() -{ - TRACE "Under /bin/seal-hotpkey:mount_boot" - # Mount local disk if it is not already mounted - if ! grep -q /boot /proc/mounts; then - if ! mount -o ro /boot; then - whiptail $BG_COLOR_ERROR --title 'ERROR' \ - --msgbox "Couldn't mount /boot.\n\nCheck the /boot device in configuration settings, or perform an OEM reset." 0 80 - return 1 - fi - fi +mount_boot() { + TRACE_FUNC + # Mount local disk if it is not already mounted + if ! grep -q /boot /proc/mounts; then + if ! mount -o ro /boot; then + whiptail_error --title 'ERROR' \ + --msgbox "Couldn't mount /boot.\n\nCheck the /boot device in configuration settings, or perform an OEM reset." 0 80 + return 1 + fi + fi } -TRACE "Under /bin/seal-hotpkey" +TRACE_FUNC -fatal_error() -{ - echo -e "\nERROR: ${1}; press Enter to continue." - read - die "$1" +fatal_error() { + echo -e "\nERROR: ${1}; press Enter to continue." + read + # get lsusb output for debugging + DEBUG "lsusb output: $(lsusb)" + die "$1" } # Use stored HOTP key branding (this might be useful after OEM reset) if [ -r /boot/kexec_hotp_key ]; then HOTPKEY_BRANDING="$(cat /boot/kexec_hotp_key)" else - HOTPKEY_BRANDING="HOTP USB Security Dongle" + HOTPKEY_BRANDING="HOTP USB Security dongle" fi if [ "$CONFIG_TPM" = "y" ]; then DEBUG "Sealing HOTP secret reuses TOTP sealed secret..." - tpmr unseal 4d47 0,1,2,3,4,7 312 "$HOTP_SECRET" \ - || fatal_error "Unable to unseal HOTP secret" + tpmr unseal 4d47 0,1,2,3,4,7 312 "$HOTP_SECRET" || + fatal_error "Unable to unseal HOTP secret" else # without a TPM, generate a secret based on the SHA-256 of the ROM - secret_from_rom_hash > "$HOTP_SECRET" || die "Reading ROM failed" + secret_from_rom_hash >"$HOTP_SECRET" || die "Reading ROM failed" fi # Store counter in file instead of TPM for now, as it conflicts with Heads @@ -64,25 +65,29 @@ mount_boot || exit 1 counter_value=1 enable_usb + +# Make sure no conflicting GPG related services are running, gpg-agent will respawn +killall gpg-agent scdaemon >/dev/null 2>&1 + # While making sure the key is inserted, capture the status so we can check how # many PIN attempts remain -if ! hotp_token_info="$(hotp_verification info)" ; then - echo -e "\nInsert your $HOTPKEY_BRANDING and press Enter to configure it" - read - if ! hotp_token_info="$(hotp_verification info)" ; then - # don't leak key on failure - shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null - fatal_error "Unable to find $HOTPKEY_BRANDING" - fi +if ! hotp_token_info="$(hotp_verification info)"; then + echo -e "\nInsert your $HOTPKEY_BRANDING and press Enter to configure it" + read + if ! hotp_token_info="$(hotp_verification info)"; then + # don't leak key on failure + shred -n 10 -z -u "$HOTP_SECRET" 2>/dev/null + fatal_error "Unable to find $HOTPKEY_BRANDING" + fi fi -# Set HOTP USB Security Dongle branding based on VID -if lsusb | grep -q "20a0:" ; then +# Set HOTP USB Security dongle branding based on VID +if lsusb | grep -q "20a0:"; then HOTPKEY_BRANDING="Nitrokey" -elif lsusb | grep -q "316d:" ; then +elif lsusb | grep -q "316d:"; then HOTPKEY_BRANDING="Librem Key" else - HOTPKEY_BRANDING="HOTP USB Security Dongle" + HOTPKEY_BRANDING="HOTP USB Security dongle" fi # Truncate the secret if it is longer than the maximum HOTP secret @@ -96,18 +101,26 @@ gpg_key_create_time="${gpg_key_create_time:-0}" DEBUG "Signature key was created at $(date -d "@$gpg_key_create_time")" now_date="$(date '+%s')" -# Get the number of admin PIN retry attempts remaining -awk_admin_counter_regex='/^\s*Card counters: Admin (\d),.*$/' -awk_get_admin_counter="$awk_admin_counter_regex"' { print gensub('"$awk_admin_counter_regex"', "\\1", "") }' -admin_pin_retries="$(echo "$hotp_token_info" | awk "$awk_get_admin_counter")" +# Get the number of HOTP related PIN retry attempts remaining +# if nk3 detected by lsusb, use different regex to get admin counter +if lsusb | grep -q "20a0:42b2"; then + # Nitrokey 3: Secrets app PIN counter: 8 + admin_pin_retries=$(echo "$hotp_token_info" | grep "Secrets app PIN counter:" | cut -d ':' -f 2 | tr -d ' ') + prompt_message="Secrets app" +else + # /dev/null 2>&1 + echo "Trying $prompt_message PIN ($admin_pin) to seal HOTP secret on $HOTPKEY_BRANDING..." + #if we deal with the nk3, say to the user that touch will be required + if lsusb | grep -q "20a0:42b2"; then + warn "Nitrokey 3 requires physical presence : touch the dongle when prompted" + echo + fi + #TODO: silence the output of hotp_initialize once https://github.com/Nitrokey/nitrokey-hotp-verification/issues/41 is fixed + #hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING" >/dev/null 2>&1 + hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING" admin_pin_status="$?" fi if [ "$admin_pin_status" -ne 0 ]; then - # prompt user for PIN and retry - echo "" - read -s -p "Enter your $HOTPKEY_BRANDING Admin PIN: " admin_pin - echo -e "\n" - - hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING" - if [ $? -ne 0 ]; then - echo -e "\n" - read -s -p "Error setting HOTP secret, re-enter Admin PIN and try again: " admin_pin - echo -e "\n" - if ! hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING" ; then - # don't leak key on failure - shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null - fatal_error "Setting HOTP secret failed" - fi - fi -else - # remind user to change admin password - echo -e "\nWARNING: default GPG admin PIN detected: please change this as soon as possible." + + # prompt user for PIN and retry + echo "" + read -s -p "Enter your $HOTPKEY_BRANDING $prompt_message PIN: " admin_pin + echo -e "\n" + + hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING" + if [ $? -ne 0 ]; then + echo -e "\n" + read -s -p "Error setting HOTP secret, re-enter $prompt_message PIN and try again: " admin_pin + echo -e "\n" + if ! hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING"; then + # don't leak key on failure + shred -n 10 -z -u "$HOTP_SECRET" 2>/dev/null + if [ "$HOTPKEY_BRANDING" == "Nitrokey" ]; then + fatal_error "Setting HOTP secret failed, to reset $prompt_message PIN, redo Re-Ownership procedure, use the Nitrokey App 2 or contact Nitrokey support" + else + fatal_error "Setting HOTP secret failed" + fi + fi + fi +else + # remind user to change admin password + warn "Default $prompt_message PIN detected. Please change this as soon as possible with Options > OEM Factory Reset / Re-Ownership" fi # HOTP key no longer needed -shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null +shred -n 10 -z -u "$HOTP_SECRET" 2>/dev/null # Make sure our counter is incremented ahead of the next check #increment_tpm_counter $counter > /dev/null \ @@ -155,13 +181,13 @@ shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null mount -o remount,rw /boot -counter_value=`expr $counter_value + 1` -echo $counter_value > $HOTP_COUNTER \ -|| fatal_error "Unable to create hotp counter file" +counter_value=$(expr $counter_value + 1) +echo $counter_value >$HOTP_COUNTER || + fatal_error "Unable to create hotp counter file" -# Store/overwrite HOTP USB Security Dongle branding found out beforehand -echo $HOTPKEY_BRANDING > $HOTP_KEY \ -|| die "Unable to store hotp key file" +# Store/overwrite HOTP USB Security dongle branding found out beforehand +echo $HOTPKEY_BRANDING >$HOTP_KEY || + die "Unable to store hotp key file" #sha256sum /tmp/counter-$counter > $HOTP_COUNTER \ #|| die "Unable to create hotp counter file" diff --git a/initrd/bin/seal-totp b/initrd/bin/seal-totp index ef418e334..3c593d697 100755 --- a/initrd/bin/seal-totp +++ b/initrd/bin/seal-totp @@ -7,7 +7,7 @@ . /etc/functions -TRACE "Under /bin/seal-totp" +TRACE_FUNC TPM_NVRAM_SPACE=4d47 @@ -46,6 +46,7 @@ DEBUG "Sealing TOTP neglecting PCR5 involvement (Dynamically loaded kernel modul # pcr 6 (drive LUKS header) is not measured at sealing/unsealing of totp DEBUG "Sealing TOTP without PCR6 involvement (LUKS header consistency is not firmware integrity attestation related)" # pcr 7 is containing measurements of user injected stuff in cbfs +DEBUG "Sealing TOTP with actual state of PCR7 (User injected stuff in cbfs)" tpmr pcrread -a 7 "$pcrf" #Make sure we clear the TPM Owner Password from memory in case it failed to be used to seal TOTP tpmr seal "$TOTP_SECRET" "$TPM_NVRAM_SPACE" 0,1,2,3,4,7 "$pcrf" 312 "" "$TPM_PASSWORD" || @@ -54,7 +55,9 @@ tpmr seal "$TOTP_SECRET" "$TPM_NVRAM_SPACE" 0,1,2,3,4,7 "$pcrf" 312 "" "$TPM_PAS shred -n 10 -z -u "$TOTP_SEALED" 2>/dev/null url="otpauth://totp/$HOST?secret=$secret" -secret="" +DEBUG "TOTP secret output on screen (both URL and QR code)" qrenc "$url" -echo "$url" + +echo "TOTP secret for manual input (device without camera): $secret" +secret="" diff --git a/initrd/bin/setconsolefont.sh b/initrd/bin/setconsolefont.sh index 1f2177414..63aacc782 100755 --- a/initrd/bin/setconsolefont.sh +++ b/initrd/bin/setconsolefont.sh @@ -3,7 +3,7 @@ set -eo pipefail . /etc/functions -TRACE "Under /bin/setconsolefont.sh" +TRACE_FUNC # If the board ships setfont, and the console size is >=1600 lines tall, # increase the console font size. diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index e7e61ceba..73293379e 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -17,7 +17,7 @@ PCR_SIZE= # Export CONFIG_TPM2_CAPTURE_PCAP=y from your board config to capture tpm2 pcaps to # /tmp/tpm0.pcap; Wireshark can inspect these. (This must be enabled at build # time so the pcap TCTI driver is included.) -if [ -n "$CONFIG_TPM2_CAPTURE_PCAP" ]; then +if [ "$CONFIG_TPM2_CAPTURE_PCAP" == "y" ]; then export TPM2TOOLS_TCTI="pcap:device:/dev/tpmrm0" export TCTI_PCAP_FILE="/tmp/tpm0.pcap" fi @@ -29,11 +29,10 @@ else . /etc/config fi -TRACE "Under /bin/tpmr" - # Busybox xxd lacks -r, and we get hex dumps from TPM1 commands. This converts # a hex dump to binary data using sed and printf hex2bin() { + TRACE_FUNC sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf } @@ -43,6 +42,7 @@ hex2bin() { # as a file still chokes if the password begins with 'hex:', oddly tpm2-tools # accepts 'hex:' in the file content.) tpm2_password_hex() { + TRACE_FUNC echo "hex:$(echo -n "$1" | xxd -p | tr -d ' \n')" } @@ -50,7 +50,7 @@ tpm2_password_hex() { # Reads PCR binary data and writes to file. # -a: Append to file. Default is to overwrite. tpm2_pcrread() { - TRACE "Under /bin/tpmr:tpm2_pcrread" + TRACE_FUNC if [ "$1" = "-a" ]; then APPEND=y shift @@ -61,14 +61,14 @@ tpm2_pcrread() { if [ -z "$APPEND" ]; then # Don't append - truncate file now so real command always - # appends + # overwrites true >"$file" fi DO_WITH_DEBUG tpm2 pcrread -Q -o >(cat >>"$file") "sha256:$index" } tpm1_pcrread() { - TRACE "Under /bin/tpmr:tpm1_pcrread" + TRACE_FUNC if [ "$1" = "-a" ]; then APPEND=y shift @@ -79,7 +79,7 @@ tpm1_pcrread() { if [ -z "$APPEND" ]; then # Don't append - truncate file now so real command always - # appends + # overwrites true >"$file" fi @@ -100,11 +100,12 @@ is_hash() { # extend_pcr_state - extend a PCR state value with more hashes or raw data (which is hashed) # usage: -# extend_pcr_state +# extend_pcr_state # alg - either 'sha1' or 'sha256' to specify algorithm -# initial_state - a hash value setting the initial state +# state - a hash value setting the initial state # files/hashes... - any number of files or hashes, state is extended once for each item extend_pcr_state() { + TRACE_FUNC local alg="$1" local state="$2" local next extend @@ -193,7 +194,7 @@ $0 ~ pcr { # hashes and/or files extended to given PCR after firmware. Resulting PCR value # is returned in binary form. replay_pcr() { - TRACE "Under /bin/tpmr:replay_pcr" + TRACE_FUNC if [ -z "$2" ]; then echo >&2 "No PCR number passed" return @@ -229,18 +230,24 @@ replay_pcr() { } tpm2_extend() { - TRACE "Under /bin/tpmr:tpm2_extend" + TRACE_FUNC while true; do case "$1" in -ix) + # store index and shift so -ic and -if can be processed index="$2" shift 2 ;; -ic) + string=$(echo -n "$2") hash="$(echo -n "$2" | sha256sum | cut -d' ' -f1)" + TRACE_FUNC + DEBUG "TPM: Will extend PCR[$index] with hash of string $string" shift 2 ;; -if) + TRACE_FUNC + DEBUG "TPM: Will extend PCR[$index] with hash of file content $2" hash="$(sha256sum "$2" | cut -d' ' -f1)" shift 2 ;; @@ -250,11 +257,14 @@ tpm2_extend() { esac done tpm2 pcrextend "$index:sha256=$hash" - DO_WITH_DEBUG tpm2 pcrread "sha256:$index" + INFO $(tpm2 pcrread "sha256:$index" 2>&1) + + TRACE_FUNC + DEBUG "TPM: Extended PCR[$index] with hash $hash" } tpm2_counter_read() { - TRACE "Under /bin/tpmr:tpm2_counter_read" + TRACE_FUNC while true; do case "$1" in -ix) @@ -270,7 +280,7 @@ tpm2_counter_read() { } tpm2_counter_inc() { - TRACE "Under /bin/tpmr:tpm2_counter_inc" + TRACE_FUNC while true; do case "$1" in -ix) @@ -291,20 +301,27 @@ tpm2_counter_inc() { } tpm1_counter_create() { - TRACE "Under /bin/tpmr:tpm1_counter_create" - # tpmr handles the TPM owner password (from cache or prompt), but all + TRACE_FUNC + # tpmr handles the TPM Owner Password (from cache or prompt), but all # other parameters for TPM1 are passed directly, and TPM2 mimics the # TPM1 interface. prompt_tpm_owner_password - if ! tpm counter_create -pwdo "$(cat "/tmp/secret/tpm_owner_password")" "$@"; then + TMP_ERR_FILE=$(mktemp) + if ! tpm counter_create -pwdo "$(cat "/tmp/secret/tpm_owner_password")" "$@" 2>"$TMP_ERR_FILE"; then DEBUG "Failed to create counter from tpm1_counter_create. Wiping /tmp/secret/tpm_owner_password" shred -n 10 -z -u /tmp/secret/tpm_owner_password + # Log the contents of the temporary error file + while IFS= read -r line; do + DEBUG "tpm1 stderr: $line" + done <"$TMP_ERR_FILE" + rm -f "$TMP_ERR_FILE" die "Unable to create counter from tpm1_counter_create" fi + rm -f "$TMP_ERR_FILE" } tpm2_counter_create() { - TRACE "Under /bin/tpmr:tpm2_counter_create" + TRACE_FUNC while true; do case "$1" in -pwdc) @@ -321,9 +338,9 @@ tpm2_counter_create() { esac done prompt_tpm_owner_password - rand_index="1$(dd if=/dev/urandom bs=1 count=3 | xxd -pc3)" + rand_index="1$(dd if=/dev/urandom bs=1 count=3 2>/dev/null | xxd -pc3)" tpm2 nvdefine -C o -s 8 -a "ownerread|authread|authwrite|nt=1" \ - -P "$(tpm2_password_hex "$(cat "/tmp/secret/tpm_owner_password")")" "0x$rand_index" >/dev/console || + -P "$(tpm2_password_hex "$(cat "/tmp/secret/tpm_owner_password")")" "0x$rand_index" >/dev/null 2>&1 || { DEBUG "Failed to create counter from tpm2_counter_create. Wiping /tmp/secret/tpm_owner_password" shred -n 10 -z -u /tmp/secret/tpm_owner_password @@ -333,7 +350,7 @@ tpm2_counter_create() { } tpm2_startsession() { - TRACE "Under /bin/tpmr:tpm2_startsession" + TRACE_FUNC mkdir -p "$SECRET_DIR" tpm2 flushcontext -Q \ --transient-object || @@ -346,17 +363,19 @@ tpm2_startsession() { tpm2 flushcontext -Q \ --saved-session || die "tpm2_flushcontext: unable to flush saved session" - tpm2 readpublic -Q -c "$PRIMARY_HANDLE" -t "$PRIMARY_HANDLE_FILE" - tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$ENC_SESSION_FILE" - tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$DEC_SESSION_FILE" - tpm2 sessionconfig -Q --disable-encrypt "$DEC_SESSION_FILE" + tpm2 readpublic -Q -c "$PRIMARY_HANDLE" -t "$PRIMARY_HANDLE_FILE" >/dev/null 2>&1 + #TODO: do the right thing to not have to suppress "WARN: check public portion the tpmkey manually" see https://github.com/linuxboot/heads/pull/1630#issuecomment-2075120429 + tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$ENC_SESSION_FILE" >/dev/null 2>&1 + #TODO: do the right thing to not have to suppress "WARN: check public portion the tpmkey manually" see https://github.com/linuxboot/heads/pull/1630#issuecomment-2075120429 + tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$DEC_SESSION_FILE" >/dev/null 2>&1 + tpm2 sessionconfig -Q --disable-encrypt "$DEC_SESSION_FILE" >/dev/null 2>&1 } # Use cleanup_session() with at_exit to release a TPM2 session and delete the # session file. E.g.: # at_exit cleanup_session "$SESSION_FILE" cleanup_session() { - TRACE "Under /bin/tpmr:cleanup_session" + TRACE_FUNC session_file="$1" if [ -f "$session_file" ]; then DEBUG "Clean up session: $session_file" @@ -372,13 +391,14 @@ cleanup_session() { # at_exit, e.g.: # at_exit cleanup_shred "$FILE" cleanup_shred() { - TRACE "Under /bin/tpmr:cleanup_shred" + TRACE_FUNC shred -n 10 -z -u "$1" 2>/dev/null || true } # tpm2_destroy: Destroy a sealed file in the TPM. The mechanism differs by # TPM version - TPM2 evicts the file object, so it no longer exists. tpm2_destroy() { + TRACE_FUNC index="$1" # Index of the sealed file size="$2" # Size of zeroes to overwrite for TPM1 (unused in TPM2) @@ -394,10 +414,11 @@ tpm2_destroy() { # TPM version - TPM1 overwrites the file with zeroes, since this can be done # without authorization. (Deletion requires authorization.) tpm1_destroy() { + TRACE_FUNC index="$1" # Index of the sealed file size="$2" # Size of zeroes to overwrite for TPM1 - dd if=/dev/zero bs="$size" count=1 of=/tmp/wipe-totp-zero + dd if=/dev/zero bs="$size" count=1 of=/tmp/wipe-totp-zero >/dev/null 2>&1 tpm nv_writevalue -in "$index" -if /tmp/wipe-totp-zero || die "Unable to wipe sealed secret from TPM NVRAM" } @@ -408,7 +429,7 @@ tpm1_destroy() { # provided - TPM2 allows the TPM to fall back to current PCR values, but it is # not required to support this. tpm2_seal() { - TRACE "Under /bin/tpmr:tpm2_seal" + TRACE_FUNC file="$1" #$KEY_FILE index="$2" pcrl="$3" #0,1,2,3,4,5,6,7 (does not include algorithm prefix) @@ -481,13 +502,13 @@ tpm2_seal() { } } tpm1_seal() { - TRACE "Under /bin/tpmr:tpm1_seal" + TRACE_FUNC file="$1" index="$2" pcrl="$3" #0,1,2,3,4,5,6,7 (does not include algorithm prefix) pcrf="$4" sealed_size="$5" - pass="$6" # May be empty to seal with no password + pass="$6" # May be empty to seal with no password tpm_owner_password="$7" # Owner password - will prompt if needed and not empty sealed_file="$SECRET_DIR/tpm1_seal_sealed.bin" @@ -497,7 +518,6 @@ tpm1_seal() { DEBUG "tpm1_seal arguments: file=$file index=$index pcrl=$pcrl pcrf=$pcrf sealed_size=$sealed_size pass=$(mask_param "$pass") tpm_password=$(mask_param "$tpm_password")" - # If a password was given, add it to the policy arguments if [ "$pass" ]; then POLICY_ARGS+=(-pwdd "$pass") @@ -519,7 +539,7 @@ tpm1_seal() { -of "$sealed_file" \ -hk 40000000 \ "${POLICY_ARGS[@]}" - + # try it without the TPM Owner Password first if ! tpm nv_writevalue -in "$index" -if "$sealed_file"; then # to create an nvram space we need the TPM Owner Password @@ -549,7 +569,7 @@ tpm1_seal() { # password must be provided if one was used to seal (and cannot be provided if # no password was used to seal). tpm2_unseal() { - TRACE "Under /bin/tpmr:tpm2_unseal" + TRACE_FUNC index="$1" pcrl="$2" #0,1,2,3,4,5,6,7 (does not include algorithm prefix) sealed_size="$3" @@ -590,11 +610,20 @@ tpm2_unseal() { UNSEAL_PASS_SUFFIX="+$(tpm2_password_hex "$pass")" fi - tpm2 unseal -Q -c "$handle" -p "session:$POLICY_SESSION$UNSEAL_PASS_SUFFIX" \ - -S "$ENC_SESSION_FILE" >"$file" + # tpm2 unseal will write the unsealed data to stdout and any errors to + # stderr; capture stderr to log. + if ! tpm2 unseal -Q -c "$handle" -p "session:$POLICY_SESSION$UNSEAL_PASS_SUFFIX" \ + -S "$ENC_SESSION_FILE" >"$file" 2> >(SINK_LOG "tpm2 stderr"); then + INFO "Unable to unseal secret from TPM NVRAM" + + # should succeed, exit if it doesn't + exit 1 + fi + rm -f "$TMP_ERR_FILE" } + tpm1_unseal() { - TRACE "Under /bin/tpmr:tpm1_unseal" + TRACE_FUNC index="$1" pcrl="$2" sealed_size="$3" @@ -629,21 +658,21 @@ tpm1_unseal() { } tpm2_reset() { - TRACE "Under /bin/tpmr:tpm2_reset" + TRACE_FUNC tpm_owner_password="$1" mkdir -p "$SECRET_DIR" # output TPM Owner Password to a file to be reused in this boot session until recovery shell/reboot DEBUG "Caching TPM Owner Password to $SECRET_DIR/tpm_owner_password" echo -n "$tpm_owner_password" >"$SECRET_DIR/tpm_owner_password" - tpm2 clear -c platform || warn "Unable to clear TPM on platform hierarchy" - tpm2 changeauth -c owner "$(tpm2_password_hex "$tpm_owner_password")" - tpm2 changeauth -c endorsement "$(tpm2_password_hex "$tpm_owner_password")" - tpm2 createprimary -C owner -g sha256 -G "${CONFIG_PRIMARY_KEY_TYPE:-rsa}" \ - -c "$SECRET_DIR/primary.ctx" -P "$(tpm2_password_hex "$tpm_owner_password")" - tpm2 evictcontrol -C owner -c "$SECRET_DIR/primary.ctx" "$PRIMARY_HANDLE" \ - -P "$(tpm2_password_hex "$tpm_owner_password")" - shred -u "$SECRET_DIR/primary.ctx" - tpm2_startsession + DO_WITH_DEBUG tpm2 clear -c platform &>/dev/null + DO_WITH_DEBUG tpm2 changeauth -c owner "$(tpm2_password_hex "$tpm_owner_password")" &>/dev/null + DO_WITH_DEBUG tpm2 changeauth -c endorsement "$(tpm2_password_hex "$tpm_owner_password")" &>/dev/null + DO_WITH_DEBUG tpm2 createprimary -C owner -g sha256 -G "${CONFIG_PRIMARY_KEY_TYPE:-rsa}" \ + -c "$SECRET_DIR/primary.ctx" -P "$(tpm2_password_hex "$tpm_owner_password")" &>/dev/null + DO_WITH_DEBUG tpm2 evictcontrol -C owner -c "$SECRET_DIR/primary.ctx" "$PRIMARY_HANDLE" \ + -P "$(tpm2_password_hex "$tpm_owner_password")" &>/dev/null + shred -u "$SECRET_DIR/primary.ctx" &>/dev/null + DO_WITH_DEBUG tpm2_startsession &>/dev/null # Set the dictionary attack parameters. TPM2 defaults vary widely, we # want consistent behavior on any TPM. @@ -666,7 +695,7 @@ tpm2_reset() { --max-tries=10 \ --recovery-time=3600 \ --lockout-recovery-time=0 \ - --auth="session:$ENC_SESSION_FILE" + --auth="session:$ENC_SESSION_FILE" >/dev/null 2>&1 || LOG "Unable to set dictionary lockout parameters" # Set a random DA lockout password, so the DA lockout can't be cleared # with a password. Heads doesn't offer dictionary attach reset, instead @@ -675,32 +704,32 @@ tpm2_reset() { # The default lockout password is empty, so we must set this, and we # don't need to provide any auth (use the default empty password). tpm2 changeauth -Q -c lockout \ - "hex:$(dd if=/dev/urandom bs=32 count=1 status=none | xxd -p | tr -d ' \n')" + "hex:$(dd if=/dev/urandom bs=32 count=1 status=none 2>/dev/null | xxd -p | tr -d ' \n')" >/dev/null 2>&1 || LOG "Unable to set lockout password" } tpm1_reset() { - TRACE "Under /bin/tpmr:tpm1_reset" + TRACE_FUNC tpm_owner_password="$1" mkdir -p "$SECRET_DIR" # output tpm_owner_password to a file to be reused in this boot session until recovery shell/reboot DEBUG "Caching TPM Owner Password to $SECRET_DIR/tpm_owner_password" echo -n "$tpm_owner_password" >"$SECRET_DIR/tpm_owner_password" # Make sure the TPM is ready to be reset - tpm physicalpresence -s - tpm physicalenable - tpm physicalsetdeactivated -c - tpm forceclear - tpm physicalenable - tpm takeown -pwdo "$tpm_owner_password" + DO_WITH_DEBUG tpm physicalpresence -s &>/dev/null + DO_WITH_DEBUG tpm physicalenable &>/dev/null + DO_WITH_DEBUG tpm physicalsetdeactivated -c &>/dev/null + DO_WITH_DEBUG tpm forceclear &>/dev/null + DO_WITH_DEBUG tpm physicalenable &>/dev/null + DO_WITH_DEBUG tpm takeown -pwdo "$tpm_owner_password" &>/dev/null # And now turn it all back on - tpm physicalpresence -s - tpm physicalenable - tpm physicalsetdeactivated -c + DO_WITH_DEBUG tpm physicalpresence -s &>/dev/null + DO_WITH_DEBUG tpm physicalenable &>/dev/null + DO_WITH_DEBUG tpm physicalsetdeactivated -c &>/dev/null } # Perform final cleanup before boot and lock the platform heirarchy. tpm2_kexec_finalize() { - TRACE "Under /bin/tpmr:tpm2_kexec_finalize" + TRACE_FUNC # Flush sessions and transient objects tpm2 flushcontext -Q --transient-object || @@ -714,13 +743,13 @@ tpm2_kexec_finalize() { # being cleared in the OS. # This passphrase is only effective before the next boot. echo "Locking TPM2 platform hierarchy..." - randpass=$(dd if=/dev/urandom bs=4 count=1 status=none | xxd -p) + randpass=$(dd if=/dev/urandom bs=4 count=1 status=none 2>/dev/null | xxd -p) tpm2 changeauth -c platform "$randpass" || warn "Failed to lock platform hierarchy of TPM2" } tpm2_shutdown() { - TRACE "Under /bin/tpmr:tpm2_shutdown" + TRACE_FUNC # Prepare for shutdown. # This is a "clear" shutdown (do not preserve runtime state) since we @@ -759,6 +788,24 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then shift tpm1_destroy "$@" ;; + extend) + # Check if we extend with a hash or a file + if [ "$4" = "-if" ]; then + DEBUG "TPM: Will extend PCR[$3] hash content of file $5" + hash="$(sha1sum "$5" | cut -d' ' -f1)" + elif [ "$4" = "-ic" ]; then + string=$(echo -n "$5") + DEBUG "TPM: Will extend PCR[$3] with hash of filename $string" + hash="$(echo -n "$5" | sha1sum | cut -d' ' -f1)" + fi + + TRACE_FUNC + INFO "TPM: Extending PCR[$3] with hash $hash" + + # Silence stdout/stderr, they're only useful for debugging + # and DO_WITH_DEBUG captures them + DO_WITH_DEBUG exec tpm "$@" &>/dev/null + ;; seal) shift tpm1_seal "$@" @@ -797,6 +844,8 @@ calcfuturepcr) replay_pcr "sha256" "$@" ;; extend) + TRACE_FUNC + INFO "TPM: Extending PCR[$2] with $4" tpm2_extend "$@" ;; counter_read) diff --git a/initrd/bin/unpack_initramfs.sh b/initrd/bin/unpack_initramfs.sh index cbefc10ac..4fff52f60 100755 --- a/initrd/bin/unpack_initramfs.sh +++ b/initrd/bin/unpack_initramfs.sh @@ -3,7 +3,7 @@ set -e -o pipefail . /etc/functions -TRACE "Under unpack_initramfs.sh" +TRACE_FUNC # Unpack a Linux initramfs archive. # # In general, the initramfs archive is one or more cpio archives, optionally @@ -31,78 +31,105 @@ CPIO_ARGS=("$@") # Consume zero bytes, the first nonzero byte read (if any) is repeated on stdout consume_zeros() { - TRACE "Under unpack_initramfs.sh:consume_zeros" - next_byte='00' - while [ "$next_byte" = "00" ]; do - # if we reach EOF, next_byte becomes empty (dd does not fail) - next_byte="$(dd bs=1 count=1 status=none | xxd -p | tr -d ' ')" - done - # if we finished due to nonzero byte (not EOF), then carry that byte - if [ -n "$next_byte" ]; then - echo -n "$next_byte" | xxd -p -r - fi + TRACE_FUNC + next_byte='00' + while [ "$next_byte" = "00" ]; do + # if we reach EOF, next_byte becomes empty (dd does not fail) + next_byte="$(dd bs=1 count=1 status=none | xxd -p | tr -d ' ')" + done + # if we finished due to nonzero byte (not EOF), then carry that byte + if [ -n "$next_byte" ]; then + echo -n "$next_byte" | xxd -p -r + fi } unpack_cpio() { - TRACE "Under unpack_initramfs.sh:unpack_cpio" - (cd "$dest_dir"; cpio -i "${CPIO_ARGS[@]}" 2>/dev/null) + TRACE_FUNC + ( + cd "$dest_dir" + cpio -i "${CPIO_ARGS[@]}" 2>/dev/null + ) } # unpack the first segment of an archive, then write the rest to another file unpack_first_segment() { - TRACE "Under unpack_initramfs.sh:unpack_first_segment" - unpack_archive="$1" - dest_dir="$2" - rest_archive="$3" + TRACE_FUNC + unpack_archive="$1" + dest_dir="$2" + rest_archive="$3" - mkdir -p "$dest_dir" + mkdir -p "$dest_dir" - # peek the beginning of the file to determine what type of content is next - magic="$(dd if="$unpack_archive" bs=6 count=1 status=none | xxd -p)" + # peek the beginning of the file to determine what type of content is next + magic="$(dd if="$unpack_archive" bs=6 count=1 status=none 2>/dev/null | xxd -p)" - # read this segment of the archive, then write the rest to the next file - ( - # Magic values correspond to Linux init/initramfs.c (zero, cpio) and - # lib/decompress.c (gzip) - case "$magic" in - 00*) - DEBUG "archive segment $magic: uncompressed cpio" - # Skip zero bytes and copy the first nonzero byte - consume_zeros - # Copy the remaining data - cat - ;; - 303730373031*|303730373032*) # plain cpio - DEBUG "archive segment $magic: plain cpio" - # Unpack the plain cpio, this stops reading after the trailer - unpack_cpio - # Copy the remaining data - cat - ;; - 1f8b*|1f9e*) # gzip - DEBUG "archive segment $magic: gzip" - # gunzip won't stop when reaching the end of the gzipped member, - # so we can't read another segment after this. We can't - # reasonably determine the member length either, this requires - # walking all the compressed blocks. - gunzip | unpack_cpio - ;; - 28b5*) # zstd - DEBUG "archive segment $magic: zstd" - # Like gunzip, this will not stop when reaching the end of the - # frame, and determining the frame length requires walking all - # of its blocks. - (zstd-decompress -d || true) | unpack_cpio - ;; - *) # unknown - die "Can't decompress initramfs archive, unknown type: $magic" - ;; - esac - ) <"$unpack_archive" >"$rest_archive" + # read this segment of the archive, then write the rest to the next file + ( + # Magic values correspond to Linux init/initramfs.c (zero, cpio) and + # lib/decompress.c (gzip) + case "$magic" in + 00*) + DEBUG "archive segment $magic: uncompressed cpio" + # Skip zero bytes and copy the first nonzero byte + consume_zeros + # Copy the remaining data + cat + ;; + 303730373031* | 303730373032*) # plain cpio + DEBUG "archive segment $magic: plain cpio" + # Unpack the plain cpio, this stops reading after the trailer + unpack_cpio + # Copy the remaining data + cat + ;; + 1f8b* | 1f9e*) # gzip + DEBUG "archive segment $magic: gzip" + # gunzip won't stop when reaching the end of the gzipped member, + # so we can't read another segment after this. We can't + # reasonably determine the member length either, this requires + # walking all the compressed blocks. + gunzip | unpack_cpio + ;; + fd37*) # xz + DEBUG "archive segment $magic: xz" + unxz | unpack_cpio + ;; + 28b5*) # zstd + DEBUG "archive segment $magic: zstd" + # Like gunzip, this will not stop when reaching the end of the + # frame, and determining the frame length requires walking all + # of its blocks. + (zstd-decompress -d || true) | unpack_cpio + ;; + *) # unknown + die "Can't decompress initramfs archive, unknown type: $magic" + # The following are magic values for other compression formats + # but not added because not tested. + # TODO: open an issue for unsupported magic number reported on die. + # + #425a*) # bzip2 + # DEBUG "archive segment $magic: bzip2" + # bunzip2 | unpack_cpio + #;; + #5d00*) # lzma + # DEBUG "archive segment $magic: lzma" + # unlzma | unpack_cpio + #;; + #894c*) # lzo + # DEBUG "archive segment $magic: lzo" + # lzop -d | unpack_cpio + #;; + #0221*) # lz4 + # DEBUG "archive segment $magic: lz4" + # lz4 -d | unpack_cpio + # ;; + ;; + esac + ) <"$unpack_archive" >"$rest_archive" - orig_size="$(stat -c %s "$unpack_archive")" - rest_size="$(stat -c %s "$rest_archive")" - DEBUG "archive segment $magic: $((orig_size - rest_size)) bytes" + orig_size="$(stat -c %s "$unpack_archive")" + rest_size="$(stat -c %s "$rest_archive")" + DEBUG "archive segment $magic: $((orig_size - rest_size)) bytes" } DEBUG "Unpacking $INITRAMFS_ARCHIVE to $DEST_DIR" @@ -112,7 +139,7 @@ rest_archive="/tmp/unpack_initramfs_rest" # Break when there is no remaining data while [ -s "$next_archive" ]; do - unpack_first_segment "$next_archive" "$DEST_DIR" "$rest_archive" - next_archive="/tmp/unpack_initramfs_next" - mv "$rest_archive" "$next_archive" + unpack_first_segment "$next_archive" "$DEST_DIR" "$rest_archive" + next_archive="/tmp/unpack_initramfs_next" + mv "$rest_archive" "$next_archive" done diff --git a/initrd/bin/unseal-hotp b/initrd/bin/unseal-hotp index d9f2ad081..8565ac612 100755 --- a/initrd/bin/unseal-hotp +++ b/initrd/bin/unseal-hotp @@ -6,17 +6,16 @@ HOTP_SECRET="/tmp/secret/hotp.key" HOTP_COUNTER="/boot/kexec_hotp_counter" -mount_boot_or_die() -{ - TRACE "Under /bin/unseal-hotp:mount_boot_or_die" +mount_boot_or_die() { + TRACE_FUNC # Mount local disk if it is not already mounted - if ! grep -q /boot /proc/mounts ; then - mount -o ro /boot \ - || die "Unable to mount /boot" + if ! grep -q /boot /proc/mounts; then + mount -o ro /boot || + die "Unable to mount /boot" fi } -TRACE "Under /bin/unseal-hotp" +TRACE_FUNC # Store counter in file instead of TPM for now, as it conflicts with Heads # config TPM counter as TPM 1.2 can only increment one counter between reboots @@ -38,34 +37,35 @@ fi #counter_value=$(printf "%d" 0x${counter_value}) if [ "$CONFIG_TPM" = "y" ]; then - DEBUG "Unsealing HOTP secret reuses TOTP sealed secret..." - tpmr unseal 4d47 0,1,2,3,4,7 312 "$HOTP_SECRET" || die "Unable to unseal HOTP secret" + DEBUG "Unsealing HOTP secret reuses TOTP sealed secret..." + tpmr unseal 4d47 0,1,2,3,4,7 312 "$HOTP_SECRET" || die "Unable to unseal HOTP secret" else - # without a TPM, generate a secret based on the SHA-256 of the ROM - secret_from_rom_hash > "$HOTP_SECRET" || die "Reading ROM failed" + # without a TPM, generate a secret based on the SHA-256 of the ROM + secret_from_rom_hash >"$HOTP_SECRET" || die "Reading ROM failed" fi # Truncate the secret if it is longer than the maximum HOTP secret truncate_max_bytes 20 "$HOTP_SECRET" -if ! hotp $counter_value < "$HOTP_SECRET"; then - shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null - die 'Unable to compute HOTP hash?' +if ! hotp $counter_value <"$HOTP_SECRET"; then + shred -n 10 -z -u "$HOTP_SECRET" 2>/dev/null + die 'Unable to compute HOTP hash?' fi -shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null - -#increment_tpm_counter $counter > /dev/null \ -#|| die "Unable to increment tpm counter" +shred -n 10 -z -u "$HOTP_SECRET" 2>/dev/null +#Incrementing counter under $HOTP_COUNTER +# +# If for whatever reason, this counter is 5 counts different then on HOTP USB Security dongle, HOTP unseal fails. +#Note: HOTP_COUNTER="/boot/kexec_hotp_counter" is not detached signed under kexec.sig since it changes +# +# TODO: figure out a better alternative then a counter that can be modified on disk +# As of now, this counter isincreased only in the validated presence of the HOTP dongle being connected per callers mount -o remount,rw /boot - -counter_value=`expr $counter_value + 1` -echo $counter_value > $HOTP_COUNTER \ -|| die "Unable to create hotp counter file" - -#sha256sum /tmp/counter-$counter > $HOTP_COUNTER \ -#|| die "Unable to create hotp counter file" +DEBUG "Incrementing HOTP counter under $HOTP_COUNTER" +counter_value=$(expr $counter_value + 1) +echo $counter_value >$HOTP_COUNTER || + die "Unable to create hotp counter file" mount -o remount,ro /boot exit 0 diff --git a/initrd/bin/unseal-totp b/initrd/bin/unseal-totp index 7a8dfaf37..3ca7cf281 100755 --- a/initrd/bin/unseal-totp +++ b/initrd/bin/unseal-totp @@ -5,11 +5,11 @@ TOTP_SECRET="/tmp/secret/totp.key" -TRACE "Under /bin/unseal-totp" +TRACE_FUNC if [ "$CONFIG_TPM" = "y" ]; then tpmr unseal 4d47 0,1,2,3,4,7 312 "$TOTP_SECRET" || - die "Unable to unseal TOTP secret" + die "Unable to unseal TOTP secret from TPM" fi if ! totp -q <"$TOTP_SECRET"; then diff --git a/initrd/bin/usb-init b/initrd/bin/usb-init index ea1d72bda..06fbc1075 100755 --- a/initrd/bin/usb-init +++ b/initrd/bin/usb-init @@ -4,7 +4,7 @@ . /etc/functions . /tmp/config -TRACE "Under /bin/usb-init" +TRACE_FUNC if [ "$CONFIG_TPM" = "y" ]; then # Extend PCR4 as soon as possible diff --git a/initrd/bin/wget-measure.sh b/initrd/bin/wget-measure.sh index 604f83eb6..8e7e9e7bd 100755 --- a/initrd/bin/wget-measure.sh +++ b/initrd/bin/wget-measure.sh @@ -3,7 +3,7 @@ . /etc/functions die() { - TRACE "Under /bin/wget-measure.sh:die" + TRACE_FUNC echo >&2 "$@" exit 1 } diff --git a/initrd/bin/xx30-flash.init b/initrd/bin/xx30-flash.init deleted file mode 100755 index ca2fa8f67..000000000 --- a/initrd/bin/xx30-flash.init +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/ash -# Initialize the USB and network device drivers, -# invoke a recovery shell and prompt the user for how to proceed - -. /etc/ash_functions -. /tmp/config - -TRACE "Under /bin/xx30-flash.init" - -busybox insmod /lib/modules/ehci-hcd.ko -busybox insmod /lib/modules/ehci-pci.ko -busybox insmod /lib/modules/xhci-hcd.ko -busybox insmod /lib/modules/xhci-pci.ko -busybox insmod /lib/modules/e1000e.ko -busybox insmod /lib/modules/usb-storage.ko - -sleep 2 - -echo '***** Starting recovery shell' -echo '' -echo 'To install from flash drive:' -echo '' -echo ' mount -o ro /dev/sdb1 /media' -echo ' flash.sh /media/xx30-legacy.rom' -echo '' - -exec /bin/sh diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions deleted file mode 100644 index 078c3bdd2..000000000 --- a/initrd/etc/ash_functions +++ /dev/null @@ -1,359 +0,0 @@ -#!/bin/sh -# -# Core shell functions that do not require bash. These functions are used with -# busybox ash on legacy-flash boards, and with bash on all other boards. - -die() { - if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo " !!! ERROR: $* !!!" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; - else - echo >&2 "!!! ERROR: $* !!!"; - fi - sleep 2; - exit 1; -} - -warn() { - if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; - else - echo >&2 " *** WARNING: $* ***"; - fi - sleep 1; -} - -DEBUG() { - if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo "DEBUG: $*" | while read line; do - echo "$line" | tee -a /tmp/debug.log /dev/kmsg >/dev/null - done - fi -} - -TRACE() { - if [ "$CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" = "y" ];then - echo "TRACE: $*" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; - fi -} - -preserve_rom() { - TRACE "Under /etc/ash_functions:preserve_rom" - new_rom="$1" - old_files=`cbfs -t 50 -l 2>/dev/null | grep "^heads/"` - - for old_file in `echo $old_files`; do - new_file=`cbfs.sh -o $1 -l | grep -x $old_file` - if [ -z "$new_file" ]; then - echo "+++ Adding $old_file to $1" - cbfs -t 50 -r $old_file >/tmp/rom.$$ \ - || die "Failed to read cbfs file from ROM" - cbfs.sh -o $1 -a $old_file -f /tmp/rom.$$ \ - || die "Failed to write cbfs file to new ROM file" - fi - done -} - -confirm_gpg_card() { - TRACE "Under /etc/ash_functions:confirm_gpg_card" - #Skip prompts if we are currently using a known GPG key material Thumb drive backup and keys are unlocked pinentry - #TODO: probably export CONFIG_GPG_KEY_BACKUP_IN_USE but not under /etc/user.config? - #Toggle to come in next PR, but currently we don't have a way to toggle it back to n if config.user flashed back in rom - if [[ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" && "$CONFIG_GPG_KEY_BACKUP_IN_USE" == "y" ]]; then - DEBUG "Using known GPG key material Thumb drive backup and keys are unlocked and useable through pinentry" - return - fi - - if [ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" ]; then - message="Please confirm that your GPG card is inserted(Y/n) or your GPG key material (b)backup thumbdrive is inserted [Y/n/b]: " - else - # Generic message if no known key material backup - message="Please confirm that your GPG card is inserted [Y/n]: " - fi - - read \ - -n 1 \ - -p "$message" \ - card_confirm - echo - - if [ "$card_confirm" != "y" \ - -a "$card_confirm" != "Y" \ - -a "$card_confirm" != "b" \ - -a -n "$card_confirm" ] \ - ; then - die "gpg card not confirmed" - fi - - # If user has known GPG key material Thumb drive backup and asked to use it - if [[ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" && "$card_confirm" == "b" ]]; then - #Only mount and import GPG key material thumb drive backup once - if [ ! "$CONFIG_GPG_KEY_BACKUP_IN_USE" == "y" ]; then - CR_NONCE="/tmp/secret/cr_nonce" - CR_SIG="$CR_NONCE.sig" - - #Wipe any previous CR_NONCE and CR_SIG - shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" >/dev/null 2>&1 || true - - #Prompt user for configured GPG Admin PIN that will be passed along to mount-usb and to import gpg subkeys - echo - gpg_admin_pin="" - while [ -z "$gpg_admin_pin" ]; do - #TODO: change all passphrase prompts in codebase to include -r to prevent backslash escapes - read -r -s -p "Please enter GPG Admin PIN needed to use the GPG backup thumb drive: " gpg_admin_pin - echo - done - #prompt user to select the proper encrypted partition, which should the first one on next prompt - warn "Please select encrypted LUKS on GPG key material backup thumb drive (not public labeled one)" - mount-usb --pass "$gpg_admin_pin" || die "Unable to mount USB with provided GPG Admin PIN" - echo "++++ Testing detach-sign operation and verifiying against fused public key in ROM" - gpg --pinentry-mode=loopback --passphrase-file <(echo -n "${gpg_admin_pin}") --import /media/subkeys.sec >/dev/null 2>&1 || - die "Unable to import GPG private subkeys" - #Do a detach signature to ensure gpg material is usable and cache passphrase to sign /boot from caller functions - dd if=/dev/urandom of="$CR_NONCE" bs=20 count=1 >/dev/null 2>&1 || - die "Unable to create $CR_NONCE to be detach-signed with GPG private signing subkey" - gpg --pinentry-mode=loopback --passphrase-file <(echo -n "${gpg_admin_pin}") --detach-sign "$CR_NONCE" >/dev/null 2>&1 || - die "Unable to detach-sign $CR_NONCE with GPG private signing subkey using GPG Admin PIN" - #verify detached signature against public key in rom - gpg --verify "$CR_SIG" "$CR_NONCE" > /dev/null 2>&1 && \ - echo "++++ Local GPG keyring can be used to sign/encrypt/authenticate in this boot session ++++" || \ - die "Unable to verify $CR_SIG detached signature against public key in ROM" - #Wipe any previous CR_NONCE and CR_SIG - shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" >/dev/null 2>&1 || true - #TODO: maybe just an export instead of setting /etc/user.config otherwise could be flashed in weird corner case situation - set_user_config "CONFIG_GPG_KEY_BACKUP_IN_USE" "y" - umount /media || die "Unable to unmount USB" - return - fi - fi - - # setup the USB so we can reach the USB Security Dongle's smartcard - enable_usb - - echo -e "\nVerifying presence of GPG card...\n" - # ensure we don't exit without retrying - errexit=$(set -o | grep errexit | awk '{print $2}') - set +e - gpg --card-status >/dev/null - if [ $? -ne 0 ]; then - # prompt for reinsertion and try a second time - read -n1 -r -p \ - "Can't access GPG key; remove and reinsert, then press Enter to retry. " \ - ignored - # restore prev errexit state - if [ "$errexit" = "on" ]; then - set -e - fi - # retry card status - gpg --card-status >/dev/null || - die "gpg card read failed" - fi - # restore prev errexit state - if [ "$errexit" = "on" ]; then - set -e - fi -} - -gpg_auth() { - if [[ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" ]]; then - TRACE "Under /etc/ash_functions:gpg_auth" - # If we have a GPG key backup, we can use it to authenticate even if the card is lost - echo >&2 "!!!!! Please authenticate with OpenPGP smartcard/backup media to prove you are the owner of this machine !!!!!" - - # Wipe any existing nonce and signature - shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" 2>/dev/null || true - - # In case of gpg_auth, we require confirmation of the card, so loop with confirm_gpg_card until we get it - false - while [ $? -ne 0 ]; do - # Call confirm_gpg_card in subshell to ensure GPG key material presence - ( confirm_gpg_card ) - done - - # Perform a signing-based challenge-response, - # to authencate that the card plugged in holding - # the key to sign the list of boot files. - - CR_NONCE="/tmp/secret/cr_nonce" - CR_SIG="$CR_NONCE.sig" - - # Generate a random nonce - dd \ - if=/dev/urandom \ - of="$CR_NONCE" \ - count=1 \ - bs=20 \ - 2>/dev/null \ - || die "Unable to generate 20 random bytes" - - # Sign the nonce - for tries in 1 2 3; do - if gpg --digest-algo SHA256 \ - --detach-sign \ - -o "$CR_SIG" \ - "$CR_NONCE" > /dev/null 2>&1 \ - && gpg --verify "$CR_SIG" "$CR_NONCE" > /dev/null 2>&1 \ - ; then - shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" 2>/dev/null || true - DEBUG "Under /etc/ash_functions:gpg_auth: success" - return 0 - else - shred -n 10 -z -u "$CR_SIG" 2>/dev/null || true - if [ "$tries" -lt 3 ]; then - echo >&2 "!!!!! GPG authentication failed, please try again !!!!!" - continue - else - die "GPG authentication failed, please reboot and try again" - fi - fi - done - return 1 - fi -} - -recovery() { - TRACE "Under /etc/ash_functions:recovery" - echo >&2 "!!!!! $*" - - # Remove any temporary secret files that might be hanging around - # but recreate the directory so that new tools can use it. - - #safe to always be true. Otherwise "set -e" would make it exit here - shred -n 10 -z -u /tmp/secret/* 2> /dev/null || true - rm -rf /tmp/secret - mkdir -p /tmp/secret - - # ensure /tmp/config exists for recovery scripts that depend on it - touch /tmp/config - . /tmp/config - - if [ "$CONFIG_TPM" = "y" ]; then - DEBUG "Extending TPM PCR 4 for recovery shell access" - tpmr extend -ix 4 -ic recovery - fi - - if [ "$CONFIG_RESTRICTED_BOOT" = y ]; then - echo >&2 "Restricted Boot enabled, recovery console disabled, rebooting in 5 seconds" - sleep 5 - /bin/reboot - fi - while [ true ] - do - #Going to recovery shell should be authenticated if supported - gpg_auth - - echo >&2 "!!!!! Starting recovery shell" - sleep 1 - - if [ -x /bin/setsid ]; then - /bin/setsid -c /bin/sh - else - /bin/sh - fi - done -} - -pause_recovery() { - TRACE "Under /etc/ash_functions:pause_recovery" - read -p $'!!! Hit enter to proceed to recovery shell !!!\n' - recovery $* -} - -combine_configs() { - TRACE "Under /etc/ash_functions:combine_configs" - cat /etc/config* > /tmp/config -} - -replace_config() { - TRACE "Under /etc/functions:replace_config" - CONFIG_FILE=$1 - CONFIG_OPTION=$2 - NEW_SETTING=$3 - - touch $CONFIG_FILE - # first pull out the existing option from the global config and place in a tmp file - awk "gsub(\"^export ${CONFIG_OPTION}=.*\",\"export ${CONFIG_OPTION}=\\\"${NEW_SETTING}\\\"\")" /tmp/config >${CONFIG_FILE}.tmp - awk "gsub(\"^${CONFIG_OPTION}=.*\",\"${CONFIG_OPTION}=\\\"${NEW_SETTING}\\\"\")" /tmp/config >>${CONFIG_FILE}.tmp - - # then copy any remaining settings from the existing config file, minus the option you changed - grep -v "^export ${CONFIG_OPTION}=" ${CONFIG_FILE} | grep -v "^${CONFIG_OPTION}=" >>${CONFIG_FILE}.tmp || true - sort ${CONFIG_FILE}.tmp | uniq >${CONFIG_FILE} - rm -f ${CONFIG_FILE}.tmp -} - -# Set a config variable in a specific file to a given value - replace it if it -# exists, or add it. If added, the variable will be exported. -set_config() { - CONFIG_FILE="$1" - CONFIG_OPTION="$2" - NEW_SETTING="$3" - - if grep -q "$CONFIG_OPTION" "$CONFIG_FILE"; then - replace_config "$CONFIG_FILE" "$CONFIG_OPTION" "$NEW_SETTING" - else - echo "export $CONFIG_OPTION=\"$NEW_SETTING\"" >>"$CONFIG_FILE" - fi -} - -# Set a value in config.user, re-combine configs, and update configs in the -# environment. -set_user_config() { - CONFIG_OPTION="$1" - NEW_SETTING="$2" - - set_config /etc/config.user "$CONFIG_OPTION" "$NEW_SETTING" - combine_configs - . /tmp/config -} - -# Load a config value to a variable, defaulting to empty. Does not fail if the -# config is not set (since it would expand to empty by default). -load_config_value() { - local config_name="$1" - if grep -q "$config_name=" /tmp/config; then - grep "$config_name=" /tmp/config | tail -n1 | cut -f2 -d '=' | tr -d '"' - fi -} - -enable_usb() -{ - TRACE "Under /etc/ash_functions:enable_usb" - #insmod ehci_hcd prior of uhdc_hcd and ohci_hcd to suppress dmesg warning - if ! lsmod | grep -q ehci_hcd; then - insmod /lib/modules/ehci-hcd.ko \ - || die "ehci_hcd: module load failed" - fi - if [ "$CONFIG_LINUX_USB_COMPANION_CONTROLLER" = y ]; then - if ! lsmod | grep -q uhci_hcd; then - insmod /lib/modules/uhci-hcd.ko \ - || die "uhci_hcd: module load failed" - fi - if ! lsmod | grep -q ohci_hcd; then - insmod /lib/modules/ohci-hcd.ko \ - || die "ohci_hcd: module load failed" - fi - if ! lsmod | grep -q ohci_pci; then - insmod /lib/modules/ohci-pci.ko \ - || die "ohci_pci: module load failed" - fi - fi - if ! lsmod | grep -q ehci_pci; then - insmod /lib/modules/ehci-pci.ko \ - || die "ehci_pci: module load failed" - fi - if ! lsmod | grep -q xhci_hcd; then - insmod /lib/modules/xhci-hcd.ko \ - || die "xhci_hcd: module load failed" - fi - if ! lsmod | grep -q xhci_pci; then - insmod /lib/modules/xhci-pci.ko \ - || die "xhci_pci: module load failed" - sleep 2 - fi - - if [ "$CONFIG_USB_KEYBOARD" = y ]; then - if ! lsmod | grep -q usbhid; then - insmod /lib/modules/usbhid.ko \ - || die "usbhid: module load failed" - fi - fi -} diff --git a/initrd/etc/diceware_dictionaries/eff_short_wordlist_2_0.txt b/initrd/etc/diceware_dictionaries/eff_short_wordlist_2_0.txt new file mode 100644 index 000000000..ae09babe4 --- /dev/null +++ b/initrd/etc/diceware_dictionaries/eff_short_wordlist_2_0.txt @@ -0,0 +1,1296 @@ +1111 aardvark +1112 abandoned +1113 abbreviate +1114 abdomen +1115 abhorrence +1116 abiding +1121 abnormal +1122 abrasion +1123 absorbing +1124 abundant +1125 abyss +1126 academy +1131 accountant +1132 acetone +1133 achiness +1134 acid +1135 acoustics +1136 acquire +1141 acrobat +1142 actress +1143 acuteness +1144 aerosol +1145 aesthetic +1146 affidavit +1151 afloat +1152 afraid +1153 aftershave +1154 again +1155 agency +1156 aggressor +1161 aghast +1162 agitate +1163 agnostic +1164 agonizing +1165 agreeing +1166 aidless +1211 aimlessly +1212 ajar +1213 alarmclock +1214 albatross +1215 alchemy +1216 alfalfa +1221 algae +1222 aliens +1223 alkaline +1224 almanac +1225 alongside +1226 alphabet +1231 already +1232 also +1233 altitude +1234 aluminum +1235 always +1236 amazingly +1241 ambulance +1242 amendment +1243 amiable +1244 ammunition +1245 amnesty +1246 amoeba +1251 amplifier +1252 amuser +1253 anagram +1254 anchor +1255 android +1256 anesthesia +1261 angelfish +1262 animal +1263 anklet +1264 announcer +1265 anonymous +1266 answer +1311 antelope +1312 anxiety +1313 anyplace +1314 aorta +1315 apartment +1316 apnea +1321 apostrophe +1322 apple +1323 apricot +1324 aquamarine +1325 arachnid +1326 arbitrate +1331 ardently +1332 arena +1333 argument +1334 aristocrat +1335 armchair +1336 aromatic +1341 arrowhead +1342 arsonist +1343 artichoke +1344 asbestos +1345 ascend +1346 aseptic +1351 ashamed +1352 asinine +1353 asleep +1354 asocial +1355 asparagus +1356 astronaut +1361 asymmetric +1362 atlas +1363 atmosphere +1364 atom +1365 atrocious +1366 attic +1411 atypical +1412 auctioneer +1413 auditorium +1414 augmented +1415 auspicious +1416 automobile +1421 auxiliary +1422 avalanche +1423 avenue +1424 aviator +1425 avocado +1426 awareness +1431 awhile +1432 awkward +1433 awning +1434 awoke +1435 axially +1436 azalea +1441 babbling +1442 backpack +1443 badass +1444 bagpipe +1445 bakery +1446 balancing +1451 bamboo +1452 banana +1453 barracuda +1454 basket +1455 bathrobe +1456 bazooka +1461 blade +1462 blender +1463 blimp +1464 blouse +1465 blurred +1466 boatyard +1511 bobcat +1512 body +1513 bogusness +1514 bohemian +1515 boiler +1516 bonnet +1521 boots +1522 borough +1523 bossiness +1524 bottle +1525 bouquet +1526 boxlike +1531 breath +1532 briefcase +1533 broom +1534 brushes +1535 bubblegum +1536 buckle +1541 buddhist +1542 buffalo +1543 bullfrog +1544 bunny +1545 busboy +1546 buzzard +1551 cabin +1552 cactus +1553 cadillac +1554 cafeteria +1555 cage +1556 cahoots +1561 cajoling +1562 cakewalk +1563 calculator +1564 camera +1565 canister +1566 capsule +1611 carrot +1612 cashew +1613 cathedral +1614 caucasian +1615 caviar +1616 ceasefire +1621 cedar +1622 celery +1623 cement +1624 census +1625 ceramics +1626 cesspool +1631 chalkboard +1632 cheesecake +1633 chimney +1634 chlorine +1635 chopsticks +1636 chrome +1641 chute +1642 cilantro +1643 cinnamon +1644 circle +1645 cityscape +1646 civilian +1651 clay +1652 clergyman +1653 clipboard +1654 clock +1655 clubhouse +1656 coathanger +1661 cobweb +1662 coconut +1663 codeword +1664 coexistent +1665 coffeecake +1666 cognitive +2111 cohabitate +2112 collarbone +2113 computer +2114 confetti +2115 copier +2116 cornea +2121 cosmetics +2122 cotton +2123 couch +2124 coverless +2125 coyote +2126 coziness +2131 crawfish +2132 crewmember +2133 crib +2134 croissant +2135 crumble +2136 crystal +2141 cubical +2142 cucumber +2143 cuddly +2144 cufflink +2145 cuisine +2146 culprit +2151 cup +2152 curry +2153 cushion +2154 cuticle +2155 cybernetic +2156 cyclist +2161 cylinder +2162 cymbal +2163 cynicism +2164 cypress +2165 cytoplasm +2166 dachshund +2211 daffodil +2212 dagger +2213 dairy +2214 dalmatian +2215 dandelion +2216 dartboard +2221 dastardly +2222 datebook +2223 daughter +2224 dawn +2225 daytime +2226 dazzler +2231 dealer +2232 debris +2233 decal +2234 dedicate +2235 deepness +2236 defrost +2241 degree +2242 dehydrator +2243 deliverer +2244 democrat +2245 dentist +2246 deodorant +2251 depot +2252 deranged +2253 desktop +2254 detergent +2255 device +2256 dexterity +2261 diamond +2262 dibs +2263 dictionary +2264 diffuser +2265 digit +2266 dilated +2311 dimple +2312 dinnerware +2313 dioxide +2314 diploma +2315 directory +2316 dishcloth +2321 ditto +2322 dividers +2323 dizziness +2324 doctor +2325 dodge +2326 doll +2331 dominoes +2332 donut +2333 doorstep +2334 dorsal +2335 double +2336 downstairs +2341 dozed +2342 drainpipe +2343 dresser +2344 driftwood +2345 droppings +2346 drum +2351 dryer +2352 dubiously +2353 duckling +2354 duffel +2355 dugout +2356 dumpster +2361 duplex +2362 durable +2363 dustpan +2364 dutiful +2365 duvet +2366 dwarfism +2411 dwelling +2412 dwindling +2413 dynamite +2414 dyslexia +2415 eagerness +2416 earlobe +2421 easel +2422 eavesdrop +2423 ebook +2424 eccentric +2425 echoless +2426 eclipse +2431 ecosystem +2432 ecstasy +2433 edged +2434 editor +2435 educator +2436 eelworm +2441 eerie +2442 effects +2443 eggnog +2444 egomaniac +2445 ejection +2446 elastic +2451 elbow +2452 elderly +2453 elephant +2454 elfishly +2455 eliminator +2456 elk +2461 elliptical +2462 elongated +2463 elsewhere +2464 elusive +2465 elves +2466 emancipate +2511 embroidery +2512 emcee +2513 emerald +2514 emission +2515 emoticon +2516 emperor +2521 emulate +2522 enactment +2523 enchilada +2524 endorphin +2525 energy +2526 enforcer +2531 engine +2532 enhance +2533 enigmatic +2534 enjoyably +2535 enlarged +2536 enormous +2541 enquirer +2542 enrollment +2543 ensemble +2544 entryway +2545 enunciate +2546 envoy +2551 enzyme +2552 epidemic +2553 equipment +2554 erasable +2555 ergonomic +2556 erratic +2561 eruption +2562 escalator +2563 eskimo +2564 esophagus +2565 espresso +2566 essay +2611 estrogen +2612 etching +2613 eternal +2614 ethics +2615 etiquette +2616 eucalyptus +2621 eulogy +2622 euphemism +2623 euthanize +2624 evacuation +2625 evergreen +2626 evidence +2631 evolution +2632 exam +2633 excerpt +2634 exerciser +2635 exfoliate +2636 exhale +2641 exist +2642 exorcist +2643 explode +2644 exquisite +2645 exterior +2646 exuberant +2651 fabric +2652 factory +2653 faded +2654 failsafe +2655 falcon +2656 family +2661 fanfare +2662 fasten +2663 faucet +2664 favorite +2665 feasibly +2666 february +3111 federal +3112 feedback +3113 feigned +3114 feline +3115 femur +3116 fence +3121 ferret +3122 festival +3123 fettuccine +3124 feudalist +3125 feverish +3126 fiberglass +3131 fictitious +3132 fiddle +3133 figurine +3134 fillet +3135 finalist +3136 fiscally +3141 fixture +3142 flashlight +3143 fleshiness +3144 flight +3145 florist +3146 flypaper +3151 foamless +3152 focus +3153 foggy +3154 folksong +3155 fondue +3156 footpath +3161 fossil +3162 fountain +3163 fox +3164 fragment +3165 freeway +3166 fridge +3211 frosting +3212 fruit +3213 fryingpan +3214 gadget +3215 gainfully +3216 gallstone +3221 gamekeeper +3222 gangway +3223 garlic +3224 gaslight +3225 gathering +3226 gauntlet +3231 gearbox +3232 gecko +3233 gem +3234 generator +3235 geographer +3236 gerbil +3241 gesture +3242 getaway +3243 geyser +3244 ghoulishly +3245 gibberish +3246 giddiness +3251 giftshop +3252 gigabyte +3253 gimmick +3254 giraffe +3255 giveaway +3256 gizmo +3261 glasses +3262 gleeful +3263 glisten +3264 glove +3265 glucose +3266 glycerin +3311 gnarly +3312 gnomish +3313 goatskin +3314 goggles +3315 goldfish +3316 gong +3321 gooey +3322 gorgeous +3323 gosling +3324 gothic +3325 gourmet +3326 governor +3331 grape +3332 greyhound +3333 grill +3334 groundhog +3335 grumbling +3336 guacamole +3341 guerrilla +3342 guitar +3343 gullible +3344 gumdrop +3345 gurgling +3346 gusto +3351 gutless +3352 gymnast +3353 gynecology +3354 gyration +3355 habitat +3356 hacking +3361 haggard +3362 haiku +3363 halogen +3364 hamburger +3365 handgun +3366 happiness +3411 hardhat +3412 hastily +3413 hatchling +3414 haughty +3415 hazelnut +3416 headband +3421 hedgehog +3422 hefty +3423 heinously +3424 helmet +3425 hemoglobin +3426 henceforth +3431 herbs +3432 hesitation +3433 hexagon +3434 hubcap +3435 huddling +3436 huff +3441 hugeness +3442 hullabaloo +3443 human +3444 hunter +3445 hurricane +3446 hushing +3451 hyacinth +3452 hybrid +3453 hydrant +3454 hygienist +3455 hypnotist +3456 ibuprofen +3461 icepack +3462 icing +3463 iconic +3464 identical +3465 idiocy +3466 idly +3511 igloo +3512 ignition +3513 iguana +3514 illuminate +3515 imaging +3516 imbecile +3521 imitator +3522 immigrant +3523 imprint +3524 iodine +3525 ionosphere +3526 ipad +3531 iphone +3532 iridescent +3533 irksome +3534 iron +3535 irrigation +3536 island +3541 isotope +3542 issueless +3543 italicize +3544 itemizer +3545 itinerary +3546 itunes +3551 ivory +3552 jabbering +3553 jackrabbit +3554 jaguar +3555 jailhouse +3556 jalapeno +3561 jamboree +3562 janitor +3563 jarring +3564 jasmine +3565 jaundice +3566 jawbreaker +3611 jaywalker +3612 jazz +3613 jealous +3614 jeep +3615 jelly +3616 jeopardize +3621 jersey +3622 jetski +3623 jezebel +3624 jiffy +3625 jigsaw +3626 jingling +3631 jobholder +3632 jockstrap +3633 jogging +3634 john +3635 joinable +3636 jokingly +3641 journal +3642 jovial +3643 joystick +3644 jubilant +3645 judiciary +3646 juggle +3651 juice +3652 jujitsu +3653 jukebox +3654 jumpiness +3655 junkyard +3656 juror +3661 justifying +3662 juvenile +3663 kabob +3664 kamikaze +3665 kangaroo +3666 karate +4111 kayak +4112 keepsake +4113 kennel +4114 kerosene +4115 ketchup +4116 khaki +4121 kickstand +4122 kilogram +4123 kimono +4124 kingdom +4125 kiosk +4126 kissing +4131 kite +4132 kleenex +4133 knapsack +4134 kneecap +4135 knickers +4136 koala +4141 krypton +4142 laboratory +4143 ladder +4144 lakefront +4145 lantern +4146 laptop +4151 laryngitis +4152 lasagna +4153 latch +4154 laundry +4155 lavender +4156 laxative +4161 lazybones +4162 lecturer +4163 leftover +4164 leggings +4165 leisure +4166 lemon +4211 length +4212 leopard +4213 leprechaun +4214 lettuce +4215 leukemia +4216 levers +4221 lewdness +4222 liability +4223 library +4224 licorice +4225 lifeboat +4226 lightbulb +4231 likewise +4232 lilac +4233 limousine +4234 lint +4235 lioness +4236 lipstick +4241 liquid +4242 listless +4243 litter +4244 liverwurst +4245 lizard +4246 llama +4251 luau +4252 lubricant +4253 lucidity +4254 ludicrous +4255 luggage +4256 lukewarm +4261 lullaby +4262 lumberjack +4263 lunchbox +4264 luridness +4265 luscious +4266 luxurious +4311 lyrics +4312 macaroni +4313 maestro +4314 magazine +4315 mahogany +4316 maimed +4321 majority +4322 makeover +4323 malformed +4324 mammal +4325 mango +4326 mapmaker +4331 marbles +4332 massager +4333 matchstick +4334 maverick +4335 maximum +4336 mayonnaise +4341 moaning +4342 mobilize +4343 moccasin +4344 modify +4345 moisture +4346 molecule +4351 momentum +4352 monastery +4353 moonshine +4354 mortuary +4355 mosquito +4356 motorcycle +4361 mousetrap +4362 movie +4363 mower +4364 mozzarella +4365 muckiness +4366 mudflow +4411 mugshot +4412 mule +4413 mummy +4414 mundane +4415 muppet +4416 mural +4421 mustard +4422 mutation +4423 myriad +4424 myspace +4425 myth +4426 nail +4431 namesake +4432 nanosecond +4433 napkin +4434 narrator +4435 nastiness +4436 natives +4441 nautically +4442 navigate +4443 nearest +4444 nebula +4445 nectar +4446 nefarious +4451 negotiator +4452 neither +4453 nemesis +4454 neoliberal +4455 nephew +4456 nervously +4461 nest +4462 netting +4463 neuron +4464 nevermore +4465 nextdoor +4466 nicotine +4511 niece +4512 nimbleness +4513 nintendo +4514 nirvana +4515 nuclear +4516 nugget +4521 nuisance +4522 nullify +4523 numbing +4524 nuptials +4525 nursery +4526 nutcracker +4531 nylon +4532 oasis +4533 oat +4534 obediently +4535 obituary +4536 object +4541 obliterate +4542 obnoxious +4543 observer +4544 obtain +4545 obvious +4546 occupation +4551 oceanic +4552 octopus +4553 ocular +4554 office +4555 oftentimes +4556 oiliness +4561 ointment +4562 older +4563 olympics +4564 omissible +4565 omnivorous +4566 oncoming +4611 onion +4612 onlooker +4613 onstage +4614 onward +4615 onyx +4616 oomph +4621 opaquely +4622 opera +4623 opium +4624 opossum +4625 opponent +4626 optical +4631 opulently +4632 oscillator +4633 osmosis +4634 ostrich +4635 otherwise +4636 ought +4641 outhouse +4642 ovation +4643 oven +4644 owlish +4645 oxford +4646 oxidize +4651 oxygen +4652 oyster +4653 ozone +4654 pacemaker +4655 padlock +4656 pageant +4661 pajamas +4662 palm +4663 pamphlet +4664 pantyhose +4665 paprika +4666 parakeet +5111 passport +5112 patio +5113 pauper +5114 pavement +5115 payphone +5116 pebble +5121 peculiarly +5122 pedometer +5123 pegboard +5124 pelican +5125 penguin +5126 peony +5131 pepperoni +5132 peroxide +5133 pesticide +5134 petroleum +5135 pewter +5136 pharmacy +5141 pheasant +5142 phonebook +5143 phrasing +5144 physician +5145 plank +5146 pledge +5151 plotted +5152 plug +5153 plywood +5154 pneumonia +5155 podiatrist +5156 poetic +5161 pogo +5162 poison +5163 poking +5164 policeman +5165 poncho +5166 popcorn +5211 porcupine +5212 postcard +5213 poultry +5214 powerboat +5215 prairie +5216 pretzel +5221 princess +5222 propeller +5223 prune +5224 pry +5225 pseudo +5226 psychopath +5231 publisher +5232 pucker +5233 pueblo +5234 pulley +5235 pumpkin +5236 punchbowl +5241 puppy +5242 purse +5243 pushup +5244 putt +5245 puzzle +5246 pyramid +5251 python +5252 quarters +5253 quesadilla +5254 quilt +5255 quote +5256 racoon +5261 radish +5262 ragweed +5263 railroad +5264 rampantly +5265 rancidity +5266 rarity +5311 raspberry +5312 ravishing +5313 rearrange +5314 rebuilt +5315 receipt +5316 reentry +5321 refinery +5322 register +5323 rehydrate +5324 reimburse +5325 rejoicing +5326 rekindle +5331 relic +5332 remote +5333 renovator +5334 reopen +5335 reporter +5336 request +5341 rerun +5342 reservoir +5343 retriever +5344 reunion +5345 revolver +5346 rewrite +5351 rhapsody +5352 rhetoric +5353 rhino +5354 rhubarb +5355 rhyme +5356 ribbon +5361 riches +5362 ridden +5363 rigidness +5364 rimmed +5365 riptide +5366 riskily +5411 ritzy +5412 riverboat +5413 roamer +5414 robe +5415 rocket +5416 romancer +5421 ropelike +5422 rotisserie +5423 roundtable +5424 royal +5425 rubber +5426 rudderless +5431 rugby +5432 ruined +5433 rulebook +5434 rummage +5435 running +5436 rupture +5441 rustproof +5442 sabotage +5443 sacrifice +5444 saddlebag +5445 saffron +5446 sainthood +5451 saltshaker +5452 samurai +5453 sandworm +5454 sapphire +5455 sardine +5456 sassy +5461 satchel +5462 sauna +5463 savage +5464 saxophone +5465 scarf +5466 scenario +5511 schoolbook +5512 scientist +5513 scooter +5514 scrapbook +5515 sculpture +5516 scythe +5521 secretary +5522 sedative +5523 segregator +5524 seismology +5525 selected +5526 semicolon +5531 senator +5532 septum +5533 sequence +5534 serpent +5535 sesame +5536 settler +5541 severely +5542 shack +5543 shelf +5544 shirt +5545 shovel +5546 shrimp +5551 shuttle +5552 shyness +5553 siamese +5554 sibling +5555 siesta +5556 silicon +5561 simmering +5562 singles +5563 sisterhood +5564 sitcom +5565 sixfold +5566 sizable +5611 skateboard +5612 skeleton +5613 skies +5614 skulk +5615 skylight +5616 slapping +5621 sled +5622 slingshot +5623 sloth +5624 slumbering +5625 smartphone +5626 smelliness +5631 smitten +5632 smokestack +5633 smudge +5634 snapshot +5635 sneezing +5636 sniff +5641 snowsuit +5642 snugness +5643 speakers +5644 sphinx +5645 spider +5646 splashing +5651 sponge +5652 sprout +5653 spur +5654 spyglass +5655 squirrel +5656 statue +5661 steamboat +5662 stingray +5663 stopwatch +5664 strawberry +5665 student +5666 stylus +6111 suave +6112 subway +6113 suction +6114 suds +6115 suffocate +6116 sugar +6121 suitcase +6122 sulphur +6123 superstore +6124 surfer +6125 sushi +6126 swan +6131 sweatshirt +6132 swimwear +6133 sword +6134 sycamore +6135 syllable +6136 symphony +6141 synagogue +6142 syringes +6143 systemize +6144 tablespoon +6145 taco +6146 tadpole +6151 taekwondo +6152 tagalong +6153 takeout +6154 tallness +6155 tamale +6156 tanned +6161 tapestry +6162 tarantula +6163 tastebud +6164 tattoo +6165 tavern +6166 thaw +6211 theater +6212 thimble +6213 thorn +6214 throat +6215 thumb +6216 thwarting +6221 tiara +6222 tidbit +6223 tiebreaker +6224 tiger +6225 timid +6226 tinsel +6231 tiptoeing +6232 tirade +6233 tissue +6234 tractor +6235 tree +6236 tripod +6241 trousers +6242 trucks +6243 tryout +6244 tubeless +6245 tuesday +6246 tugboat +6251 tulip +6252 tumbleweed +6253 tupperware +6254 turtle +6255 tusk +6256 tutorial +6261 tuxedo +6262 tweezers +6263 twins +6264 tyrannical +6265 ultrasound +6266 umbrella +6311 umpire +6312 unarmored +6313 unbuttoned +6314 uncle +6315 underwear +6316 unevenness +6321 unflavored +6322 ungloved +6323 unhinge +6324 unicycle +6325 unjustly +6326 unknown +6331 unlocking +6332 unmarked +6333 unnoticed +6334 unopened +6335 unpaved +6336 unquenched +6341 unroll +6342 unscrewing +6343 untied +6344 unusual +6345 unveiled +6346 unwrinkled +6351 unyielding +6352 unzip +6353 upbeat +6354 upcountry +6355 update +6356 upfront +6361 upgrade +6362 upholstery +6363 upkeep +6364 upload +6365 uppercut +6366 upright +6411 upstairs +6412 uptown +6413 upwind +6414 uranium +6415 urban +6416 urchin +6421 urethane +6422 urgent +6423 urologist +6424 username +6425 usher +6426 utensil +6431 utility +6432 utmost +6433 utopia +6434 utterance +6435 vacuum +6436 vagrancy +6441 valuables +6442 vanquished +6443 vaporizer +6444 varied +6445 vaseline +6446 vegetable +6451 vehicle +6452 velcro +6453 vendor +6454 vertebrae +6455 vestibule +6456 veteran +6461 vexingly +6462 vicinity +6463 videogame +6464 viewfinder +6465 vigilante +6466 village +6511 vinegar +6512 violin +6513 viperfish +6514 virus +6515 visor +6516 vitamins +6521 vivacious +6522 vixen +6523 vocalist +6524 vogue +6525 voicemail +6526 volleyball +6531 voucher +6532 voyage +6533 vulnerable +6534 waffle +6535 wagon +6536 wakeup +6541 walrus +6542 wanderer +6543 wasp +6544 water +6545 waving +6546 wheat +6551 whisper +6552 wholesaler +6553 wick +6554 widow +6555 wielder +6556 wifeless +6561 wikipedia +6562 wildcat +6563 windmill +6564 wipeout +6565 wired +6566 wishbone +6611 wizardry +6612 wobbliness +6613 wolverine +6614 womb +6615 woolworker +6616 workbasket +6621 wound +6622 wrangle +6623 wreckage +6624 wristwatch +6625 wrongdoing +6626 xerox +6631 xylophone +6632 yacht +6633 yahoo +6634 yard +6635 yearbook +6636 yesterday +6641 yiddish +6642 yield +6643 yo-yo +6644 yodel +6645 yogurt +6646 yuppie +6651 zealot +6652 zebra +6653 zeppelin +6654 zestfully +6655 zigzagged +6656 zillion +6661 zipping +6662 zirconium +6663 zodiac +6664 zombie +6665 zookeeper +6666 zucchini diff --git a/initrd/etc/distro/keys/pureos.key b/initrd/etc/distro/keys/pureos.key deleted file mode 100644 index bf34dc827..000000000 --- a/initrd/etc/distro/keys/pureos.key +++ /dev/null @@ -1,51 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQINBFfD+ecBEADr5q0IAJ/8wBjX/GIVKrA19R0qaCKBjWvoWqT7EeJp0Oj9bHO7 -sTKqXvzpRZajqW4Ad1O3b4ht9rVrzLMgbc/RGK26LEFEqAb1DqZQfMXwKhdi6Hu+ -TeVbNqTUmOoisouwjKqT+f6NofKOwxukBqoZcnxu4e3t4xCQ97vFU80MIhx8tXro -HIyw3dQjsQvoajBMeshdx8Sfp/h2r7PUbugtn1vacLDF/JnKgBEmmoCdBzKyUygk -8okBs+L57MMDSwaSh5WmGMp5xXW+iahCfVEIWIVAlTOPm+jBMUkpkaQRf004fIT4 -WhIyvT5g6lc8aljBFqmTIPGCQDSLyzOG1LwsvEgDVWGg69oNYuqSNibZeN0ko5YU -X8V9IGNAZwmTVUwCJw58nK4lk8r5EvohjSIglFjhrbTZXyPuBb627gT0GSqHjrMH -qGTPe2wtf+OMSvPD27HNFQHeq54zBwQLwBdrSScO9QqIRat22UZDWt8O6pubZ6Fr -ay3ioYOqx/WnaA4nyhZv53ShXUNMmi7MuOpppqPzPgPgLbu1zeVcCM5DWJj7Q/9r -uRGrd1+6Gk2iVyTj1R+I4o4OznNQNB9mcVIVQKlo9S29YeLA5UAblZRW0lBpyEdB -0qnKka2hglH6kqDoewzOAER2zusBtnPGp3qvHu/u4JstGBCYiBwTfro+UwARAQAB -tEVQdXJpc20gUHVyZU9TIEFyY2hpdmUgKFB1cmVPUyBBcmNoaXZlIFNpZ25pbmcg -S2V5KSA8c3lzYWRtaW5AcHVyaS5zbT6JAjgEEwECACIFAlfi/n4CGwMGCwkIBwMC -BhUIAgkKCwQWAgMBAh4BAheAAAoJECtKU/K0HOByjx8P/13V3Ia7DK9MonFeXiY5 -BNFzF9lpgePAl4y8M1pbOHL+pD90N4KIV+uFvIXRympx3G/Y+lH3NhxapIfJcNHI -pue9Kziz8Py6oqCNbv2qlomMu8sXHOuJ6niuNa4yDqGNfPuJqVt5cTvsTfzKHG8H -lgD0f3H1+aj0WZofqgWxgAaIRf3G3f2NxPh9ng07OAKxDyBdYdTSrksUEhwSUCHI -KWW9YV8WfjEt1yznEHqfROJFJ8M+36z18uaG5bl2RdLo0x3Bm3utgXPiCkE9zW3V -eGEqw471kktAYd0rMEqGJpO1ifz6Y6eSfQLEVpho+mxI+QGE/E8DY2i0phxh+XN0 -UMd+xVR1VSEGF2VHeu3YTADBLZsYozzw5+BNnXkJy3lvrZiob2fUBBUZg5/yJCXE -/gAFAuWseQQe7N7qMdPMq8xViAs5NGs2lBffUPnH6BjWAhmLxiW4p2ptLza5BCli -bnFodlS4v737EvgH9cyctUBrrOy/totcJeMZ20Lxa+e2bsTUwW4SraLKUoAArcXf -Qtysh6TPTHMMZvbM9d9fqdNv834y0C7Eh6n/Ar3EdlurvRAL+gW/1XhZEdNj5yfY -V3FSSdXH3YN9AsStxxZfzyghAU/tYvPqslceSe/ooqCM1TrWD2dFzrCJiraM0LNf -65pPjODRzIxff0fXYj+z6UD9uQINBFfD+ecBEADHqYuw0BjUknJyIoP9dfWp1j2D -QhwjTLtYPvz7C77KlJ+cl56XyQJEqpuhQkVJ9GAX492UOLnZqvty3cDzL6JTcEdI -GoMrMvM+l2r2HMS/Ws3arduCbPQls8Ub+xacfAAz7a+amCgqSgl9UW3teaKEQYeJ -yGCLpnclWU4sF4PkNLQtLp7cibdYy34OGjHqQBSImeWP1N/tIU2GOsOSftuUBKtR -T/uVn0xUkegCy1m15o5TaGo09SvHlaYE92VU/P/SEDKn+CfC+eYqy34vRrcsQ6fn -0va64XYvYk+lFu9N770JtAnB7bM++xSCYdbXFgOtPDjjBYtj3yypGFDGmBSoE2nX -JmRCwzWldb4KRJKK1auvK+OE78hkJQcx9NgdGyrj81OqAdsurjtYDz/mF0/n/oCn -U/2n0orGzh5+PbjyIFjrwYtDzkqnibh4FBngi90PDOFrBsXkuP16oyVkQXPivJFV -W61lFPQXKfCCyuRjMAjB2dgw2PYGPFSiVAgA8lvzHnBeFobGheepzeQi7+YALwOl -ve+4qLWx8nfB507LPSNkK6vX2lZWWdZbdJfsKEBLZm2mHo59Hn7RBJxIV+2x4jR8 -3KnCYNpMx6Fbw0BUmO+v1hD97MvBBSTU9vCEiPfC226ljJGy7bBK7PVu2VjlsWeF -8TxEaqEJJWwb4hwB/QARAQABiQIfBBgBAgAJBQJXw/nnAhsMAAoJECtKU/K0HOBy -cgAP/RlP9RxSRlX8pHNYrbRwgdIsG270fc+EosLQziGjf1At64Te26ovfAzq3nfS -MfDkLozEQx4lwmlKoGj1XksklUd/1vcZ1MUWfpHA313nv+/pe3e8uBeCKZVxhI+g -NW3WJ0dwgkbtf52ACyJaCbSk29zuDaD3E7/Pv9gzuXXCrd+oZdXK4oWv3eQVMrzk -bVBHnY8G7Os40LlJNPldtlg7BW6VWTNFZ2l6fK/xVft1ZpJEzfjkSmC8UB7tcDVa -UBwNvP/pJ7DiY0iTaT8XHE830BUhwuHG7M/+VEMZu92vrdKJAanjHiU/J5DRqaDf -tGxqDRZauYUHglikmGx77jkm8yqvomXNrdFLCA4Ow5dCazx0uHsZRdByU+wIG6aF -A9aYnBs73RPOQK2ktN3OsUsmmxYeY6X5iEHCxuKksdbzw1SLkblYh07YZQpfhof6 -SXMa9BKEvGhc6N7c4UAUTAnMs3vyBW/jH1GJXMiQHoDiNbhAZX0z9k3RXz6NIAYU -NDP9qgilojBaqK+5JqIuzViQGzL2DBGuIknBt8D5iOdgZNVuUSr7zwwHeJJhKtQu -3SrGX71QNc3juLoRCOCVDqMopEeqb4g3o1V3FyGtyrIge4TuxxtuN67gkcmNvIHC -kLzFG4lNrRQeGTXnpkUbJ1jGgxXuxF59pRQnHggeYQmenEJR -=aliF ------END PGP PUBLIC KEY BLOCK----- diff --git a/initrd/etc/distro/keys/tails.key b/initrd/etc/distro/keys/tails.key index 307a0d896..2c6294985 100644 --- a/initrd/etc/distro/keys/tails.key +++ b/initrd/etc/distro/keys/tails.key @@ -11,361 +11,355 @@ zXSl42yg3EEsJlijBSR3wsIJ3+sWvQPMBdjgN0RjvoyI+zI7BeP8LC6ngz3GC8JS D5B8XNUYV32tlCs1ILdUPUF1BbxH2sWxysbpl9RvOG56JArSG2k+KlihXH5fmNiC NMWZ5vBShQ+bpBXh55fu3F7axequpWzocRfH+mfvBh5yvZnjDRGC3UZ06CFWN6JP 8wDFR+o8ZHSsq0Gx/2mIXVsJT6h0mF92Q1iqH2SQhFeRL3M+RcED6Bx33QARAQAB -tCFUYWlscyBkZXZlbG9wZXJzIDx0YWlsc0Bib3VtLm9yZz6JAlQEEwEKAD4CGwEF -CwkIBwMFFQoJCAsFFgIDAQACHgECF4AWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUC -Y2zGDAUJENq7XgAKCRDbuAKyWKzYT2Z2D/0ccl30KGx55pfkEEkBnZ2FVAJu8oFL -ObMyuWxNgZg70aMCtBiZzDmpJUb5XC683aiHX5E11O7Oe3X2+uWJy2VAVTbAprBe -ZCE0cgT7WH08SQdWhiLD65ZBTspweQ4nJMXJn8LoVO/P4+nBuKjdW4DMmbxid7nU -3h439DKKpuZuYvbXOZpf6c7fkCpzG3Nu4MbQuvSCQTDGxb6LdacigFd4NU6bFWT4 -p4e4/Z/pK7Fgj++sKasi6NVr00uy/Zc31EV72+b5AceFEOlxd66ZzFTVSudIAXAQ -9nONxDgu/j+ua1Een4Jx08bhx2Kf0B3r2bJqN2bIzLgmwTM8gubkZjFmsBnSIBNs -wIUvFzOfwFl/vSMWzOMrVqe5oUDZt+ehpXP9K4B5XpG5elEQ/k1JASdeMSYjJBa4 -nrCUpjwD7zamsTwYaGxIXaieh0uBnBpfqS84Je7LX0fPOgC5MuuJ/H5qrAnRwDHu -Kx3oKhuaKLgFFDslY1kKSZAVD+gUCwNSE3YFKfjaFhAe2IsXoCnycU8BH35mV2oO -HugJaSuyZZlPBHPO01nCYfw/oOk38ou9bXf/uNFJWcjwCk/n7gYkU5rPGf9MKoDD -9BQ4HMeuzH4AgWFUsWHwPFXYMYHnY9x6bMO8x4VfiM+gPwtrqC+Z65m6W2F7UZxC -dd2l1+WPzkydXrRCVGFpbHMgZGV2ZWxvcGVycyAob2ZmbGluZSBsb25nLXRlcm0g -aWRlbnRpdHkga2V5KSA8dGFpbHNAYm91bS5vcmc+iQJUBBMBCgA+AhsBBQsJCAcD -BRUKCQgLBRYCAwEAAh4BAheAFiEEpJDQ9NMRpBU+K7fK27gCslis2E8FAmNsxe0F -CRDau14ACgkQ27gCslis2E8LBw/+OKIM4+mZe4wPeA38iOF3DX/7WxUqITE3bHId -QzTfhOkNFXzJ3DfvgrZqnoqFm3HsaMnE1zFDhqMMQAZ0Ga+eFo789DSBNQUb0iYS -FHyYpkM17e2Hygmae6ofJGkHB9vAGQM4u7PxhOubeJPRoWiTUciBR2QPPH0Ttzi1 -81/t+nFTaHTdcDIVWOZ+PhvFB+xDq0Mvc73R+F0yzy1mDdwaSwrocmhWwyLUYpsj -S/wpCL7wDxhMYjQ3FwPq5rWLtSQ9Z9ClCz9ZogySQZ03kv5nZHnYAlXgRd19D2/p -guKFrEtj0M/k4KzQDbumMII2RyPTmDkOdwtIHKWpxhGM9J0ufbnH+oReUscWbodi -dTmj7VndBYAEQ5McqJdIlbTM1RSDeZzkpjHO+F4yyLP96iymfotMFaTisp90gXMl -cKrDrdmvQl9gsx/hoUeYuhiWb3JF1UCPSMSerysjYUYN16B2DzhvdYVQAbEaLQz9 -mUn9M1eWcNmOps1oQPyrA9oV3tJftTkn1Zym2C1/Xn+v1YAHLRlo3U44+l3bjXCC -EZtfFxzHjjnbAFOYZgIps2QfKZuszYVQOPObJRzL4YuF108OEMsHiWv2SnfWOe/X -5nz8Udj+DttvUoo9KhiTyo8C2flRkUMFNif+xSZjntF4MYPvBVe9Fxl00Kr6GBzY -C2/vkEm5Ag0EVLvR7AEQAN/E325mECH9+a8jCu0yHu5s5GOT9MOjyChyAFuont9Y -KiUj+1f3Eu65rHmuGDAjAz6NZS9ONENzIcDvrKvTcQbtfggtQJ5ExUPt6n2X7xdN -FW53KkonS+DjXwTQrr2vpnImb42XsNnZVBjaSzqpbxWF6rXWgTMeICWVuvkRfRab -8qNLh4ugPuC+dqVermt98uTf6eKa2sssBw4m36/sPXqoJ/TWahoCglob/uKbh3mr -2OxpDpzb4BSbTEwuRi5XP0VtkLroEYgCZxCCO6gH/S3zZFM/MEJSKqHcV8QdrR6l -6M3u2ILcAa16KtUMGiBH9JSXgBd/nRhDr4lpitstXJbwO6rZ1JCmIRkxUhMcnMdM -l9Kp5c1paoQv8uGOIgkji1BHf+/UN34ocvvS4XyiKbioOfWnAUYte6/IC2PC/6CT -yw9csvG3YgfvCPLLyXgaIzv236af7ZLVzca92hn/tjzZEKuvY0VokM3o3cEXkUZQ -mGXQ+vEVM4p98q0yrrgNGQjXXNulRmRXD0WTVO0HXWcfMtoOffkGlch1UDzTyl1r -g0LWNAC4l5aWaqbJiwXD2ahsMe9VcLLNbwPMl2v893veN3WPZPLCqDARHtRt7EQH -H3aV7jp/ngrdVZCBws0rz8AHAO5h69uyOqihdI6HNAgku2ie9d9WEMvBLYebeMZt -ABEBAAGJBEQEGAEKAA8CGwIFAlfFgOYFCQWbi3QCKcFdIAQZAQoABgUCVLvR7AAK -CRA8g9y1L2mcVlrKD/9vroqyOt3vh72V0Ae419Ll0fR67icPJYrg1R4+PcbERpr8 -rWf4RiVIaAxUzXkqBxjXiFUBXxz1vJ74+Zj8H7YyDHSsCZItjyQ1+VPv1EKTVgfr -mQQKE5oaTpqomaK2BGeZQGftiaCDPuohen83ZsEM+X09X+xr7WLrSyJRtgLLtKGa -dWuM1FzOiJyQCeCghBFjAUQKYWZJt4FdvMFPHVGba7YqRUSM9ZXM/hNhiu8rs8S7 -eoh8KWkms+E3rabBXZFnD+xKmSYCNPkQcAe324DXZhxQO9MpPPvpVZWEAVbhegK+ -B//EMUuP8Qpzv+shVYdVPotVZ4U1vM7WPALTz0TCSxkM9uCwE6eH7WAj1eqNHgJz -pjUPwxAb7EoDq4Q0yDCUQeqGqfiyYGPwI4RUL0nEjRJhOatcymlah+etdcvvEwbb -BJFFY60XmsQoagOG9za4oJpH+a/Y2DwL0b6AAumZ0LuT71EeqLRyUF0zvMQZf+3c -+dE+TjODhTNAwZ09F0sEPqSLnN8d6zvdyHu511sZYh9W45Msfx41Jh/7bpOsG/Cc -mWBAgP9kYAGwEseqoWJ/wpCouxSNrKvWQIiM653L41EUK3YbeCnaMwJsZOgHLzzl -c1Sezkbu7sdjpjz2HoVVO1SXI3CNsPfJxzxVQyr0AfdNnPuifCW2L9kfXg1fhQkQ -27gCslis2E9U/Q/+OMnllgXqDcA9T6mAPbptusxSd9p0dVeCgr8kq92ONej2b43d -/Fj9DtpXX57hWMq4COCv7aAlQzx8Zp2kZHNSczI/0TIzt6GHYq5zMTFwy91NxqfG -jip4yTL6/REhjtr1f/ye3ifX/SLAUNfbZDpMP8Xo3EP6gMy37RD9yCRmIZORfYJL -uHRlGpn9zKu1Laa50UlhvV7he4KDiYZTpiN4APbsRAIpjFCalRcd0rrxMkcBUPaE -cTzS2TP02wGS+60b49xoIZELKC+9nmK8JK90st5rTGUKOd/SguhkN3bVHlPlsFf9 -rWhLfjnI9+1qXPsWChRjJT5c1sh9oZl5NbTEje1q+vum5wSV4Mk7PqKlPjzwTlz/ -7QNJUP82M4rkEpK4tnOYmkNYpohOCRu6+suUgILG402PNIY2hJZf91F1guRlnE4J -G6ihe1Xwfi3GaBKDtzYaXO2ZRLRlQ0OYULvfUVxohUigEBs9pT2Dfe2l5k91N7tm -8EouyZ3UxSLDom16ZLjo3upCpSWzqgx8P/25Nr3B8pUkvhMm/Dxt0ehNIvjyjDAs -Ygnys3XgQ/J10OjbH4cUFUpmSprLp0gddODa21JHnHCq6cdPwpdNy21Uwe3B4ozn -I6WpU/9icw4zI7z3htVkSg8sSxjG4wFHNWh4Bb8OCdqpjoxAoGraSKGFNbm5Ag0E -VLvBMwEQAKnvGNhHuyGaraqMVpyM/0Upz3hoECl0vUPaXueHjeKkxnjBg9/UxUeI -ah7TjLMeoRYfqW0WGZRqIuKpxUl8KwkE06NqYutlu7v6w2WT8odHI4NcC/qFtGZ4 -07d4UIqPT9P+pEWYMn2rUL8dJnqoXm3ctUi6z4Y6fAs/k/S/Crd3uAhn1LmbUkEG -OMPsotyFLgkrWpDZCXISEjK1yH2Es3p8c0cQm30wjPimHYSCMTNTli/kWe9t9J02 -Q0j0lBbAVmWDmYf01kdeSEt0vPLuHRuuwvjDNPm7k3XbUVr6bV8vLhpIsXq2Fwr7 -XqOxpomEDQHdETwB8jgswwgOOiNkBU8d0+6IIdoN+ucueszQzE22FnAXC4o8Jill -KQrZGr7b0IJank2uuVMqpTigOqZQvEpHyccHgfRcsUZxm/G52/ctEKpGcPdwDOyk -PUXDfwBq4aryTqrNMOmtVISGNN1FndK1B7GAuGQN/nD9fyE3POhNiZ1l7dcoEzeF -Tjue+FN7LtzrmHb0TsonnrL+t36Fdf0kxwk2zCJKoIbJvRTESzWNCL5SpdYIg/NU -ZIVNZSpiKRtwNNVb3ykeqjoA/YC8mtp6sYkfVPtPMO8XaOWsSf9QvwO2rYTx/Jcr -W14k4vCOtpWW9QNa/6yTjhpt/RT9KxdQ1tQqT1HRrEj+/xd+PMYLABEBAAGJBEQE -GAEKAA8CGwIFAlfFgNYFCQWbnB0CKcFdIAQZAQoABgUCVLvBMwAKCRCY/sa8dSo9 -tuzWD/0fusAtGkL+TWD0SKqzVvMqwQ9asgVFjIz4cr/rugN6QdwWfvT1mNqAHrVA -7UwVkox5uZyVTJQZC3F7GuOPtbFDtmBMG5mlL8HPLdDufK1HmpXtYaDYsqRG6gjO -qvGjvlUHzqwjq1uRwBT2yDR9LwCO6DdZOsIdZBJbTccz7m5k9hZ861aZ0bifm7U0 -mgqN5MGvXcVzGYuDfgX8rfmC6TPaYY2QPc30QddUU0Hnk2VB0llvDHR9iR+g06K+ -FtpGbdS9rVFQ7itp9JJasQcfNVNJSKZU9oxZsvobyU47DmpDqWGrfGyn0dTdujoS -8wnasRjq6drDKMBa4IlRb21WVz7+2mAi0DOGJDlr/pGMWP7NKNLXAWpwsv5PreAF -BnV7FVAls5TIGC1vffwFNh4wdcqgfQj9Oi8uIYBvsuWYGLn4uX1l/H5Tl753pwrk -bB8NFVsdDM0dJXm6tpPJd3vCWcg9AFn7PJAVvNGd+n3uXPvycAHPkSIKYSGM69ms -o5iTgIJupJW8P/GR0vPAQkXR/pimFBxZYq0DFLqv6rsHmBPBd8iKHcO3QJwgnJwr -Fft9JIGx03byDPdGow6uxOh+0E9iYpleedmQxcz8Ids6QDywtv/uXGFUGdk1Ufhl -G8/Os3RYG83BP873O1HyyzyUp4fWWIb2P3Qd0tZXwVJYQvNoQAkQ27gCslis2E8d -YQ/+Jc+dxvw1zDPdjS5iZtQ9SOQi09SR91h1V/YEN+k/eWz8Ye/2hNVzoJ6wJIFv -W19VTUOZf1xUcf5i7Oe32+tWKG8WjO4P7OthLlKPSZJ56p1jbI9KjwjJgdfbOAz5 -ZWWvgoT/yrRuFaxwCqynVxBflAmkybqrPL262H1KSTJ1HhdNLvFmtipuPLkkEy57 -Au9Q5roLsvyhEPz9O4B1BujjYrTU5zdoueMIrCVXE8o8URNP0kVIICdETSKpA+Nh -AbtZQhZF4RxGG124vaIX2hNzBDPLI1f02/XW1ePVFABPbi74EyVc68iJdsJEk1nL -2Nx6pfr7t+rsIrN30pFqx1L9ayKZbKlFyej34KOS14mo/rBuMJk6scu4FcP1jcrN -DPTpblJ/NmDbQQSxyJHK1OpJk6NHakDZkNA0oqXSW3uco4I/v86D1WXbEb0V/hmD -bGs/LVcUR1ITnpADbPVxEMltadYSLU96Yx8TCfJJEbeEUk1XuAGZ3KozDLFPjpr9 -KqOpw+3X0YxCRRshRjh6Vi/4ewQyw9Hww+jJF0N3cmTwe4saGjgjPxC6mN39Ufv1 -+p962Phr/XHPb5rtUysnN8Uh5RSegqD1PCzru4fPpqOv42wxLvrmQ734oVARrrNX -9APa2vRdtnya0RzrB0EsQ53+e6LIJf5RDWFcF9mmPO3ULfW5Ag0EVLvBkgEQAMiv -p8Yhjdqpn5VHe6f/+JjvK3Wggp/O41Ud5c8M01gHEAqtwKa5/IJrCqX3vvmgL7rl -WNfrJzA9tkT+kz+IQBV5vGNU4zEgD6O3a8yWTCetw/N/+BM7TNsEVLEQsn8Lcyif -gZsQ2nBSbpEv/2IPzh0rAlOdnMPLIWDSxBKqu4i0EABrSmgnTEWGnFCx0pKTj+Wh -mst36SgxjGbgrkkpRq57ubhjNfGAHHYqaTpsCjEKh1DrfrBMnCjdvd43/GOZ6M02 -AVn2wB4sum++k6CTj6hE3eVTgS/BtdPQ4IqrhmwVCet0tXtarQK4Smsgszd/1+vK -slOF/uXGGtZWlTyNVTSF7NHUgw2EGmbnOzAcko3FjTDmo4NKxqhyPVXwp3Wg4Fug -45xgkyHIiLBz8hd+KwkxQRiPWcJPWwWeP/Wxzb8iY2r2MUNh6EtOsDMkMcj6lpX0 -L3IHXjnFRPDubBK3Hc7daDTQz4THoQ8M6m1RRqXCxL4lkcyZsimcZwsXMWuX70xf -4t7c5NWuH0EAWWCe0i/U6P+O5gq8nT5R39rnNFcocAPWtJ/F/cCJneeva/O6+/cV -GIGOBj3tQpXT5HPVxktXl5meCanWvkaccLTNWxnUECYa9td+IwFExiAWh9xKG5Q7 -uV3TlOIaaPQVgRd5t9h+85sIZQ2gmhT4cykvgj7RABEBAAGJAmUEKAEKAE8FAlYy -C+lIHQNUaGlzIHRlc3Qga2V5IHdhcyBuZXZlciBzdG9yZWQgb24gYW55IHBlcnNp -c3RlbnQgbWVkaWEgYW5kIGlzIG5vdyBsb3N0AAoJENu4ArJYrNhPi3YP/23Pk9WT -z13Q7v9vwtNJm9IVqUE3SOp3Os/W8I3alh6hrcYD5INwWml7lrk/GhcEU3plNdGu -yice5VeAVETJpEJBI4iHw6sdMWImVFG/2xhSH94X4Jj1VOdefUieGUizLcPz92cq -kZ6W5Tc/8tFDfg0qW2cxz2Jpl7iCJsy495G2WcxMV0e/XCCKlfyFd5T5hy3GmT7r -shOHmfiNsGgusoo/s1tBUYoRuHd2cI2yIj0g2iOiLOAbRABbUkRAed3g0D8KNdxX -+25fJV1ZcqJonyikP1QPnslIxUsMuB6srKz2nMSF8kRHy3RjSJr1BrA60SxDhoqJ -YAWcpc3OtR2PcB3qkYqLEAkiZLAo/F3L9PaeKLK6LbeTZlpXUqynZz3bYm/r6+Qw -gkqe2pxHG2l5epyinwEqWqaJEGZrYq8RWEHVHgpGvU8zhCb5MJgpaC4H677iicbJ -+bFGb7GHxAHzHJW4/xKT1+tWXKLij7bYVM9+GQHJtpfPLCZP09wZb+bp/58e8iDi -OCq6XMpdcWsIw2JPQAhHWcc2LwydhzgdNeC/pYog0T6KcUKs2tyBzWQYS+qezdaz -LNrD2IQhpED+zYSjzFMkzeaTaVBTfGIAfvvmbmPdmAO/4cjfN5d8cTLXCslvqOWf -tH0bQs5yuYJw1H0XL94Z4qqNkzGTB/AQMxMZiQREBBgBCgAPBQJUu8GSAhsCBQkB -1/kAAikJENu4ArJYrNhPwV0gBBkBCgAGBQJUu8GSAAoJEKqeAUZWmHplkY0P/0Mv -X2pgW6RvrcubCAAPjbQTl5uqkClWzUUHeFYFgQ3zjJsMkj8R2YN/FnwcPOI/7ioT -VMTVDu+aI/H0wgZeQl5HPptlBGjnB0crbifFTNC2Gi6IHompNNAvoCdTAzByy9KK -oPCFBcHMc1yLacGnPreBf23rDy3uWnLPtgInSPT8bPWUba4VjTb7pXIFw3Vf3jn+ -eg/yAaj7NyZ99g90/P2lXPc5tsvzoUvfJ6jGgXZzm/uD0q+9jp6BZ3LLmFotKF6j -MGeW23wJGtFxDKozhI/z/yIZghykOuQtcV8fe8pcMi75t43dZXo2mleIlU6ANexg -PZJBhKNTJMXQE4gnqmLevtSyc5kpSHqb8DS7zdhvS/FuDMSJpJraoB/gS/KMiaEJ -0JlG7lm8NRu4IOgzsonMmHzcxhZVAdhnPVpltz2GmdLf0CS1WPAfq6xT2r7CPEBV -cOGTJoCVDo5SLPyd5r+sPWZyPfcEtj7Ed3WrD1RKniRt7SenXnTsoGI1J9lTW/+U -Dg+igD1DPD7Bahl9mI4/npa9IyNScKIFSLnFqx9VG+Mg+d1+ZWJ9+7XhWw6C8pWE -/W/OYbshDT1ReAkJRZCyhhJgGuHqBdzpPBYSyZqM1ct3QJWGVljZ9dUDpYigEuXu -+q4vWZ+5FMoW7l74J++/HaEfsWnx0SkhiGL8aUZ43UMP/RTSPwl/74wT/SHaHQ7C -SMR5uNDEXrgt5VdXPcah6aQroXkNR44dwHzaF3tkJn9kzseMc9f4Sw66rrHLJCsm -TYgJRxVjAws4WaQuIaB+DRhdW7pqAURa1QsK9k9iYYbtC14qBoieuj4gV+Furaxm -TB/vx4HgJjeUy9Wld2Np8+7V3ihGXwxrL4evCXo9QDvs/QenVYF/MhPhRGE5+GqC -Dv93finBi9/RsM4bfiA406cWWOJwwjjxMrNm1VrLv1C6PHMb6JhsjDDIkjDfJ50a -WJdPmzSN25S9tllx1LVpdLWTQpc+LEyhvyyoJjveON1CC0Akn07cdI1ZsavBKhCG -f8gzO9c709I6cmXvkEPW05qgrKcU06NRHq+bFqJsgBeO/IhBid51uG2vREbc9WQT -nNYUOyYDpAxtriefn6442byCK5FlFc9P/VWFIR952GaFyGQuA+1kHckunzP9g5eB -w3FQbIvq02KittfdKwRRPw/8RzFVGyM/GLS+UM7UNzCHnWPQiR3w6rZ3xTe8IOgR -ORUJoiwJ/6HV1FXRdCfrKC9cUBniigOx9Cn1g201XHiua/yedfV00GWnOBDeqDFB -pCBrkccGqUA50KOiqBrDK7bwGnYBI1ZdVAQGQ2UVh5R5gi0fLDI19pDdeirOcNj4 -gyqH3EH3cSS/Snj+jmNoE2hriF4EEBYIAAYFAlpea4QACgkQG7icBgI2dEk8YwEA -hv0jnehPJEEVjLpmp//s4/B1kclyGIfocV0Xzg3q+YIA/jQR3PKFCLStRINId17i -Tk0HJQku7ymdUNg7Q7rZowgJuQINBFfFgTEBEAC2tjoU5TRY7vKa6CAjUt1TJwx8 -IExEuPkCHgSJG58w3RPuVOVEpDEjKf+fArpCEVDq1RpVogEmZXZ9BvJzaz5ZWXHX -A6kC1SJ3AScDTiDkR3jnwY6aRhFjJaKlrklfplsIO3nlAuK8UqulYQbHvIGTnXeO -pf1Ts14G6YXDk8dr9RB2DFDKRtTCJX3L4vR0Qj7NJDvn8Jcdg0btZeE98eboCBk0 -CPYEnRZKrAk+QD1zBlewMoueR6MJUWWFcwPnvUuEhmq02KYj+MKSnraa91oW9Fkh -8hZ/LeHPs9hSJ2i0XLQxawGbNNkL/zvibbZi3VoIlwEpKJ64rdN8Ug3ie1foW86I -nH6VsJus/GZ+Njlk1kMD3nuUzEJkTdMidbGh94pT19swQMFh63kBj98zrT6nlGjd -xuSiMz4mDdFHPaEYSeJOk3nEwSEJweh5cne/lG2rQPy6nXfEAJsAdkB24w2CJzlM -bYDwuhnRsaoxZb8NYjxZSSEH0senR9W9uor9HCbNio4QwiGAfb9ouMaAE8skLLe/ -gHDv75+trrHxA+/9QUb8KrWFxDMA6OjYOi5uu8AuF+jHtYW5ykwcPyDU2F8A52Mg -9d5ej2kKKq4rIIe/uu7WeEusK1DFUTYmoAG8kQ3009E7QXfJXBJBvUOjuhWTMA5f -kkXx4O0x3gLiWQSEnwARAQABiQREBBgBCgAPBQJXxYExAhsCBQkCkdyAAikJENu4 -ArJYrNhPwV0gBBkBCgAGBQJXxYExAAoJEK8pK0Sg7apB7x0P/jyToiSDmz73z1PC -vD+T+xxSYTpxv4QX6SK8Z9Y+ZZbJOkKw1YFkzbz0pSXbDyRhX9Bv0/DO6kbtHmmo -2Kd6IydZtabIdrrz2Zd8Z+FqvdeTEoTHmR9ihJooFRSVXzxpLq6nrpKvtiJAOTb+ -GPe9JQsaMJYJmLXcZX+YtdbURYV3+S0spvRLsLsp9NuI2ralYOsSu7jKvoKDinop -1Li6AOWQrDGTy0w0Rh3yVorFoI85iiVcBKVn1L8KMsf+VPPlsJEDUU3AK3YjuFsh -D0wtGszsRqK5KYsTPX70NTQaxoXmFhqfT6CPiE3SiITAeCVaVqzre5N0OG7V8aPl -NdaitAJf4OK4oibg+Zk5xAB3kXqfvV04DpVz4kkPyQI6WFY3AnmA4TYFFzEKFSAO -eVn6jKKY7DvzeL/aPLkekNFqOv4QOfY1LdtrGKbW7L472Z7rp5IRqwI9YW0lRILU -ZS5YfGMJSwUJPAVjKns1MuASk2nppqCpPl+t7WFK2EqBs74qa4Q3dsRN9CyUn5N9 -wtZ9s7or5RivQJP0q5tZezPaLHA2xTi5Mrn6tgSZb0I8VRPyW+Ez1sic+L6VuxEk -7AqjKj4F/4GpELv+qrENJJc17D2b0vPpSfTBkzLglJVjVLoh+bZhymc2R1NlvDmn -jcmrn9Ua8F2QJ09NFCzR+l0HkBtz4ikP/1LJ4LPllXdvg3PydCLgv067dGK/QtQ3 -Aur3vlOO1obREC7XD4TnvfbWSG9WblKpvMoHDwFvk18niP9ZKSHsImm862ZETiVy -EnY9BLmhtaRUdcpa8YtbQzq84Fk0NhDY9Mj75BX49Zk5cPDTI3pN9vUfl5kbEC+I -8wMhJTvpWJCoqSOlJcYOjCDjLK/ERM7iMGxVHjrWqd/8PgbTb9B/BsDw/eAJjdzd -/kqVvQMW7jdpQxEwt6BYtzmUEkNz65oXROhHz5lbN0r+2pE8MGR/3dbDqnprpuHd -nH2irUssnEIZ2hrnXnD7SdfT+3bF4TGrrLHSgs4HD0fwSPmeTYDiQoCH0yHwKQG+ -cyrfngzznAFy5taJM8Sxt47PG74qd2SJuRqNlt5cJPSiA7tmI7x90IRAOfk4JY8D -AtyahYOU76dfWEi7Wjh2ZUUiYYBO1Cj64HclqNtJ9qvMmV40+59XgO4d5eSExGfm -0S2LuqCGePJ2B0aG1kXFgaj3ypUcVBMb4BdHNq208HX4ijuOWXD5gXhuPHU+u4eC -9KDAF8IubxNJOuj04NpaMngeB1CABQxRMg5Of+E5cIkvcRlrJPIvULEk8KAWYmCA -g9jEHrkrnWjy92xe6vyvJnEMftn1BwWaRnN8OYCABlw6y1zOMF0FcfUd00EBKzfb -CWHu4i7QXqHDuQINBFmkPJYBEADNvkjLcOjIVaOKoy8X5QuNurriz54O5jpTWAFh -SgxUo//FHEqlFYCRUDdDuMD/fPAiQXk6TNAGzN+R1guZtj9ekCI5x4N2wj0wxUN2 -Jsq+P+zTLkRQcajbTemOsboI/w0+9BlvktBFV0E9yrJW4qbOV/w/DHWUq3JIggDV -aVa00bvEAdJR0/uPJoGip4ex2Yh170jg2GbtsFvm1ue8lwzSRbXsDI9RNsVa7hoJ -t4TfkLTYkKTd0oOQvP/LDgcmp5T6scDOdPx5zYvwF37DuC15Y9WYai+s6KLDwMy2 -COBexE1pLwqE3OV439BDVsFG41zxmWUYUX65PXtJkD1NMJdnyiPf1KFEpzD0T7d+ -lnSPLJYx4Te5ahaZ1e8Slwa/q67ti75kMutR5IV0EPEg/vY4bmEutoST9Y94ocAr -Z+0fex3DsVwXMdyMS78zfnm21bMpsgfJx7YZI1gFQXAKtVlEWPHajyjd2tCysYHy -1AnbehkHRIsYVqXV1AwF2bSN2rKf+nCTjvNgt5VNAiJGy4N+QuXFy5X4NdgMdYq7 -vYT66IeZwlT9HV0wEB1jsX1y+50faxfn2YOPFpKXzNd7VOQDDx19J1IsNw2Q7gnr -4woqqJw+bLG7ClRuNfN861Dlxc52sH6rjdceiFsLKBj7T1mQFAUZB7TCMIvK2rry -lc5iXQARAQABiQRyBBgBCgAmAhsCFiEEpJDQ9NMRpBU+K7fK27gCslis2E8FAmNs -3isFCQvyV5UCQMF0IAQZAQoAHRYhBAVGn7herWWJtD1B09IdrTivKBwLBQJZpDyW -AAoJENIdrTivKBwLz48P/jgM5REXNkh4oW2GHC2ZfPMiupF11zTBKWuIrsjLzUhO -IqMypbKDBAQfqV+TSal6RTvvZHQxYUxak4OK/TtjDL47XzHGQmzZbFndH42XVOua -kD5dT2Sv+5oWNSZDz+Yk/1tg4aRCD1MqATPD7N2O8Y7+NFU2dtQLV2MPa/70K/Fm -LiXmQgGfhKxuqWBFdpx2xNlpIpCPEnkNgxfxUDW4Gar3f1eHAOuCt5HtturaiHID -mnuKz68epX2PVrA8ztjN564vldboN7ff5F0pUbS/Jj4ccozOGdEg3gt15LY2eD4f -D1oX1HSwfqFvB54gSlCSYX4nkfXkjid13CjAYAfaIbhCZ4cunivMD9og5sK0ZGTU -0fGP6TTTeZdge7wjzdZJj9EoBgclc5H7McIkuGYTaTqowe6134s6W2bDJ4AsGkjR -ghRuv6XsgjUz137gNkT2P+PNOBV19sTV3haz4i6gBr180xvvtOArwP1vTxnAa+Pm -s9bJt6W60PO6kjWmDXnPykwq7fpmI7qgJ2svlqRcLN3GRLX3bc0jCpspUEWAiq2J -QP3ejT2QmNF8GFCITQSB64Vb+aOBE3aifBjt82k+KSvy/P8gkPCc3fsxdYSgnesr -k6EngA7vOM/x9unm3yPMctpT2kKav/xh0IYQdsyF6QX/ScKl3kvuRt3LTkx7nd/L -CRDbuAKyWKzYTxmZD/9XRg2sgq1M/ZEpIv+rGH3eZnqyPDM0oh56upTvRIG1y70k -8SoxFxHUMd5b+Jj16pXhKIwpdH3lybOmiJVw9HF101YLHBV/kOhRcG3sAg69mEtw -HH38PH+3tClwH7FOwuhDJsjff1GKqaPb4ZrnHACvTIZy92hF06RSgLj4/4J1TeeY -sVVfy4GC3tTPheHXWVGBV8vQIJTg2SRBiwl9rtxKfN0cNR2vOiHhypsWO7D6mnZ4 -aZPvOB76BUXjw86egEsxbMDcdo5DMmqLWjWnEilDQn4UH+uK2fCxHTufI4lD2K76 -QZmT8cGAKMUrf4wXw9W7ysn9Pk4pnOJo/rzsyaz+plIx6o+5AB8EJ+LAapFUgsF4 -lXKw633asG9ecdUROMXF/F3fInTkQjE/nxBSzHmcMeVBlYPZIUs5rcdT66hOSaip -50/39bVctMTeCxMnXycCrPqPVGriSpJdjEE9khrJ5ifFT6CYMkyBtL5eVzg3JY0/ -touOkKPTiywVOWiCWm8vgraGjxPHAJHNl3joBfWUQMdqcrjf93kR8z+Dd4hX/uOh -eutIgWqfoWF9RWtRfwXdsl9BP+ngVUdAlbagNE2/R8lif7/F8Bmqa6kToNI34wEa -9uf5zE4v243vqrSaynkIZAGAxCmK6mv2B5/ua3ltEtTSto9ktaIod449MIgInbkC -DQRZpDyvARAAtfnSrtM7lNxN5FPfT0V8cUpXW5D3jhM6mC6NUSvKSDAeITNdQ5Rv -o+k2GaN2dORrFSTRlBnGlF2DDpXY128zcvJakG3jadgGvAMflrpTDbFN52591u/+ -JGbZ3rhTSKb0a+Vmo4MxDPKWF6ic69Ktk2NMze8pgJMpaqBSOqjWGnVpQw/eE/aO -PIqz4NMLLFDR+UdARmNOHoopeEG0Gvktvphq+P/6i1nedVCgAmSyiBujtHauAxCC -jXfiSyTSieWENS93Kufk7SD+bJJ/kvlwVgd5zV6kGmqk/CSQLaKE/oKzJmuvGZpU -79Cz9XKfeKHdi5jxJSq1S85OkcBrL3G+Dgh4Ahm+IrUKZDjMb/5HHr1+WkXwOz18 -gbvI/aUD50luHLrFJcsoJCrCT4oyUrpcLUjcVzIrQ5cndahansrJox5414iIeptE -ef7D52q8Kt+DyfLSBjudGV0g7mRXEGDpJxBPhbkGJMwCoXTWlV5mPafpNIk1HR6i -gC8ndBGxNk/yENfSGQpAHmVR9LzfXwFBdoDgUL1CzAu0iGfiRO62rGMlx0ZkUADL -REpeLqZexYmQ3DJ1G/czh9f6aA1CDbD37kZ83St8GcDSFI+jvud5Dn7/zfOp+B61 -Ykn3Zm5dHQ8BO07LbbqyAH+312aBlCWdsj8sIGF4KcxQSzuj1tuCLUUAEQEAAYkE -cgQYAQoAJgIbAhYhBKSQ0PTTEaQVPiu3ytu4ArJYrNhPBQJdnIcPBQkF2X3fAkDB -dCAEGQEKAB0WIQQvr5ug1luzcfC8LUYwIKepwrcnMwUCWaQ8rwAKCRAwIKepwrcn -MxWKEACjpk4elL0hsOygwHaWilUwGIWnM/s8J/COeZ4aPJYL0uBRd4duvewHEf7c -Ws9N/69HRY1m5o1wI/lBOKB32QXMaaLVXDuMkuXrZaNkT9D4WdCJ719izhkBQ45d -OWJvoq8aJv/Q21ZiQF4KqMpbgoIf/LMr9NTR64pc3j0W7QKltgtMwzK+mT8dMS+x -pbsas4T7SMmzPuSKcGHFgY9yCnPUp5OBKXsegPmgcrbL2MkQWTyziUizy+3Mnr4E -rKvqF2HKPZzepShrS2dnyokRhFULfS7gV5pRlHMUfar+SvUZHxSEScmaE9ANTDfG -Lvg07g/JA9p8+6lBlmMUkC7p4zihcUIoNXehfFsumReFea5qzQn7VWOQEYTNwtv/ -/rmYiXtSCGGS3Jt7ZU7gviOkmnmOfkpC3haxJAYTQrTxoIVoDqALXEU2Pg1jNiWl -FKV7kRBGctnHuOYgjmgKxIwmUO6ufA5grrE16peYhkRLeN4+m+pOG9swUwtvVdzS -7zY0Qq0qP5zWrh9P13znHb8zexd9DafgIGbP7lJqPP1Lh2/Kc676/SpyT+2A8teg -sFdlc7yU0fHAOcbhOpMccXkYNGjqzAUnqY3K17Pi4JHHKM0xHYmRlZYWJ2fZb5IN -54EM0sGPZsOcIa1qg79qzjrY8ep0XJOLK3DMXKTjlWW+zxhZlAkQ27gCslis2E+5 -hA/9FQDQu1N2EZl7FrrAdP9xO7y1ZUs33gys9eA7bY8ETMlDqchnEbnbqP25W2yO -bzrKtshVn44fWUGOwSmIDfVm0ATkuJgMReMTo3APfOHlV4HKlMZYMF7NufJs4f+0 -/DYCq2FN1ZscQmph8YKAsTFKxXWNw60ilfQoY/KxLbQ6YTw8rfd2FM0ZwjV1PbsF -7HR0FkZjbaJKry1vqtOS+cjs360t1rclm1KRMV9/yJJMow2VV+9FIhbZMowrfZI7 -Qx/Sx1pYNT07D9dBNeGSRnLWEubO/mb8s1Hzgty6CEf6qlEwdRMVELXaVJcf53CK -EqZe6uhVmTq7wrmbpnb/I0Wer6igL+aUvtkM46O8zVCT6T/mnsXyoCV6zmCPYM9R -ECEyRACx4Ik+ExjLnRLezYhOkl7uN3qTS5rxR2otbESgWNx9L85Iz75ahU0zas4F -R1cZ+YC2fCRAqmPveAidJbJ0ZJrx/JH09udX5LafUQIVkY6xmoE/9T8bIVSbDFwi -fig9OdP/OtaDJBS0BOfQ9QdlpIWe2owVZa9Aa54U2jjiupCGY0XB/LoNWe02WGUN -amnXegG+pHGGGt/atMAFAtsAJeXpLIddO3mQdbR25QgJ58fHtkX9y/FMT4bb3FII -Vfd4PMmQibGXEwi641+MtwlJ52QVZRmL+2XahXoqCx3hpPyJAjYEKAEKACAWIQSk -kND00xGkFT4rt8rbuAKyWKzYTwUCXtE6mgIdAwAKCRDbuAKyWKzYT4YwD/4+b6U2 -Xx3aBnP77ZhS4wP50MmXRn6LAvN+RIcq1FAzwsXRe0zwP0ew1YP8743nOjoFVOZG -6iRHNOzvBOBwQ3wvlN7cqa8kFWpFtNdN1yFFIjO8bDFtPkXgeFmgAJ2fS9gj5ze7 -5H1/bRqf3NO9NVWvX0C1sVJ2jLJI+LSys+kuv9YpPOZeGvg5qgaG8K10q/Ic8wGB -XNi2j4Wf1jBzDDlFfRVb7doUrEQ6BeNJDhaOnnvVWBZ9E/iwHT+GElvtVHhztuKo -qp10KFwudGm/Z4a5uLX8RZxtn3OqDdyQ+BX+tjy04dcKV4fJHnh5Lsfz2AMrHO0Z -8mipu6AOxCMHhKlZJGka06YkeE3y6cOC6yWoL/tzMCpJUczLB9JA6+gu0sUSXTpi -tsNhY6+56XPHSV/3mBcjY4o4udnDPcWF/Eji1tIqRo7B5gX3gk2n+WTWXRdosGb7 -PCSoK/YppOHrR4RWyxek9w+0d6Ud2SMupvTu9zn55zcqbTX+66yfpd4dXw8qIVTb -9yLcIq3A2wiegZXUJqJYpbgC9cAMmL19S340zxOJLsEeg69XDOKilZ5OsSUcoczt -la554wAE7rYd7x9UIWwaVq1r9jle1T1yFlznOjx2iES13VMfpFIq7uBOvt1GiY3n -mGG+F0Eu6APcj8x8WP0bB2+UfxO9LjgBhY+1fbgzBFmkJ7YWCSsGAQQB2kcPAQEH -QO2oCCt4hgIeuO+NiUF0w66A1RCFb4TSSjjKfBJSLXSXiQKzBBgBCgAmAhsCFiEE -pJDQ9NMRpBU+K7fK27gCslis2E8FAmNs3iwFCQvybHUAgXYgBBkWCgAdFiEEzU1D -Ua+mkz9XSpr7kLK0vXrtI18FAlmkJ7YACgkQkLK0vXrtI18sxwD+IfLH3BZ+A4Ae -VGt/uVamTk4XkEc1KtOolrL46IA4kbYA/08D6g8aZ2vdZml/o5xZz9S/O7tXMRjh -SitE+m3SwQoGCRDbuAKyWKzYT5vfD/wJeT4jWqiPAhc3TF86fCUmPLztxSij1djg -CFZ8VpAWNBtE5d4uostK4t+z9R4fAjvtSIfZhLXyqTLobc/nMvv2ur76IpkQGQDS -jMTkP/yKD7KBzcjAmmxFRlNeRHNKNL/mVpkALbETkeITwUMzW4d9EPRfV0q6Tddg -YyzbJQEQ71R55g6PQZ03fAQe1nIUjiSqZUJONM4mTfRYueuQoMBnb2Rbib2j2Ff5 -4UBfVnM5hgrR3PJMV5hfPmBPoC5TEvgHnnqLa2EhZreQTxGZDieSwOR6dxRXgH0c -cL1q38M+r4i7FSgAasgnV6QweHHgzZntR3M6ucr6mGomPZvmLqnx9Ad2Ta3g/Yza -beP0ERo+pksOp8VxZ7VNTQItIzU1Mvb5RLnn1MQJn3ZPiBcygC4Zetqiv4jKnyZX -e+AYDBwxWZtdhzdUBl+TWXbxR00qw3ucpvQa3W1TZHJGU1my4USak7w909wh+mIG -TSXFCBJAUq12tIauC5SUZwUsjJacID3W4JZvzIgcIV113LyQKBLmicwOwItzNLyK -cCm9x5sRDyqGuWFVCWK8s85HXUdtxMGTAxzpkcHueHyQZCwV2+Vv0TAjND3tsbSh -qRY1go4s0px+nP5j4uPBydZo36vdhaar2eQq+XTNOzFtNAtL0RB1zERwSPQ/aYCq -QVXC9dSPnbkCDQRbh/c7ARAAv2qQAXsiacvxtqSapDrjSGqyHhIuOMUThclv9XNd -mZgkZtMMEOY2FBSm6nKfZbq8nsdHNb9wI4pngikfEXeqgFiIsxDJuNJxIRlxu/EF -2GDHFZw9lex0KearvT5reZRrWo4NiNHyICHKJsNdmh0+SlVI4JrVZK2iknjwSilq -FQE6RjBrcr+4z9KcIa8xXyIVudU98oDRWUmtuL/SNLaVus5VIlMrFogPBZt+XI+R -shLpDnGAoOCkJVP+f8anaAP03RDj129iOZPlpNNd8SXP2YpgDYqas9HBZWhjR2rc -dLRYf8ELhH2hPh64P/vXvu3yYukKQU6JM/KfXpx+DK5t1EHptckyI1b/tAq5iMm2 -iPzFnyZPMZAQXpEWWax1sJRyi8yL/0GATF3yYFhimo3Uvjo2LId7Vw/sk8TlHtzD -o4LFvoqMur69pBEXGDIWFnJv+oN7CrSNJ8bwCMSsrsBVT2smD3NNIsWOrW8xQ19x -5md9HW0t1QR0puC94ixHhV029WoGHClG/MRNrtqexOH2J909chXkLL5DlQlqC4MZ -wdQYgT5BsYTnZaq7uz0xaI73Th3hVS3pq8mkXuDwqG9/5/pxyW0ipLfNAT4Tl/vh -aZayMSMaWlKk+j2um1gga0JXXWrJR+sRvWhgYLCfXLxOOoITqgKQRoz2ft0IKV9g -S/8AEQEAAYkEcgQYAQoAJgIbAhYhBKSQ0PTTEaQVPiu3ytu4ArJYrNhPBQJe0ToK -BQkGYEbPAkDBdCAEGQEKAB0WIQT+Apy0qtR4jh14KOiosPTkWxtQ4gUCW4f3OwAK -CRCosPTkWxtQ4j5bD/90lveXhTpp3vgzWETrRsz22p9zQmNiJGDGmWYG9j77Z4UR -U3pAmov1tInprnjrqT2zVXWqZBwA1PpDtkZpybIcPmoClf6g7FsZXSGmkyIkSCr+ -cgg1d7zTBWmfyXMUwO2i1PplmDZli9HYiFlRakutv9TU5qbtgNJsATZzVQoTh/kf -AAIDiHOW3NXFWl+hkyJ2yTHLgRUd7qc4jtKOKkhBMjOp0FTczPBI24tJNTlbU6Bf -N6CfJ+0nGlcafCRnh2F8SwUP7c4SGjPCoiEKNwLu+YZlcCk7dqANbMMmeLgb7bZp -PA83bsqGgsJlowueenBgIbqw6wdnuUbOAq8zW6kAWljKSP/vduu/Zf2YOSMNZjlO -qm4nXIi4u9GZGc22FFe0V2VOl1Cg6OeFqBDkd45hqZuUE2O10mOWRT5wF7fEqPmC -/zK0Qt53MJSkdi0S2t9qcrU8d2vwJmvB1msknZ0e3VUGJYzGbjZ4g9RUYwYiV7v3 -b0SjMiUL9plNeZvv8AIsLihu9EOAs5MUWRb/2NfOFOexlce8okeZuToP1VkYndrp -6NUPvF615Mn+cmEhF2gNAVJZpbUaorjJeJxGsio+5Lz/QFFVJL+TW4hTrhe1UTIt -oWn4lHyKMDPX08lfrQgcZPv58eDvaTOtE0saPE0UGKTSd40zd1m5THzifLytsgkQ -27gCslis2E8buhAAlL3yC6lTN6l+QYnvjnns1PtBYXMCZ8VZ30ShlKC3XqfFq1gP -ZY8NgYjePn8w9TF1Pz9IvnORHueGsCGGcVP/HCwc1R9IX0QY40DmicP/65/Cnr9B -ArmZDTszlRDvzbJDXXHWI1709KY+5SptR4RfLX6I1Ps589pvxYZEvhpPJk1WPYIK -0TdUtOeyYAcKtKAd4LiM9KttNsUAxQwTn+WHOf+1GNqRlCXExnYFclAB+Py6DUHA -9IY9vILN2b7Im/+Lq1dHQP7xFvMms3uxcwzfTf28hDRP6avaWe4/uhAhO7eojL0X -8nrYFy3C6bVqzw06sWSU+XST+fYqv8s/SbubMOhRDuRoE3Ue/mptG700bV3KZ4rY -awfNSSzp5lndbd5WvjlASMb6frWdYq0f4SvlGYPkr7duvJb2vkvhDyFfXO/3Qvzh -OmTxGrC+FQHZtngNohCe0NzC3+HMKS7bpuo106f3+20UXXUTh/EqT0UcYMR2GCtH -7L5PGy/jcL46xK8mvpXUQUYOrfBViR557BGJrxNpkpxHstuAH0yTWN5sG4OImKzR -3wQUJep46o7hfxNLmBwe169oZ6C2n3SNQFYE7QgwOlu69JbQZ+KrdFi8oZng/lJB -FwcCe3gesly6MPJ1M3NQDCz+b/8UNQbBWF+okwobdl869P06GZtOgG0eh8+JAjYE -KAEKACAWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCYWhRgQIdAwAKCRDbuAKyWKzY -TwX5D/9ashfmjOrB+U8HHKMGDY34NXzHVKwh29Zcvs50z9TZipnFsxZdEggHjvb3 -Re4p91Yy0D/9ZttrXek0Nt+4TXQf0MdzfO44pLhS+eLefg1F074/zVhk35q/mVgr -cveQ4oYQ8qC85Y4cY8zjOYTZih7oty3gREJOKJnjPkxfKFi3cDaAwUMgdpAnSiv0 -j+p/1K0G26xm8SoCHvaVkcaK670/v6P9PxESo5JH/W/suIEwEbdEMINAdz6iVODX -FZxcTHsh6rWzRYvZAYCnjIDfVM6mMRvycaZrQBzeKZmkQvZYi0OxM9RetJhBWwPX -1rmIEDCW7m343D/0SmbztJjMonyLNfOMRu4u7Xg+6z6JzH23CHyItLbMAajx8uKw -RqqaZdlFsO7HZbSUvWiq6U04UbJNbuhalDfMxWKL1pHFQQTNTjDCdMOI3AWrkDBj -SvJko32zqnqYs3T41gyVaO3jqSeSuCxk+q/tlIZBYkb1ehHSDC8UVMw0QObfCLQq -Fb9yEmlQLbNLFVb/O+fp1mOwmCnsp9EoNxyA884deT82PwIBLZNgYd435ZxHJc5p -rBoCyOJQqntDVXksk68Ziex1ygJctJ7KhYWI2Nftva5p2hH7YtowbVd9pQFX4Lee -O7iAh6gNFOoKUW+LfIIp8aGOqQxz8QgEOvnvRPWzu9sWd8OJZ7kCDQRhaFH4ARAA -1YVRGK45ANlN6p2phi9wfgxlu6zh4x+gYC1ccTIwPpx753zEB4HceBYdBE4hhAx8 -K6HD3RYjtchN2gzRAf05M1loFTKi8x5LiSGqtNYKNy0EDQN8WRxKa857ogoGtJUC -2SYmvkjYFqKZryXG4WGzQnNn66sbu1x2UfjdMXB47SHIpVWTlmGl+66kYk8U9e0N -Q4hqT6rRYCxv/ZRuyJCkCvFE20jsbDv3W36PDuK9cJKyGAArWAjYgrioY3XLFMN5 -RSw4P+Rjy3Jl+Lfd/AdA0ZGTzOvbr251Fp1JLji8LCLplfREUo45nRy7rSKiLdkD -cgDV7X9iLbEQSsie9wo9+NcoPIO855ju/5HC3mw52AkAj4sRusC8uKFo8d+gLH7m -ahf+K1NS2DRXiYFp7pDks1U/zd1DNhoOCXJvT3vW3Giso+qGqvpYVm9iV9SJcxJB -PTRF5/uAa59k9E9dmM6YaUcCZLExH4Xnh2SYlrD1kfJuNdUIbMVQbFUzIQKhhS+l -LW8/3JGnyOOYSYmXG2/4eLCrQ1/Zn/29cHFgliUmx40WYLCQLaBmLhYuUzSaMyXV -zJAy8H2EkzXUgpxjQGDmZYm2LaFD3mPr68N107/EQ94//LmMTvCv1qt1J3HuWwLr -w89JWKYMkqE5qZQ9MPm/03Oxl3hGMCsqYFzdmtSd8F0AEQEAAYkEcgQYAQoAJgIb -AhYhBKSQ0PTTEaQVPiu3ytu4ArJYrNhPBQJjbMZlBQkELiptAkDBdCAEGQEKAB0W -IQR1P5ATd6MJ8nMfoz97+9K5Au4T0AUCYWhR+AAKCRB7+9K5Au4T0CI+EACyAcBp -5P+BjWxQ3shUHWXY2hnyQwTB2hNY0uT70f4Ss63i3Yn1R5Ms76gMS6RuAq3+k/CH -d+FqXhj3STR0XQC/l9yP2tDNQ1LfNTS82OLuIPrg/Rwa3NOWaQ8sjVDtQPCpFjmx -8QkRNZ856QZapmvs7V5n5xQFbidY/JFL89R8xysZC7psXt3EM0hE3kzGLfVvRcn6 -iKxtJGWT6oyazxAiml+AYxeSmNH9wwpjhbWBh1tqgcT0MS3wmIwv3bLvyaHfxe8y -5r7gb69/nng+Sn+PFY6v3JLGIjICxUjIYMqUeaC37sVfJQT9tcptWKYmgcZTcikx -2m/VE96gamAJ1sNVpHN2s87pfDD/19vx0rwKiN+vVD5cNIRVSvcgPQ3DKH+aqKMP -Tev5g0U1Z9l/o7gKMdT+SqQesfvZClBTwzQbGkpCFympo/xzMr75jOQjBjefW2RO -QL6p4e4vH89QgHwjv3FP6xyxeIWmLrj3TCiuS9oHEXqJmxw67TQeYbd6fwmh15GT -7453yiJZvkAsvsOxW4NZxDYd5+c5Krm1CD5FgY+yDB38tKEUqUA86LTPcvGWvpxM -FlgnvtlKa6dibbDSPJhrmfLBUztvoGbsaT3othmODgHucsZ1EBypUElW7vX6Jz0B -KXEKXdQCvyWxqVAjpwzblVISG7S3/fW7bv1fYwkQ27gCslis2E8IyA//XUHxgoy+ -FccaYOFp5lrTjo1q5gGvAd5q2TbkQrhrciWnXnyPQ9+9XIZWp2hxX+QPO5YrPod+ -iSUUvIKIjLKYwhm14mGLfibgexXbI3oegaEjrd2F3a//75Phy3yk14w3AZ3fveL0 -/6HGNoCASgZSuajbakJ2WutY3wt73vd7HMBJQdKANZd3TPwtr0YtMknGPNxV0WB3 -34A1oQ0EGKvbV/6vu8kiHQC+M9LbTHg9DYXGDCzmzBaG14hqCZuBIwKxH7gfk4Cn -VeOjILxS3c3Gf+GJoyJr2FzgeTi9M5M0D3puWudbBTqj083xzvQe5/M0ONrvvvL2 -9hsPpzjexk0rh+a8chlmIRI22VMAun/XFr9VGn6wlMLJGHzFROmCMEqQhauuGKG7 -UoQxDDApslDqztBrg9gKE0KbWzc4/EstwytiI0+3J72V+D+6UeXO/5mdog/mgDW2 -swPalWeOLcEtDdkbu/6vtSpELKn+dW+h8Ii7Ki41GXNQOEaq/n6qHTsy4azSEyYS -dMQ1qRMmjtkWMATFX2UAFcoPr778XUZlTNGEhcg2sC/m8vxvig9cN9mWwc/Fzzp+ -bOTl/9audGSI+56o1Dmpp9T3j8REcXXamkU86vgpdRjeDx9x9QxA0ZNhiJ8Z9HMQ -QPn+ypcBYzrC6b9iXTuSsya/9ISpMgCMSrU= -=Y2Aj +tEJUYWlscyBkZXZlbG9wZXJzIChvZmZsaW5lIGxvbmctdGVybSBpZGVudGl0eSBr +ZXkpIDx0YWlsc0Bib3VtLm9yZz6JAlQEEwEKAD4CGwEFCwkIBwMFFQoJCAsFFgID +AQACHgECF4AWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZk8i+AUJFKpmaQAKCRDb +uAKyWKzYT55PEACUUhiWnyzvvZeOBRBG8xIesrIVL6aeqpNrTdjAAZkYrscLQvTV +d/oEnwFbJSUSxJ7cCEPm9PFAZEB4LOu8VMj1kQlxaoXQHIdGHFVnqyHdxjI2V+sP +ZXZDfzHMHwvMwwggc7M8Ubzy1rjSIuNiVEWxBnu1grHZ7RWHJQ30T4kyd3kQZR3K +bE1CuN2x5PDZAkeG/twl26FZmY9p65YWCwfr0zcXEmEBjUQ/mWpTp1weL7q13Hq6 +zoo9sLQpnrfLQU50BbJ6ny2kZ7vqJDukBp/CHB02dzpU8fivMtGRy4r7aZM/OWof +tfhoF7BVD5vNchgfhSEzx95fLrLCp9snT6xw5h1ARKbymFq7CB7RQ4MNo8UZkayo +ksQ8KI7I1AVo6XMJtLyOQAhT+9duUH0TLFsNATGsua0Es13A0S3StPk9YXvzHHe7 +OSefu/MENsdKM5k/lfmL2NXxM3sz9fIfnuyGLQCiarPXQ8/GnfCFg4xzW4d6I+Xf +TQ/L9Kg4U8nMMTj6MVf7A/PFrTnrHVA6Lu178y26ppiNV9LynQIuqbo0FpS13POL +7as8IF+hRfG3vB/S5pQEqVXTrGTfyvbitTEIqeG2fXf30n+lOQVcuhaUFoE+5YYy +RAoIal6dLOPhk7m85e+/zaTF2AvMJsyZH7B3E6ppZzN2v+XzHDpJ9XKe1LQhVGFp +bHMgZGV2ZWxvcGVycyA8dGFpbHNAYm91bS5vcmc+iQJUBBMBCgA+AhsBBQsJCAcD +BRUKCQgLBRYCAwEAAh4BAheAFiEEpJDQ9NMRpBU+K7fK27gCslis2E8FAmZPIvgF +CRSqZmkACgkQ27gCslis2E8jXg/+Izs3/X9Is2SpE4HVoCBv5Cw5oy4HP9x/Ux03 +ygcfCc3FdZaip2sy7qoFk9Qee3DdeZpVe0kAMxCoczWfatUsgaezYGyOfvP4nVVR +T+v6Qz10tecVBBl7onU7c5HPPJUz+Uf52PvlQ9Zo1WBW6J7Nbp+haR7/lszaZ3V8 +/4yLGu+T8C7wXfLR5TkfncxmGBsIlhx5gfk8hVOENaiEia43E+798xVb5BLbpy8v +GHyT9ULHr5XxDLj1dmU3C1ZOWpxPclfX++oTUV0X1qDkEUBus8UPsTAPpVl8disZ +q4bnD8xnUprDYYl0/CZIEBgicI0lhxPmX3qHoizEvUik1HFJecrLh7Mr7470YyOJ +FdlRI7dfKgSiLh0beo1e5oI/3Rc4d9vPqdFvT6Pq5gMcan6cD5GZj0kJ5bW6QSfF +pWyVOZeHBzesarVjqhlzv00AjRLtamXthmmQLx34YAfk3LgGN3SsH3sDMwGS8Yaw +UgxwCXE+efz5bQaa2CD4Xgj9ckeQr0X+pdnVMmunCRun+PCizrUGz15y9HX6HYFA +RotaNbk0mzvem4QJ4PAAsyQeqoXGV6UVZ83GJzA5X2Kv2kdTlS1PpndPCQT6ou5F +md/anB9oTK8eomzyn7CyfryiRRczgDYyMtVB+hMZFT2emunJP940pynp02e2WXH9 +mKhT1F+5Ag0EWaQ8lgEQAM2+SMtw6MhVo4qjLxflC426uuLPng7mOlNYAWFKDFSj +/8UcSqUVgJFQN0O4wP988CJBeTpM0AbM35HWC5m2P16QIjnHg3bCPTDFQ3Ymyr4/ +7NMuRFBxqNtN6Y6xugj/DT70GW+S0EVXQT3Kslbips5X/D8MdZSrckiCANVpVrTR +u8QB0lHT+48mgaKnh7HZiHXvSODYZu2wW+bW57yXDNJFtewMj1E2xVruGgm3hN+Q +tNiQpN3Sg5C8/8sOByanlPqxwM50/HnNi/AXfsO4LXlj1ZhqL6zoosPAzLYI4F7E +TWkvCoTc5Xjf0ENWwUbjXPGZZRhRfrk9e0mQPU0wl2fKI9/UoUSnMPRPt36WdI8s +ljHhN7lqFpnV7xKXBr+rru2LvmQy61HkhXQQ8SD+9jhuYS62hJP1j3ihwCtn7R97 +HcOxXBcx3IxLvzN+ebbVsymyB8nHthkjWAVBcAq1WURY8dqPKN3a0LKxgfLUCdt6 +GQdEixhWpdXUDAXZtI3asp/6cJOO82C3lU0CIkbLg35C5cXLlfg12Ax1iru9hPro +h5nCVP0dXTAQHWOxfXL7nR9rF+fZg48WkpfM13tU5AMPHX0nUiw3DZDuCevjCiqo +nD5ssbsKVG4183zrUOXFznawfquN1x6IWwsoGPtPWZAUBRkHtMIwi8rauvKVzmJd +ABEBAAGJBHIEGAEKACYCGwIWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZRveWgUJ +DfBxxAJAwXQgBBkBCgAdFiEEBUafuF6tZYm0PUHT0h2tOK8oHAsFAlmkPJYACgkQ +0h2tOK8oHAvPjw/+OAzlERc2SHihbYYcLZl88yK6kXXXNMEpa4iuyMvNSE4iozKl +soMEBB+pX5NJqXpFO+9kdDFhTFqTg4r9O2MMvjtfMcZCbNlsWd0fjZdU65qQPl1P +ZK/7mhY1JkPP5iT/W2DhpEIPUyoBM8Ps3Y7xjv40VTZ21AtXYw9r/vQr8WYuJeZC +AZ+ErG6pYEV2nHbE2WkikI8SeQ2DF/FQNbgZqvd/V4cA64K3ke226tqIcgOae4rP +rx6lfY9WsDzO2M3nri+V1ug3t9/kXSlRtL8mPhxyjM4Z0SDeC3XktjZ4Ph8PWhfU +dLB+oW8HniBKUJJhfieR9eSOJ3XcKMBgB9ohuEJnhy6eK8wP2iDmwrRkZNTR8Y/p +NNN5l2B7vCPN1kmP0SgGByVzkfsxwiS4ZhNpOqjB7rXfizpbZsMngCwaSNGCFG6/ +peyCNTPXfuA2RPY/4804FXX2xNXeFrPiLqAGvXzTG++04CvA/W9PGcBr4+az1sm3 +pbrQ87qSNaYNec/KTCrt+mYjuqAnay+WpFws3cZEtfdtzSMKmylQRYCKrYlA/d6N +PZCY0XwYUIhNBIHrhVv5o4ETdqJ8GO3zaT4pK/L8/yCQ8Jzd+zF1hKCd6yuToSeA +Du84z/H26ebfI8xy2lPaQpq//GHQhhB2zIXpBf9JwqXeS+5G3ctOTHud38sJENu4 +ArJYrNhP060P/iRK9LpEx85cTYwPXAP3LE8LfgfrLUoDBhZ7vt/MF0vbju+/eT22 +8SpripsdY23R+XNNmgeIlvGr4G7kVgAjDBs1isBlve7iXhp2DN3rbte4uDyLo/gV +/4k5bXPJvjg3+wL1pAeDUQmjQ0NiauH6g86l97tdvum6lr6zQkdqOa1ACrwTUmGp +dEmrTwnu1rixUzJ8fD9Sl6ZBpen1LwnhvcQ8W222s4XUUmVs6gka3nh+g4IZ0UgD +5HZ8x7SFbcgarNiZUQjgfrITlGQG36sSC/TlRQ5TCYYzSGOlHTj2PthcemkX6O6w +d8MsSH72P/oLZ/FoXcRjtu/9Luh3q9G+rnv+FW5TMNybFFgDwdAjSc7aEddELAHV +p2DBWPvoe5KMKRBMM3ifM/9ayaGU7zc31V/j8IQFVyXce6uCWTWxIh3XEfvA9SyV +rq5kLk4kowwdxqBpqa0Anl60QMZ43NDZLFn5uAFdcBAz66qYBZZ1j2LQoh6a/pJG +b4As4D6Nnb/xXCle7YggNmVmpCoPfmbHi69e6+ww1T4yzrKdOBroTfBdMjTbZqCA +BOK59e3LIaS6P8jQtEHjCK9ejEp4vz53smqm3Cir/drwbhDeu7IdgUZENI654+yQ +Q5SxghojkcJ1g0sGNiyzEFiOgBSfTM4Hx2KnTmpDSlUOXoGkD1Dt21kSuDMEWaQn +thYJKwYBBAHaRw8BAQdA7agIK3iGAh64742JQXTDroDVEIVvhNJKOMp8ElItdJeJ +ArMEGAEKACYCGwIWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZRveWwUJDfCGpACB +diAEGRYKAB0WIQTNTUNRr6aTP1dKmvuQsrS9eu0jXwUCWaQntgAKCRCQsrS9eu0j +XyzHAP4h8sfcFn4DgB5Ua3+5VqZOTheQRzUq06iWsvjogDiRtgD/TwPqDxpna91m +aX+jnFnP1L87u1cxGOFKK0T6bdLBCgYJENu4ArJYrNhPOXwP/2RkyWIi0CJrSAZa +c0C9zWNFosT7qG+jhGyY/pLw+OK1w4Xtdlb3XZ6To9pTVAQtKWAv+fKpy1QChXhd +J3N7gfbdbC5/7Sdfz3lRSy2x+E3I1qaidBhA3sKzPoJifBCmhmbaft+s8piAt8Ds +cmhcRsGGS1uxBNI1jwEb9eAZmH7UiLIIJbbTRsu/yP9Qc1/W5HQ7fpPB0LzlrHlK +HlvCnpECE0Lur+EgBTrYN5k3mvGIu+dEyc/CtKvYyKPGLiyMdEqIDq8bMh3CtTy0 +A+hx7p5ZOViCQKHiHE8MOwzxG3CAXtO5Er5YF6PD3L5TJzqiyQEc/KVRwc1ITX8m +bwcVlj4GczZv92qPjEAxnBwDW6pHX3M9rKBGIURW2sXkYHLFLwATpqb5jVB3dFz0 +7BaRXQq9prt7DvUZ8Hy/GTINb+J+tUcGdkbAlbmQXGGNlGgQrun5x1x91yGiNjD8 +AH4CXnZNG023mjsh42ud0oX/AGFwGQUwZaMYaEjuN/2n31INOKpd6lewTpB+7U5J +Mg7xPAQ6DYQKyEKexpgpc4MtxVQ4sfeoJjRzOi2aKv9z7n8ZpewCBj0mQ1Dxp+EI +eKIG7frVjfyInpcckgKzXizJwBmD2GeN3Fra0eEaEoASmsOc1Ply4SGcUBCi0YaB +BlNtChOsyCjWPePuSZ+fpEB89jQkuQINBGFoUfgBEADVhVEYrjkA2U3qnamGL3B+ +DGW7rOHjH6BgLVxxMjA+nHvnfMQHgdx4Fh0ETiGEDHwrocPdFiO1yE3aDNEB/Tkz +WWgVMqLzHkuJIaq01go3LQQNA3xZHEprznuiCga0lQLZJia+SNgWopmvJcbhYbNC +c2frqxu7XHZR+N0xcHjtIcilVZOWYaX7rqRiTxT17Q1DiGpPqtFgLG/9lG7IkKQK +8UTbSOxsO/dbfo8O4r1wkrIYACtYCNiCuKhjdcsUw3lFLDg/5GPLcmX4t938B0DR +kZPM69uvbnUWnUkuOLwsIumV9ERSjjmdHLutIqIt2QNyANXtf2ItsRBKyJ73Cj34 +1yg8g7znmO7/kcLebDnYCQCPixG6wLy4oWjx36AsfuZqF/4rU1LYNFeJgWnukOSz +VT/N3UM2Gg4Jcm9Pe9bcaKyj6oaq+lhWb2JX1IlzEkE9NEXn+4Brn2T0T12Yzphp +RwJksTEfheeHZJiWsPWR8m411QhsxVBsVTMhAqGFL6Utbz/ckafI45hJiZcbb/h4 +sKtDX9mf/b1wcWCWJSbHjRZgsJAtoGYuFi5TNJozJdXMkDLwfYSTNdSCnGNAYOZl +ibYtoUPeY+vrw3XTv8RD3j/8uYxO8K/Wq3Unce5bAuvDz0lYpgySoTmplD0w+b/T +c7GXeEYwKypgXN2a1J3wXQARAQABiQRyBBgBCgAmAhsCFiEEpJDQ9NMRpBU+K7fK +27gCslis2E8FAmUb3lsFCQYsXGICQMF0IAQZAQoAHRYhBHU/kBN3ownycx+jP3v7 +0rkC7hPQBQJhaFH4AAoJEHv70rkC7hPQIj4QALIBwGnk/4GNbFDeyFQdZdjaGfJD +BMHaE1jS5PvR/hKzreLdifVHkyzvqAxLpG4Crf6T8Id34WpeGPdJNHRdAL+X3I/a +0M1DUt81NLzY4u4g+uD9HBrc05ZpDyyNUO1A8KkWObHxCRE1nznpBlqma+ztXmfn +FAVuJ1j8kUvz1HzHKxkLumxe3cQzSETeTMYt9W9FyfqIrG0kZZPqjJrPECKaX4Bj +F5KY0f3DCmOFtYGHW2qBxPQxLfCYjC/dsu/Jod/F7zLmvuBvr3+eeD5Kf48Vjq/c +ksYiMgLFSMhgypR5oLfuxV8lBP21ym1YpiaBxlNyKTHab9UT3qBqYAnWw1Wkc3az +zul8MP/X2/HSvAqI369UPlw0hFVK9yA9DcMof5qoow9N6/mDRTVn2X+juAox1P5K +pB6x+9kKUFPDNBsaSkIXKamj/HMyvvmM5CMGN59bZE5Avqnh7i8fz1CAfCO/cU/r +HLF4haYuuPdMKK5L2gcReombHDrtNB5ht3p/CaHXkZPvjnfKIlm+QCy+w7Fbg1nE +Nh3n5zkqubUIPkWBj7IMHfy0oRSpQDzotM9y8Za+nEwWWCe+2Uprp2JtsNI8mGuZ +8sFTO2+gZuxpPei2GY4OAe5yxnUQHKlQSVbu9fonPQEpcQpd1AK/JbGpUCOnDNuV +UhIbtLf99btu/V9jCRDbuAKyWKzYT6uDD/4rs+tAyE6T+S/jzg3uZi6M4hilLBLH +3BA+5DGT8QZSNarDm4OKM0tFhnPS4SRSUXu/Ic+kUrx8cUR4TO+mDOux306n9IZl +jALHFUbXw7hFmTnqTNEiITOZ7BFj8FkRxxGupqbfFDaNy9lOIkEtYOcymOwL9Rtb +wA+4TkUqYa6T4DjHIMMmupCmXZsFRdGou7rE7zLAwUKHgkS3PVAQ9nooqeYs9Ec2 +ZNlK2kPymcx2blOlix5PinDnBhtgYE22vXjsHZdgaT9YCxekUGhylaPf95taMdYj +2Hu4v1DX40JlHip2jkPkuXD9Fe7/8bjl1xXqFErLne2ZoQpk7aZcQ6DfavubyaoF +YtPxjAFIY8fuf2f2jDaH7NQeXd6xadC/BVt3MlNe88JFBB/gWsu4irqXS3aXgUsK +WJyWROfZVBOvA8USDmFtInArP5QOoMyiWyD7bm8fF/VcyYjfp+Rr5LFRr62VBjXh +uXTzFqm2ddGQWXFml0o0VA60BD6OnUphwc/gwu+dLbTsWApMDC6xiCJGIEfukMDZ +25SzCN/NjsNrr6Z98tQ+YRBIfUv0JXzOXryo5OyvjZIykqAvM2+VVHDjQRX6LmPV +agz3V925Vj3kxNeNQishXqXZKxjIITrbkor40Ttipz+OtRr0U6iP2SmMTKcpuy3J +LG38ZmQYVwQyH7kCDQRlG960ARAAzvnbokiuw9j/PGK2lho9WKnJJegN4T2RUDZl +IW89/irvBsmJ8/2686CP15elu4KuhakgIuEeG/CCN6rMTbDM/tWt7vxjllkEKpQ8 +ngMqH8hQhuojQBzmVwjznsYW+pPYdSyYTAxDEFNTEsrgCChIWnO6noUz3geFQTdu +m4+WBk1+2dudDQZMtk4Fbiqkm7zvqGcHiEjBwx3O6UezL3ze1NW4ohRqXjujgSNI +snUHzMNYMiwKrDexv/MyGcUz9aHORW2h/hX9A0accqKmXd4Mz2z77Q171ppT8U0J +d/vivy9GFDWphUlX/LOSLSvaVqCtAKUzdKmqJrgQ+HlgWFITRRwfSWaA6Jf0Znqy +lwPfHa+YC551l37MhTDDXe0Ty1NoxJ2I8hK8SJ8irghwDw6DTCfamPL7jy50g1B8 +kuzPXPGONhYd1vG1pqW7LV9cFNJzNGAkSsqeHgzdeg5kG92Z71VXAoF3/AutJypj +HUHRfrCqoA2YYLK4ijDqhvJAkgTSRy7dPNzP0xgknvlobXXnm7bgrGij3814XVyx +LBJqGiFvw3KDDKamZLSXajnWDzYuBu7i5Y8HPhYy6LkE2eS4bePksXq/PC9pzAQH +LZUryH2QoaEHzrwu2I9nexK1dA5WDQtGCDix/Apaqo3+NS+v26JbcSzI5j3ieH2E +nU8ULg8AEQEAAYkEcgQYAQoAJhYhBKSQ0PTTEaQVPiu3ytu4ArJYrNhPBQJlG960 +AhsCBQkCeNAAAkAJENu4ArJYrNhPwXQgBBkBCgAdFiEE4Wk7HatSXyqtZwLc5dui +4YbVuvwFAmUb3rQACgkQ5dui4YbVuvzdBQ/9FCNJil0weAdUNVF0Ic78pbr+5MJG +O/5RpQYKS+2WW93ErUfHVA/hByFLQxuygMNxEVHvL04tmXM3MfClYZ/CU1evBlg3 +atzfHnpjj5a/xyMZ0gaTJSm/V1poerXK0bdQJP6GKgscWZffZ26Cy/9Qbo+I4nkr +u82OBOxJjlTTBL+51tkbmQ/hAiMThOiTajhPDpyuCtNhZIypN1GMaNI1pc1N4EQE +sHSCUPrvMsHw1YzLM69/AogKI81b27KIWOUDW7tmrxmg1EkfsO2YWdzuTXF/XIJo +LupaHoqW32A/nD6W1WN2dLcfYW3qLWNPIeWW8f2BDOMQUgX8JwB5eH+NHsNURmqL +jxQS0BsqHmWEmuyA/Vziea/uWUOAWBKNOOwVehwTYFIQe2FD+/PP3hLGBsgzfDn2 +S0w/PVr3q74aIhVYUuU3CJOhMipG3BFvPRpDHQYmvy/8FrJEs176EuIC0Ibt/osP +ZavOL6KGLmP1Z0HKqoG/6BWZ0gLE/26iD4kodynF5fN77OHb1sTKA26F+FS/++r4 +3zFl5qJZ9WMm9O7Ippn+OtP+ZEGpRvjzntRrddd25SYk5KbJINqqaypodzKjr0+z +9/hmrhXgkZKyowp6Wo4dDZeRWF39R8sFUnWREc1u3NnN0uEBwLl6OUN72FwRLoiy +WFu3xHKGzrWeXA30Iw//dqKf24dnkWZ2UoWcTsNd+FR7Rv83mvoZgA/iYv1FaJD8 +dPsMY477Lglue6ed5j4DEN9Pd9AWNyCLwk92fgY07jXPMq+ryOrarOqEXayfu8xW +DQHqHflM/Gfy+bFxJRZFOqvDn6bl8VHdK7yLp/vWg0O07ykHozyfDQtidqgNxyUJ +cs87Y3FS6opdwMK7lARZvZhy2DIA5gEOchMCvrvN18l8+gTbpDTK/Of0+91x3GTd +3HI5OLew61wevo3XR8pg851/11wsKA5jVfM1mONvPMUJGeWHPRvFD9MrnRr4YNKD +fkv9xtvIT1ws7a40YWeTWHDc3rszSAdkQTmm087taorsOrHA/rJ6V8etefwAaMeU +zanPMv0G8C7KdeYocSffLzQzns5weYzV0iUEhdk6IogmeEViV7a1TYXFhwZaq04G +F0jrq3E+9NWU37iHT3vdPTZQX75IrrzstxUYtKY/KhGow7KvC55OfvLJ+AHfWBM2 +kUEiOX1SmYTpQMWwpeV2/1Ujj+RIqRZOkaWcyC+V1Y52uVXqL3agw93vhsCgvjUP +5ezoHOQad5gG2tkQb8UpIAinnWDrWmQe/mn5oQltQUxf9KFzBieY+0AKkMkcM8hV +wwHqUaj6JIonFrwtQ4TKmxtVZ7PBTY8/nsP71Oi9wwhG5zimFwHNJ4+U9oC83oK5 +Ag0EVLvBkgEQAMivp8Yhjdqpn5VHe6f/+JjvK3Wggp/O41Ud5c8M01gHEAqtwKa5 +/IJrCqX3vvmgL7rlWNfrJzA9tkT+kz+IQBV5vGNU4zEgD6O3a8yWTCetw/N/+BM7 +TNsEVLEQsn8LcyifgZsQ2nBSbpEv/2IPzh0rAlOdnMPLIWDSxBKqu4i0EABrSmgn +TEWGnFCx0pKTj+Whmst36SgxjGbgrkkpRq57ubhjNfGAHHYqaTpsCjEKh1DrfrBM +nCjdvd43/GOZ6M02AVn2wB4sum++k6CTj6hE3eVTgS/BtdPQ4IqrhmwVCet0tXta +rQK4Smsgszd/1+vKslOF/uXGGtZWlTyNVTSF7NHUgw2EGmbnOzAcko3FjTDmo4NK +xqhyPVXwp3Wg4Fug45xgkyHIiLBz8hd+KwkxQRiPWcJPWwWeP/Wxzb8iY2r2MUNh +6EtOsDMkMcj6lpX0L3IHXjnFRPDubBK3Hc7daDTQz4THoQ8M6m1RRqXCxL4lkcyZ +simcZwsXMWuX70xf4t7c5NWuH0EAWWCe0i/U6P+O5gq8nT5R39rnNFcocAPWtJ/F +/cCJneeva/O6+/cVGIGOBj3tQpXT5HPVxktXl5meCanWvkaccLTNWxnUECYa9td+ +IwFExiAWh9xKG5Q7uV3TlOIaaPQVgRd5t9h+85sIZQ2gmhT4cykvgj7RABEBAAGJ +AmUEKAEKAE8FAlYyC+lIHQNUaGlzIHRlc3Qga2V5IHdhcyBuZXZlciBzdG9yZWQg +b24gYW55IHBlcnNpc3RlbnQgbWVkaWEgYW5kIGlzIG5vdyBsb3N0AAoJENu4ArJY +rNhPi3YP/23Pk9WTz13Q7v9vwtNJm9IVqUE3SOp3Os/W8I3alh6hrcYD5INwWml7 +lrk/GhcEU3plNdGuyice5VeAVETJpEJBI4iHw6sdMWImVFG/2xhSH94X4Jj1VOde +fUieGUizLcPz92cqkZ6W5Tc/8tFDfg0qW2cxz2Jpl7iCJsy495G2WcxMV0e/XCCK +lfyFd5T5hy3GmT7rshOHmfiNsGgusoo/s1tBUYoRuHd2cI2yIj0g2iOiLOAbRABb +UkRAed3g0D8KNdxX+25fJV1ZcqJonyikP1QPnslIxUsMuB6srKz2nMSF8kRHy3Rj +SJr1BrA60SxDhoqJYAWcpc3OtR2PcB3qkYqLEAkiZLAo/F3L9PaeKLK6LbeTZlpX +UqynZz3bYm/r6+Qwgkqe2pxHG2l5epyinwEqWqaJEGZrYq8RWEHVHgpGvU8zhCb5 +MJgpaC4H677iicbJ+bFGb7GHxAHzHJW4/xKT1+tWXKLij7bYVM9+GQHJtpfPLCZP +09wZb+bp/58e8iDiOCq6XMpdcWsIw2JPQAhHWcc2LwydhzgdNeC/pYog0T6KcUKs +2tyBzWQYS+qezdazLNrD2IQhpED+zYSjzFMkzeaTaVBTfGIAfvvmbmPdmAO/4cjf +N5d8cTLXCslvqOWftH0bQs5yuYJw1H0XL94Z4qqNkzGTB/AQMxMZiQREBBgBCgAP +BQJUu8GSAhsCBQkB1/kAAikJENu4ArJYrNhPwV0gBBkBCgAGBQJUu8GSAAoJEKqe +AUZWmHplkY0P/0MvX2pgW6RvrcubCAAPjbQTl5uqkClWzUUHeFYFgQ3zjJsMkj8R +2YN/FnwcPOI/7ioTVMTVDu+aI/H0wgZeQl5HPptlBGjnB0crbifFTNC2Gi6IHomp +NNAvoCdTAzByy9KKoPCFBcHMc1yLacGnPreBf23rDy3uWnLPtgInSPT8bPWUba4V +jTb7pXIFw3Vf3jn+eg/yAaj7NyZ99g90/P2lXPc5tsvzoUvfJ6jGgXZzm/uD0q+9 +jp6BZ3LLmFotKF6jMGeW23wJGtFxDKozhI/z/yIZghykOuQtcV8fe8pcMi75t43d +ZXo2mleIlU6ANexgPZJBhKNTJMXQE4gnqmLevtSyc5kpSHqb8DS7zdhvS/FuDMSJ +pJraoB/gS/KMiaEJ0JlG7lm8NRu4IOgzsonMmHzcxhZVAdhnPVpltz2GmdLf0CS1 +WPAfq6xT2r7CPEBVcOGTJoCVDo5SLPyd5r+sPWZyPfcEtj7Ed3WrD1RKniRt7Sen +XnTsoGI1J9lTW/+UDg+igD1DPD7Bahl9mI4/npa9IyNScKIFSLnFqx9VG+Mg+d1+ +ZWJ9+7XhWw6C8pWE/W/OYbshDT1ReAkJRZCyhhJgGuHqBdzpPBYSyZqM1ct3QJWG +VljZ9dUDpYigEuXu+q4vWZ+5FMoW7l74J++/HaEfsWnx0SkhiGL8aUZ43UMP/RTS +Pwl/74wT/SHaHQ7CSMR5uNDEXrgt5VdXPcah6aQroXkNR44dwHzaF3tkJn9kzseM +c9f4Sw66rrHLJCsmTYgJRxVjAws4WaQuIaB+DRhdW7pqAURa1QsK9k9iYYbtC14q +Boieuj4gV+FuraxmTB/vx4HgJjeUy9Wld2Np8+7V3ihGXwxrL4evCXo9QDvs/Qen +VYF/MhPhRGE5+GqCDv93finBi9/RsM4bfiA406cWWOJwwjjxMrNm1VrLv1C6PHMb +6JhsjDDIkjDfJ50aWJdPmzSN25S9tllx1LVpdLWTQpc+LEyhvyyoJjveON1CC0Ak +n07cdI1ZsavBKhCGf8gzO9c709I6cmXvkEPW05qgrKcU06NRHq+bFqJsgBeO/IhB +id51uG2vREbc9WQTnNYUOyYDpAxtriefn6442byCK5FlFc9P/VWFIR952GaFyGQu +A+1kHckunzP9g5eBw3FQbIvq02KittfdKwRRPw/8RzFVGyM/GLS+UM7UNzCHnWPQ +iR3w6rZ3xTe8IOgRORUJoiwJ/6HV1FXRdCfrKC9cUBniigOx9Cn1g201XHiua/ye +dfV00GWnOBDeqDFBpCBrkccGqUA50KOiqBrDK7bwGnYBI1ZdVAQGQ2UVh5R5gi0f +LDI19pDdeirOcNj4gyqH3EH3cSS/Snj+jmNoE2hruQINBFmkPK8BEAC1+dKu0zuU +3E3kU99PRXxxSldbkPeOEzqYLo1RK8pIMB4hM11DlG+j6TYZo3Z05GsVJNGUGcaU +XYMOldjXbzNy8lqQbeNp2Aa8Ax+WulMNsU3nbn3W7/4kZtneuFNIpvRr5WajgzEM +8pYXqJzr0q2TY0zN7ymAkylqoFI6qNYadWlDD94T9o48irPg0wssUNH5R0BGY04e +iil4QbQa+S2+mGr4//qLWd51UKACZLKIG6O0dq4DEIKNd+JLJNKJ5YQ1L3cq5+Tt +IP5skn+S+XBWB3nNXqQaaqT8JJAtooT+grMma68ZmlTv0LP1cp94od2LmPElKrVL +zk6RwGsvcb4OCHgCGb4itQpkOMxv/kcevX5aRfA7PXyBu8j9pQPnSW4cusUlyygk +KsJPijJSulwtSNxXMitDlyd1qFqeysmjHnjXiIh6m0R5/sPnarwq34PJ8tIGO50Z +XSDuZFcQYOknEE+FuQYkzAKhdNaVXmY9p+k0iTUdHqKALyd0EbE2T/IQ19IZCkAe +ZVH0vN9fAUF2gOBQvULMC7SIZ+JE7rasYyXHRmRQAMtESl4upl7FiZDcMnUb9zOH +1/poDUINsPfuRnzdK3wZwNIUj6O+53kOfv/N86n4HrViSfdmbl0dDwE7TstturIA +f7fXZoGUJZ2yPywgYXgpzFBLO6PW24ItRQARAQABiQRyBBgBCgAmAhsCFiEEpJDQ +9NMRpBU+K7fK27gCslis2E8FAl2chw8FCQXZfd8CQMF0IAQZAQoAHRYhBC+vm6DW +W7Nx8LwtRjAgp6nCtyczBQJZpDyvAAoJEDAgp6nCtyczFYoQAKOmTh6UvSGw7KDA +dpaKVTAYhacz+zwn8I55nho8lgvS4FF3h2697AcR/txaz03/r0dFjWbmjXAj+UE4 +oHfZBcxpotVcO4yS5etlo2RP0PhZ0InvX2LOGQFDjl05Ym+irxom/9DbVmJAXgqo +yluCgh/8syv01NHrilzePRbtAqW2C0zDMr6ZPx0xL7GluxqzhPtIybM+5IpwYcWB +j3IKc9Snk4Epex6A+aBytsvYyRBZPLOJSLPL7cyevgSsq+oXYco9nN6lKGtLZ2fK +iRGEVQt9LuBXmlGUcxR9qv5K9RkfFIRJyZoT0A1MN8Yu+DTuD8kD2nz7qUGWYxSQ +LunjOKFxQig1d6F8Wy6ZF4V5rmrNCftVY5ARhM3C2//+uZiJe1IIYZLcm3tlTuC+ +I6SaeY5+SkLeFrEkBhNCtPGghWgOoAtcRTY+DWM2JaUUpXuREEZy2ce45iCOaArE +jCZQ7q58DmCusTXql5iGREt43j6b6k4b2zBTC29V3NLvNjRCrSo/nNauH0/XfOcd +vzN7F30Np+AgZs/uUmo8/UuHb8pzrvr9KnJP7YDy16CwV2VzvJTR8cA5xuE6kxxx +eRg0aOrMBSepjcrXs+LgkccozTEdiZGVlhYnZ9lvkg3ngQzSwY9mw5whrWqDv2rO +Otjx6nRck4srcMxcpOOVZb7PGFmUCRDbuAKyWKzYT7mED/0VANC7U3YRmXsWusB0 +/3E7vLVlSzfeDKz14DttjwRMyUOpyGcRuduo/blbbI5vOsq2yFWfjh9ZQY7BKYgN +9WbQBOS4mAxF4xOjcA984eVXgcqUxlgwXs258mzh/7T8NgKrYU3VmxxCamHxgoCx +MUrFdY3DrSKV9Chj8rEttDphPDyt93YUzRnCNXU9uwXsdHQWRmNtokqvLW+q05L5 +yOzfrS3WtyWbUpExX3/IkkyjDZVX70UiFtkyjCt9kjtDH9LHWlg1PTsP10E14ZJG +ctYS5s7+ZvyzUfOC3LoIR/qqUTB1ExUQtdpUlx/ncIoSpl7q6FWZOrvCuZumdv8j +RZ6vqKAv5pS+2Qzjo7zNUJPpP+aexfKgJXrOYI9gz1EQITJEALHgiT4TGMudEt7N +iE6SXu43epNLmvFHai1sRKBY3H0vzkjPvlqFTTNqzgVHVxn5gLZ8JECqY+94CJ0l +snRkmvH8kfT251fktp9RAhWRjrGagT/1PxshVJsMXCJ+KD050/861oMkFLQE59D1 +B2WkhZ7ajBVlr0BrnhTaOOK6kIZjRcH8ug1Z7TZYZQ1qadd6Ab6kcYYa39q0wAUC +2wAl5eksh107eZB1tHblCAnnx8e2Rf3L8UxPhtvcUghV93g8yZCJsZcTCLrjX4y3 +CUnnZBVlGYv7ZdqFeioLHeGk/IkCNgQoAQoAIBYhBKSQ0PTTEaQVPiu3ytu4ArJY +rNhPBQJe0TqaAh0DAAoJENu4ArJYrNhPhjAP/j5vpTZfHdoGc/vtmFLjA/nQyZdG +fosC835EhyrUUDPCxdF7TPA/R7DVg/zvjec6OgVU5kbqJEc07O8E4HBDfC+U3typ +ryQVakW0103XIUUiM7xsMW0+ReB4WaAAnZ9L2CPnN7vkfX9tGp/c0701Va9fQLWx +UnaMskj4tLKz6S6/1ik85l4a+DmqBobwrXSr8hzzAYFc2LaPhZ/WMHMMOUV9FVvt +2hSsRDoF40kOFo6ee9VYFn0T+LAdP4YSW+1UeHO24qiqnXQoXC50ab9nhrm4tfxF +nG2fc6oN3JD4Ff62PLTh1wpXh8keeHkux/PYAysc7RnyaKm7oA7EIweEqVkkaRrT +piR4TfLpw4LrJagv+3MwKklRzMsH0kDr6C7SxRJdOmK2w2Fjr7npc8dJX/eYFyNj +iji52cM9xYX8SOLW0ipGjsHmBfeCTaf5ZNZdF2iwZvs8JKgr9imk4etHhFbLF6T3 +D7R3pR3ZIy6m9O73OfnnNyptNf7rrJ+l3h1fDyohVNv3ItwircDbCJ6BldQmolil +uAL1wAyYvX1LfjTPE4kuwR6Dr1cM4qKVnk6xJRyhzO2VrnnjAATuth3vH1QhbBpW +rWv2OV7VPXIWXOc6PHaIRLXdUx+kUiru4E6+3UaJjeeYYb4XQS7oA9yPzHxY/RsH +b5R/E70uOAGFj7V9uQINBFuH9zsBEAC/apABeyJpy/G2pJqkOuNIarIeEi44xROF +yW/1c12ZmCRm0wwQ5jYUFKbqcp9luryex0c1v3AjimeCKR8Rd6qAWIizEMm40nEh +GXG78QXYYMcVnD2V7HQp5qu9Pmt5lGtajg2I0fIgIcomw12aHT5KVUjgmtVkraKS +ePBKKWoVATpGMGtyv7jP0pwhrzFfIhW51T3ygNFZSa24v9I0tpW6zlUiUysWiA8F +m35cj5GyEukOcYCg4KQlU/5/xqdoA/TdEOPXb2I5k+Wk013xJc/ZimANipqz0cFl +aGNHatx0tFh/wQuEfaE+Hrg/+9e+7fJi6QpBTokz8p9enH4Mrm3UQem1yTIjVv+0 +CrmIybaI/MWfJk8xkBBekRZZrHWwlHKLzIv/QYBMXfJgWGKajdS+OjYsh3tXD+yT +xOUe3MOjgsW+ioy6vr2kERcYMhYWcm/6g3sKtI0nxvAIxKyuwFVPayYPc00ixY6t +bzFDX3HmZ30dbS3VBHSm4L3iLEeFXTb1agYcKUb8xE2u2p7E4fYn3T1yFeQsvkOV +CWoLgxnB1BiBPkGxhOdlqru7PTFojvdOHeFVLemryaRe4PCob3/n+nHJbSKkt80B +PhOX++FplrIxIxpaUqT6Pa6bWCBrQlddaslH6xG9aGBgsJ9cvE46ghOqApBGjPZ+ +3QgpX2BL/wARAQABiQRyBBgBCgAmAhsCFiEEpJDQ9NMRpBU+K7fK27gCslis2E8F +Al7ROgoFCQZgRs8CQMF0IAQZAQoAHRYhBP4CnLSq1HiOHXgo6Kiw9ORbG1DiBQJb +h/c7AAoJEKiw9ORbG1DiPlsP/3SW95eFOmne+DNYROtGzPban3NCY2IkYMaZZgb2 +PvtnhRFTekCai/W0iemueOupPbNVdapkHADU+kO2RmnJshw+agKV/qDsWxldIaaT +IiRIKv5yCDV3vNMFaZ/JcxTA7aLU+mWYNmWL0diIWVFqS62/1NTmpu2A0mwBNnNV +ChOH+R8AAgOIc5bc1cVaX6GTInbJMcuBFR3upziO0o4qSEEyM6nQVNzM8Ejbi0k1 +OVtToF83oJ8n7ScaVxp8JGeHYXxLBQ/tzhIaM8KiIQo3Au75hmVwKTt2oA1swyZ4 +uBvttmk8DzduyoaCwmWjC556cGAhurDrB2e5Rs4CrzNbqQBaWMpI/+92679l/Zg5 +Iw1mOU6qbidciLi70ZkZzbYUV7RXZU6XUKDo54WoEOR3jmGpm5QTY7XSY5ZFPnAX +t8So+YL/MrRC3ncwlKR2LRLa32pytTx3a/Ama8HWaySdnR7dVQYljMZuNniD1FRj +BiJXu/dvRKMyJQv2mU15m+/wAiwuKG70Q4CzkxRZFv/Y184U57GVx7yiR5m5Og/V +WRid2uno1Q+8XrXkyf5yYSEXaA0BUlmltRqiuMl4nEayKj7kvP9AUVUkv5NbiFOu +F7VRMi2hafiUfIowM9fTyV+tCBxk+/nx4O9pM60TSxo8TRQYpNJ3jTN3WblMfOJ8 +vK2yCRDbuAKyWKzYTxu6EACUvfILqVM3qX5Bie+OeezU+0FhcwJnxVnfRKGUoLde +p8WrWA9ljw2BiN4+fzD1MXU/P0i+c5Ee54awIYZxU/8cLBzVH0hfRBjjQOaJw//r +n8Kev0ECuZkNOzOVEO/NskNdcdYjXvT0pj7lKm1HhF8tfojU+znz2m/FhkS+Gk8m +TVY9ggrRN1S057JgBwq0oB3guIz0q202xQDFDBOf5Yc5/7UY2pGUJcTGdgVyUAH4 +/LoNQcD0hj28gs3Zvsib/4urV0dA/vEW8yaze7FzDN9N/byENE/pq9pZ7j+6ECE7 +t6iMvRfyetgXLcLptWrPDTqxZJT5dJP59iq/yz9Ju5sw6FEO5GgTdR7+am0bvTRt +XcpnithrB81JLOnmWd1t3la+OUBIxvp+tZ1irR/hK+UZg+Svt268lva+S+EPIV9c +7/dC/OE6ZPEasL4VAdm2eA2iEJ7Q3MLf4cwpLtum6jXTp/f7bRRddROH8SpPRRxg +xHYYK0fsvk8bL+NwvjrErya+ldRBRg6t8FWJHnnsEYmvE2mSnEey24AfTJNY3mwb +g4iYrNHfBBQl6njqjuF/E0uYHB7Xr2hnoLafdI1AVgTtCDA6W7r0ltBn4qt0WLyh +meD+UkEXBwJ7eB6yXLow8nUzc1AMLP5v/xQ1BsFYX6iTCht2Xzr0/ToZm06AbR6H +z4kCNgQoAQoAIBYhBKSQ0PTTEaQVPiu3ytu4ArJYrNhPBQJhaFGBAh0DAAoJENu4 +ArJYrNhPBfkP/1qyF+aM6sH5TwccowYNjfg1fMdUrCHb1ly+znTP1NmKmcWzFl0S +CAeO9vdF7in3VjLQP/1m22td6TQ237hNdB/Qx3N87jikuFL54t5+DUXTvj/NWGTf +mr+ZWCty95DihhDyoLzljhxjzOM5hNmKHui3LeBEQk4omeM+TF8oWLdwNoDBQyB2 +kCdKK/SP6n/UrQbbrGbxKgIe9pWRxorrvT+/o/0/ERKjkkf9b+y4gTARt0Qwg0B3 +PqJU4NcVnFxMeyHqtbNFi9kBgKeMgN9UzqYxG/JxpmtAHN4pmaRC9liLQ7Ez1F60 +mEFbA9fWuYgQMJbubfjcP/RKZvO0mMyifIs184xG7i7teD7rPonMfbcIfIi0tswB +qPHy4rBGqppl2UWw7sdltJS9aKrpTThRsk1u6FqUN8zFYovWkcVBBM1OMMJ0w4jc +BauQMGNK8mSjfbOqepizdPjWDJVo7eOpJ5K4LGT6r+2UhkFiRvV6EdIMLxRUzDRA +5t8ItCoVv3ISaVAts0sVVv875+nWY7CYKeyn0Sg3HIDzzh15PzY/AgEtk2Bh3jfl +nEclzmmsGgLI4lCqe0NVeSyTrxmJ7HXKAly0nsqFhYjY1+29rmnaEfti2jBtV32l +AVfgt547uICHqA0U6gpRb4t8ginxoY6pDHPxCAQ6+e9E9bO72xZ3w4lnuDMEZk8j +iBYJKwYBBAHaRw8BAQdA10MAE40TGdm9Xkluqw82IJQtN/5hqWafBSLZ65UBnx2J +ArMEGAEKACYWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZk8jiAIbAgUJAxcEAACB +CRDbuAKyWKzYT3YgBBkWCgAdFiEEJtJvzcMq5UN82bdljpVn0yd5JwcFAmZPI4gA +CgkQjpVn0yd5JwfqVgD9HyarKZRGcLZZn9Y0Wmyz5LuAA0lwzMe0OZ7d9OYCOoUA +/1MNlxXW+BZcBl7A1EInPK8+wP+6h7OT88Fn78WutsMFMVsP/2knBj7RO/IvoX/n +z1xwp3pPhegm/etJohkM/4kTztV8dGms/doO/HGUO5KTCyxtpxTYhfPTmnqxQFxW +WFh8t+QJYBTH3M3B4lJNRscQe3LaCHWq7+nvLGrA/8mz8hXYpDbg8DBkdCDY1c+c +5cWMNbF3SjUVDxFnm+41zN0dO0yfcwDJFpFiM1j8zS9JgK/QsDm6mG2nclSe5FUh +dpCgcgP+XUydemt80A3biqgOOrCh+0u0bS9yqGlgIByYh31k+05alynid3IKT+KW +xTxL01BCX46LcoGO6QYtMwBepQc1mSAMVRlBHHyAaIjFce8WkCaCCv04ZsJKRHNY +AJxS88D6p0LVI90knvmVjhDMvWNxFFL5NGhgqBsC/gmexWg2xJncnq/Bnzzkrutx +Cx/nhFppMxKk9zO64OQ/OG9aOpwz6hJWOqysElUsRwWcmlZmihDClLOIDikVIda0 +D3tFD89ul0+ad4qXNGBdHx2ibX9q6kn319Fwl1GFgu66dmM2R6LoJhiaR+MNZW0s +DQlOsfdjm4f4il99dIci6jCwwayWd3RqlDEh+xBSxtrZbS/TWQtfspb2lIJOtJuI +C5KDReKdpbTRx0TrnTGNUk0/PysnpgYt5zH5sW+gRDFSQPetQ48D6EMbPclnp7M3 +iQzGar/QwonBMAEWKC/O0WVtklJcuDMEZk8j6RYJKwYBBAHaRw8BAQdAcMNnZHtL +fV2fpgSSflV3yUFu5TK9ZJHUNhEY1Mv76Q6JArMEGAEKACYWIQSkkND00xGkFT4r +t8rbuAKyWKzYTwUCZk8j6QIbAgUJAxcEAACBCRDbuAKyWKzYT3YgBBkWCgAdFiEE +raLtqVbClqcKbX/0/ixgDVu3WbUFAmZPI+kACgkQ/ixgDVu3WbXviAEAnHONnyCY +MmZWp1gKyfB1XqmjVn8KvWFDk5OyVwptwIcBAOMs0Xf/UZTusFIqC8bbc/OMHfXB +60Ld5SW2HRE8esALaCkP/j4sELqhiEruPcWkY5GSeXVRxmI+Kj/JafWNY+xboMsO +D2XhAiwVxHtosH1NiPrnCYvWhG1kFuUGcOd0iCF5051VY1x+HiOEX3VlEG6oRKq2 +DkjqWlp5SyTLOo+Z5rLEcGV5LDEmIfNSkcWVIQPYI7shZFQaSYGZuPgfQ8fOXLGe +/KoVe4Ool0KUaQwhB7ORopVJ5L2Q9qhjqyguoTvv6peOrfxucBzBUuVStjn7nMnJ +2SFZjxkiLTH9EFuG7Qv2tst8dfeorrftgNxtZN9xdt4Q9OnpKMW4IjKssOu2WDGD +kcKnWuBJf9mOG4EI5bd1IJTllKOj/6XZx8bGwvMTDkEiEtDjXoa9kTp6xZsaEs/a +xCSY4iy+9cFV+tn8LlqTWeyMOp/jHFxXPsRuR89Erkh73S+6G3R/Dr5AMmqfOdrL +pKXdUcuP8zWwePm0+PPpSciQQ2NejbkqKQ89g+f9jB4lhQ6wIB13BRO6Y/WU2p8n +4zrgx01MTo/PPUfXSql2WdyCU6wGc8Vp8i3BAqIAD70v+wQrYB3a7l8GWvgsmUZl +5cLOMScM9sOjvYZAiJtYMoJ/BTXFixt/uFOaiKzHjRsoRmyTymRfvxVVpoyOsHRi +LUrtKnOSRdpej+UNioorWhnyBQu+rbvv2CWfJoiD2Ksd5/qb/1KjtlhdfaKZx0/T +uDMEZk8j+RYJKwYBBAHaRw8BAQdAXEAPlpRRSsOA0ZJG0N0+rJDUprw9hU/38Pls +blEIdHOJArMEGAEKACYWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZk8j+QIbAgUJ +AxcEAACBCRDbuAKyWKzYT3YgBBkWCgAdFiEEzrNt54VyjnCPWTt1xp/w5MCPggkF +AmZPI/kACgkQxp/w5MCPggmu6wD/R6o47LT5jcyaBaudt9FKP3ZXxEmiF3jhjMfo +b0++hVsBAJdDuIK3vuHb9O93UrwLWWpSEk4yPsW/iiEct6Y+rHEB0CoP/0Pl0Z+A +GXact3BBaF8VLspmvVIhlMDims7UcAPPUcQHcRrsV5dWqn24rQalz9xXeM6XvaMf +bzwsc9EDmPvYtNG3DAYOrhg+VMG48e0+OsD7aZdWOeXLPK/bsDrQwUvT+AbcBPXl +JoRdkxt0ZSN/lmzYT+ULYUQI2m44R3SYRusos906uL0Aa3xSR79zvTWvh+pt8aL/ +0U2X8/iysr77w+y1yIxbzExGVHLxA8C2MC91jxs+Ef9qpwjQpORxDij2+r2TXqz8 +qJ15+F+GNkfif3OxgenOmagmjm3qQ3Ok2KdHXPTsr2q2TUne3JkrLv0fPCuq6OjX +yJbb4Of8Qg+e0j0JPRiZe3V7L8AXG4i+3Zn/fQQUMVhlAFK9auQdVhzBiUW+72rp +SdtuVMN09YBh0OzAmYOkl6E525IHkZelTxLrrorcPRqfoHgZcebxIi7KcOaQY0FV +UiGyjaBBNq5N7kB6jUdiKsa2NvFKwLoo9EVVNhdpf5iGv9NpZJi1DY75o9GvHyfZ +O4oKUv8mtHOmxqohHih6Y+CGQNnPut2wOBuGxeft6Ck/1y8KbfYoB4CnJBHY61lJ +UNJ32ID8FjPiKlVLv4anP5PF2O91Wq6hU12SMuXR8/Uy3EIrE8En0FOQum096aN4 +3tRnxdJi8EJuvZKse2z8K1iE/d90OjWT3HEWuDMEZk8kBRYJKwYBBAHaRw8BAQdA +aCd5SqnXQj0NWqwmW668zg1GNLY57b4HzzU/gxKCrCyJArMEGAEKACYWIQSkkND0 +0xGkFT4rt8rbuAKyWKzYTwUCZk8kBQIbAgUJAxcEAACBCRDbuAKyWKzYT3YgBBkW +CgAdFiEET94dBlsQND+9ZCoUvIvT2snNKXkFAmZPJAUACgkQvIvT2snNKXk6pwD/ +cMVj7/+0Jwv3g7LEDoKcVu3B5aYQDgXKPnRI9EdZrlkBAJkCvFAVZe9lnBmNeyQ1 +fGhEpCBxyqLZJgMy5I8xLYMKpNQP/RmPVO28k5Q/pgUevf1dsRYW28/14fbTA30e +8mR5VCNyjbUBpRnGs8+1LXl+DiX7XhRtbW4yeE/H351UxxoWfbSQKiWbxByqaJ20 +0GQGXgx3LEtJ6Gv2roW8Y82cRkgfF2YniQ0sg9c7zP2C2350s+N4UHUSqnCADHnT +6y8EfYBnQ8TO/ecoUEhp8becF8EO6Y1cNWx4Ect/DVvqFbVvxWkmRpxOq9idSPtc +wEnKUjHPSaX4BUeWu8acNfSdvJ9AnG3PzxuPHKZg29NWCYHkfYuK0ifNrh43MH6b +8frHIyhxIh//uVc8DuELLHg5fAyl4F89bxeQ0mYdvH/qA6yk2a8aVU/SxoxVGH+n +Zdrm6Lu1TGmdvLTObnlhLdvQH/gFSw3Kn+hGjpDRIGKrDS2hWw+SQ+HSO7KcOXCc +DAzAfVeLyk4f0xbYox1as2MvmQHD1qFUJ1SBR+mtt9bbwSlvmoZyaHSRyaAtdoo3 +914fj/mFpDu06vEHVJGOi47uHZJ+yBbaU8cLOyqD4x4HjSKxtsFiOvcFQ2YOZPWn +v8a7kCq+AOK/fDS+7pweZ5oV2ymH22EzxZZwed5bxZlFclTqtUf/XACLbPQJA4WU +985KBJQvR7OMkrmaD3i0Cuxt5dOR9xIMgcQ1NLWEyqZl83qfkfL7qRTY0xrMofS1 +Hdg/UZj5 +=W5H7 -----END PGP PUBLIC KEY BLOCK----- diff --git a/initrd/etc/functions b/initrd/etc/functions old mode 100755 new mode 100644 index 637beef0e..fb5e35d95 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1,6 +1,416 @@ #!/bin/bash -# Shell functions for most initialization scripts -. /etc/ash_functions + +# ------- Start of functions coming from /etc/ash_functions + +die() { + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + echo -e " !!! ERROR: $* !!!" | tee -a /tmp/debug.log /dev/kmsg >/dev/null + else + echo -e "!!! ERROR: $* !!!" >&2 + fi + sleep 2 + exit 1 +} + +# Use warn only for output that indicates a _likely_ problem, is _actionable_ to +# correct, and when we are able to continue with degraded functionalty. +# Do not overuse this! See doc/logging.md. +warn() { + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + echo -e " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg >/dev/null + else + echo -e " *** WARNING: $* ***" >&2 + fi + sleep 1 +} + +# Use DEBUG to track decisions made in script/function logic and the context +# relating to those decisions. Generally, focus on decision points, because +# straight-line execution can usually be followed without further tracing. See +# doc/logging.md. +DEBUG() { + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + # fold -s -w 960 will wrap lines at 960 characters on the last space before the limit + echo "DEBUG: $*" | fold -s -w 960 | while read line; do + echo "$line" | tee -a /tmp/debug.log /dev/kmsg >/dev/null + done + fi +} + +# Use TRACE to trace control flow through Heads. This is usually called by +# TRACE_FUNC, but you can use it to additionally trace parameter values, etc. +# Usually, use this to display unprocessed parameters that your script or +# function received. For information about the logic occurring in your script +# or function, use DEBUG. See doc/logging.md. +TRACE() { + if [ "$CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" = "y" ]; then + echo "TRACE: $*" | tee -a /tmp/debug.log /dev/kmsg >/dev/null + fi +} + +# Use NOTE to explain behaviors that are _likely_ to be unexpected or confusing. +# Unlike INFO, this cannot be hidden, as the explained behavior would be too +# confusing without this output. +# Don't overuse this - too much NOTE output will cause users to ignore it. See +# doc/logging.md. +NOTE() { + echo "NOTE:" "$@" | tee -a /tmp/debug.log +} + +# Use INFO for contextual information that might make sense to non-developers, +# but that isn't generally needed to use Heads. Non-developers might use this +# level to troubleshoot basic problems, so it must make sense without deep +# knowledge of how Heads works. See doc/logging.md. +INFO() { + #TODO: add colors to output, here green for INFO? + + # if not CONFIG_QUIET_MODE=y, output to console. If not, output to debug.log + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + echo "$*" | tee -a /tmp/debug.log /dev/kmsg >/dev/null + elif [ "$CONFIG_QUIET_MODE" = "y" ]; then + echo "$*" >>/tmp/debug.log + else + echo "$*" + fi +} + +# Write directly to the debug log (but not kmsg), never appears on console +# Main consumer is DO_WITH_DEBUG, which uses this to log command output +LOG() { + echo "LOG: $*" >>/tmp/debug.log +} + +fw_version() { + local FW_VER=$(dmesg | grep 'DMI' | grep -o 'BIOS.*' | cut -f2- -d ' ') + # chop off date, since will always be epoch w/timeless builds + echo "${FW_VER::-10}" +} + +preserve_rom() { + TRACE_FUNC + new_rom="$1" + old_files=$(cbfs -t 50 -l 2>/dev/null | grep "^heads/") + + for old_file in $(echo $old_files); do + new_file=$(cbfs.sh -o $1 -l | grep -x $old_file) + if [ -z "$new_file" ]; then + echo "+++ Adding $old_file to $1" + cbfs -t 50 -r $old_file >/tmp/rom.$$ || + die "Failed to read cbfs file from ROM" + cbfs.sh -o $1 -a $old_file -f /tmp/rom.$$ || + die "Failed to write cbfs file to new ROM file" + fi + done +} + +confirm_gpg_card() { + + #TODO: ideally, we ask for confirmation only once per boot session + #TODO: even change logic here to try first and then ask user to confirm if not found + #TODO: or ask GPG User PIN once and cache it for the rest of the boot session for reusal + # This is getting in the way of unattended stuff and GPG prompts are confusing anyway, hide them from user. + + TRACE_FUNC + #Skip prompts if we are currently using a known GPG key material Thumb drive backup and keys are unlocked pinentry + #TODO: probably export CONFIG_GPG_KEY_BACKUP_IN_USE but not under /etc/user.config? + #Toggle to come in next PR, but currently we don't have a way to toggle it back to n if config.user flashed back in rom + if [[ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" && "$CONFIG_GPG_KEY_BACKUP_IN_USE" == "y" ]]; then + DEBUG "Using known GPG key material Thumb drive backup and keys are unlocked and useable through pinentry" + return + fi + + if [ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" ]; then + message="Please confirm that your GPG card is inserted(Y/n) or your GPG key material (b)backup thumbdrive is inserted [Y/n/b]: " + else + # Generic message if no known key material backup + message="Please confirm that your GPG card is inserted [Y/n]: " + fi + + read \ + -n 1 \ + -p "$message" \ + card_confirm + echo + + if [ "$card_confirm" != "y" \ + -a "$card_confirm" != "Y" \ + -a "$card_confirm" != "b" \ + -a -n "$card_confirm" ] \ + ; then + die "gpg card not confirmed" + fi + + # If user has known GPG key material Thumb drive backup and asked to use it + if [[ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" && "$card_confirm" == "b" ]]; then + #Only mount and import GPG key material thumb drive backup once + if [ ! "$CONFIG_GPG_KEY_BACKUP_IN_USE" == "y" ]; then + CR_NONCE="/tmp/secret/cr_nonce" + CR_SIG="$CR_NONCE.sig" + + #Wipe any previous CR_NONCE and CR_SIG + shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" >/dev/null 2>&1 || true + + #Prompt user for configured GPG Admin PIN that will be passed along to mount-usb and to import gpg subkeys + echo + gpg_admin_pin="" + while [ -z "$gpg_admin_pin" ]; do + #TODO: change all passphrase prompts in codebase to include -r to prevent backslash escapes + read -r -s -p "Please enter GPG Admin PIN needed to use the GPG backup thumb drive: " gpg_admin_pin + echo + done + #prompt user to select the proper encrypted partition, which should the first one on next prompt + warn "Please select encrypted LUKS on GPG key material backup thumb drive (not public labeled one)" + mount-usb --pass "$gpg_admin_pin" || die "Unable to mount USB with provided GPG Admin PIN" + echo "++++ Testing detach-sign operation and verifiying against fused public key in ROM" + gpg --pinentry-mode=loopback --passphrase-file <(echo -n "${gpg_admin_pin}") --import /media/subkeys.sec >/dev/null 2>&1 || + die "Unable to import GPG private subkeys" + #Do a detach signature to ensure gpg material is usable and cache passphrase to sign /boot from caller functions + dd if=/dev/urandom of="$CR_NONCE" bs=20 count=1 >/dev/null 2>&1 || + die "Unable to create $CR_NONCE to be detach-signed with GPG private signing subkey" + gpg --pinentry-mode=loopback --passphrase-file <(echo -n "${gpg_admin_pin}") --detach-sign "$CR_NONCE" >/dev/null 2>&1 || + die "Unable to detach-sign $CR_NONCE with GPG private signing subkey using GPG Admin PIN" + #verify detached signature against public key in rom + gpg --verify "$CR_SIG" "$CR_NONCE" >/dev/null 2>&1 && + echo "++++ Local GPG keyring can be used to sign/encrypt/authenticate in this boot session ++++" || + die "Unable to verify $CR_SIG detached signature against public key in ROM" + #Wipe any previous CR_NONCE and CR_SIG + shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" >/dev/null 2>&1 || true + #TODO: maybe just an export instead of setting /etc/user.config otherwise could be flashed in weird corner case situation + set_user_config "CONFIG_GPG_KEY_BACKUP_IN_USE" "y" + umount /media || die "Unable to unmount USB" + return + fi + fi + + # setup the USB so we can reach the USB Security dongle's OpenPGP smartcard + enable_usb + + echo -e "\nVerifying presence of GPG card...\n" + # ensure we don't exit without retrying + errexit=$(set -o | grep errexit | awk '{print $2}') + set +e + gpg_output=$(gpg --card-status 2>&1) + if [ $? -ne 0 ]; then + # prompt for reinsertion and try a second time + read -n1 -r -p \ + "Can't access GPG key; remove and reinsert, then press Enter to retry. " \ + ignored + # restore prev errexit state + if [ "$errexit" = "on" ]; then + set -e + fi + # retry card status + gpg_output=$(gpg --card-status 2>&1) || + die "gpg card read failed" + fi + # restore prev errexit state + if [ "$errexit" = "on" ]; then + set -e + fi + + # Extract and display GPG PIN retry counters + # output excerpt: "PIN retry counter : 3 0 3" + pin_retry_counters=$(echo "$gpg_output" | grep 'PIN retry counter' | awk -F': ' '{print $2}') + user_pin_retries=$(echo "$pin_retry_counters" | awk '{print $1}') + admin_pin_retries=$(echo "$pin_retry_counters" | awk '{print $3}') + + echo "" + echo "GPG User PIN retry attempts left before becoming locked: $user_pin_retries" + echo "GPG Admin PIN retry attempts left before becoming locked: $admin_pin_retries" + echo "" + NOTE "Your GPG User PIN, followed by Enter key will be required for input at: 'Please unlock the card' next prompt" + echo "" +} + +gpg_auth() { + if [[ "$CONFIG_HAVE_GPG_KEY_BACKUP" == "y" ]]; then + TRACE_FUNC + # If we have a GPG key backup, we can use it to authenticate even if the card is lost + echo >&2 "!!!!! Please authenticate with OpenPGP smartcard/backup media to prove you are the owner of this machine !!!!!" + + # Wipe any existing nonce and signature + shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" 2>/dev/null || true + + # In case of gpg_auth, we require confirmation of the card, so loop with confirm_gpg_card until we get it + false + while [ $? -ne 0 ]; do + # Call confirm_gpg_card in subshell to ensure GPG key material presence + (confirm_gpg_card) + done + + # Perform a signing-based challenge-response, + # to authencate that the card plugged in holding + # the key to sign the list of boot files. + + CR_NONCE="/tmp/secret/cr_nonce" + CR_SIG="$CR_NONCE.sig" + + # Generate a random nonce + dd \ + if=/dev/urandom \ + of="$CR_NONCE" \ + count=1 \ + bs=20 \ + 2>/dev/null || + die "Unable to generate 20 random bytes" + + # Sign the nonce + for tries in 1 2 3; do + if gpg --digest-algo SHA256 \ + --detach-sign \ + -o "$CR_SIG" \ + "$CR_NONCE" >/dev/null 2>&1 && + gpg --verify "$CR_SIG" "$CR_NONCE" >/dev/null 2>&1 \ + ; then + shred -n 10 -z -u "$CR_NONCE" "$CR_SIG" 2>/dev/null || true + DEBUG "Under /etc/ash_functions:gpg_auth: success" + return 0 + else + shred -n 10 -z -u "$CR_SIG" 2>/dev/null || true + if [ "$tries" -lt 3 ]; then + echo >&2 "!!!!! GPG authentication failed, please try again !!!!!" + continue + else + die "GPG authentication failed, please reboot and try again" + fi + fi + done + return 1 + fi +} + +recovery() { + TRACE_FUNC + echo >&2 "!!!!! $*" + + # Remove any temporary secret files that might be hanging around + # but recreate the directory so that new tools can use it. + + #safe to always be true. Otherwise "set -e" would make it exit here + shred -n 10 -z -u /tmp/secret/* 2>/dev/null || true + rm -rf /tmp/secret + mkdir -p /tmp/secret + + # ensure /tmp/config exists for recovery scripts that depend on it + touch /tmp/config + . /tmp/config + + DEBUG "Board $CONFIG_BOARD - version $(fw_version)" + + if [ "$CONFIG_TPM" = "y" ]; then + INFO "TPM: Extending PCR[4] to prevent any further secret unsealing" + tpmr extend -ix 4 -ic recovery + fi + + if [ "$CONFIG_RESTRICTED_BOOT" = y ]; then + echo >&2 "Restricted Boot enabled, recovery console disabled, rebooting in 5 seconds" + sleep 5 + /bin/reboot + fi + while [ true ]; do + #Going to recovery shell should be authenticated if supported + gpg_auth + + echo >&2 "!!!!! Starting recovery shell" + sleep 1 + + if [ -x /bin/setsid ]; then + /bin/setsid -c /bin/bash + else + /bin/bash + fi + done +} + +pause_recovery() { + TRACE_FUNC + read -p $'!!! Hit enter to proceed to recovery shell !!!\n' + recovery $* +} + +combine_configs() { + TRACE_FUNC + cat /etc/config* >/tmp/config +} + +replace_config() { + TRACE_FUNC + CONFIG_FILE=$1 + CONFIG_OPTION=$2 + NEW_SETTING=$3 + + touch $CONFIG_FILE + # first pull out the existing option from the global config and place in a tmp file + awk "gsub(\"^export ${CONFIG_OPTION}=.*\",\"export ${CONFIG_OPTION}=\\\"${NEW_SETTING}\\\"\")" /tmp/config >${CONFIG_FILE}.tmp + awk "gsub(\"^${CONFIG_OPTION}=.*\",\"${CONFIG_OPTION}=\\\"${NEW_SETTING}\\\"\")" /tmp/config >>${CONFIG_FILE}.tmp + + # then copy any remaining settings from the existing config file, minus the option you changed + grep -v "^export ${CONFIG_OPTION}=" ${CONFIG_FILE} | grep -v "^${CONFIG_OPTION}=" >>${CONFIG_FILE}.tmp || true + sort ${CONFIG_FILE}.tmp | uniq >${CONFIG_FILE} + rm -f ${CONFIG_FILE}.tmp +} + +# Set a config variable in a specific file to a given value - replace it if it +# exists, or add it. If added, the variable will be exported. +set_config() { + CONFIG_FILE="$1" + CONFIG_OPTION="$2" + NEW_SETTING="$3" + + if grep -q "$CONFIG_OPTION" "$CONFIG_FILE"; then + replace_config "$CONFIG_FILE" "$CONFIG_OPTION" "$NEW_SETTING" + else + echo "export $CONFIG_OPTION=\"$NEW_SETTING\"" >>"$CONFIG_FILE" + fi +} + +# Set a value in config.user, re-combine configs, and update configs in the +# environment. +set_user_config() { + CONFIG_OPTION="$1" + NEW_SETTING="$2" + + set_config /etc/config.user "$CONFIG_OPTION" "$NEW_SETTING" + combine_configs + . /tmp/config +} + +# Load a config value to a variable, defaulting to empty. Does not fail if the +# config is not set (since it would expand to empty by default). +load_config_value() { + local config_name="$1" + if grep -q "$config_name=" /tmp/config; then + grep "$config_name=" /tmp/config | tail -n1 | cut -f2 -d '=' | tr -d '"' + fi +} + +enable_usb() { + TRACE_FUNC + #insmod ehci_hcd prior of uhdc_hcd and ohci_hcd to suppress dmesg warning + insmod /lib/modules/ehci-hcd.ko || die "ehci_hcd: module load failed" + + if [ "$CONFIG_LINUX_USB_COMPANION_CONTROLLER" = y ]; then + insmod /lib/modules/uhci-hcd.ko || die "uhci_hcd: module load failed" + insmod /lib/modules/ohci-hcd.ko || die "ohci_hcd: module load failed" + insmod /lib/modules/ohci-pci.ko || die "ohci_pci: module load failed" + fi + insmod /lib/modules/ehci-pci.ko || die "ehci_pci: module load failed" + insmod /lib/modules/xhci-hcd.ko || die "xhci_hcd: module load failed" + insmod /lib/modules/xhci-pci.ko || die "xhci_pci: module load failed" + sleep 2 + + # For resiliency, test CONFIG_USB_KEYBOARD_REQUIRED explicitly rather + # than having it imply CONFIG_USER_USB_KEYBOARD at build time. + # Otherwise, if a user got CONFIG_USER_USB_KEYBOARD=n in their + # config.user by mistake (say, by copying config.user from a laptop to a + # desktop/server), they could lock themselves out, only recoverable by + # hardware flash. + if [ "$CONFIG_USB_KEYBOARD_REQUIRED" = y ] || [ "$CONFIG_USER_USB_KEYBOARD" = y ]; then + insmod /lib/modules/usbhid.ko || die "usbhid: module load failed" + fi +} + +# ------- End of functions coming from /etc/ash_functions # Print or depending on whether $1 is empty. Useful to mask an # optional password parameter. @@ -12,25 +422,140 @@ mask_param() { fi } -# Trace a command with DEBUG, then execute it. +# Pipe input to this to sink it to the debug log, with a name prefix. +# If the input is empty, no output is produced, so actual output is +# readily visible in logs. +# +# For example: +# ls /boot/vmlinux* | SINK_LOG "/boot kernels" +# +# To capture stderr: +# cryptsetup open /dev/sda1 media-crypt 2> >(SINK_LOG "LUKS unlock sda1 errors") +# (Note: the space between '>' is necessary in '2> >(SINK_LOG ...)') +# +# To capture both: +# tpm reset > >(SINK_LOG "tpm reset") 2>&1 +# (Note: 2>&1 must follow the stdout redirection, and space between '>' is +# necessary) +SINK_LOG() { + local name="$1" + local line haveblank + # If the input doesn't end with a line break, read won't give us the + # last (unterminated) line. Add a line break with echo to ensure we + # don't lose any input. Buffer up to one blank line so we can avoid + # emitting a final (or only) blank line. + ( + cat + echo + ) | while IFS= read -r line; do + [[ -n "$haveblank" ]] && LOG "$name: " # Emit buffered blank line + if [[ -z "$line" ]]; then + haveblank=y + else + haveblank= + LOG "$name: $line" + fi + done +} + +# Trace a command with DEBUG, then execute it. Trace failed exit status, stdout +# and stderr, etc. +# +# DO_WITH_DEBUG is designed so it can be dropped in to most command invocations +# without side effects - it adds visibility without actually affecting the +# execution of the script. Exit statuses, stdout, and stderr are traced, but +# they are still returned/written to the caller. +# # A password parameter can be masked by passing --mask-position N before the # command to execute, the debug trace will just indicate whether the password # was empty or nonempty (which is important when use of a password is optional). # N=0 is the name of the command to be executed, N=1 is its first parameter, # etc. +# +# DO_WITH_DEBUG() can be added in most places where a command is executed to +# add visibility in the debug log. For example: +# +# [DO_WITH_DEBUG] mount "$BLOCK" "$MOUNTPOINT" +# ^-- adding DO_WITH_DEBUG will show the block device, mountpoint, and whether +# the mount fails +# +# [DO_WITH_DEBUG --mask-position 7] tpmr seal "$KEY" "$IDX" "$pcrs" "$pcrf" "$size" "$PASSWORD" +# ^-- trace the resulting invocation, but mask the password in the log +# +# if ! [DO_WITH_DEBUG] umount "$MOUNTPOINT"; then [...] +# ^-- it can be used when the exit status is checked, like the condition of `if` +# +# hotp_token_info="$([DO_WITH_DEBUG] hotp_verification info)" +# ^-- output of hotp_verification info becomes visible in debug log while +# still being captured by script +# +# [DO_WITH_DEBUG] umount "$MOUNTPOINT" &>/dev/null || true +# ^-- if the command's stdout/stderr/failure are ignored, this still works the +# same way with DO_WITH_DEBUG DO_WITH_DEBUG() { - if [ "$1" == "--mask-position" ]; then - mask_position="$2" + local exit_status=0 + local cmd_output + if [[ "$1" == "--mask-position" ]]; then + local mask_position="$2" shift shift - DEBUG_ARGS=("$@") - - DEBUG_ARGS[$mask_position]="$(mask_param "${DEBUG_ARGS[$mask_position]}")" - DEBUG "${DEBUG_ARGS[@]}" + local show_args=("$@") + show_args[$mask_position]="$(mask_param "${show_args[$mask_position]}")" + DEBUG "${show_args[@]}" else DEBUG "$@" fi - "$@" + + # Execute the command and capture the exit status. Tee stdout/stderr to + # debug sinks, so they're visible but still can be used by the caller + # + # This is tricky when set -e / set -o pipefail may or may not be in + # effect. + # - Putting the command in an `if` ensures set -e won't terminate us, + # and also does not overwrite $? (like `|| true` would). + # - We capture PIPESTATUS[0] whether the command succeeds or fails, + # since we don't know whether the pipeline status will be that of the + # command or 'tee' (depends on set -o pipefail). + if ! "$@" 2> >(tee /dev/stderr | SINK_LOG "$1 stderr") | tee >(SINK_LOG "$1 stdout"); then + exit_status="${PIPESTATUS[0]}" + else + exit_status="${PIPESTATUS[0]}" + fi + if [[ "$exit_status" -ne 0 ]]; then + # Trace unsuccessful exit status, but only at DEBUG because this + # may be expected. Include the command name in case the command + # also invoked a DO_WITH_DEBUG (it could be a script). + DEBUG "$1: exited with status $exit_status" + fi + # If the command was (probably) not found, trace PATH in case it + # prevented the command from being found + if [[ "$exit_status" -eq 127 ]]; then + DEBUG "$1: PATH=$PATH" + fi + + return "$exit_status" +} + +# Trace the current script and function. +TRACE_FUNC() { + # Index [1] for BASH_SOURCE and FUNCNAME give us the caller location. + # FUNCNAME is 'main' if called from a script outside any function. + # BASH_LINENO is offset by 1, it provides the line that the + # corresponding FUNCNAME was _called from_, so BASH_LINENO[0] is the + # location of the caller. + TRACE "${BASH_SOURCE[1]}(${BASH_LINENO[0]}): ${FUNCNAME[1]}" +} + +# Show the entire current call stack in debug output - useful if a catastrophic +# error or something very unexpected occurs, like totally invalid parameters. +DEBUG_STACK() { + local FRAMES + FRAMES="${#FUNCNAME[@]}" + DEBUG "call stack: ($((FRAMES - 1)) frames)" + # Don't print DEBUG_STACK itself, start from 1 + for i in $(seq 1 "$((FRAMES - 1))"); do + DEBUG "- $((i - 1)) - ${BASH_SOURCE[$i]}(${BASH_LINENO[$((i - 1))]}): ${FUNCNAME[$i]}" + done } pcrs() { @@ -42,7 +567,7 @@ pcrs() { } confirm_totp() { - TRACE "Under /etc/functions:confirm_totp" + TRACE_FUNC prompt="$1" last_half=X unset totp_confirm @@ -81,7 +606,7 @@ confirm_totp() { } reseal_tpm_disk_decryption_key() { - TRACE "Under /etc/functions:reseal_tpm_disk_decryption_key" + TRACE_FUNC #For robustness, exit early if LUKS TPM Disk Unlock Key is prohibited in board configs if [ "$CONFIG_TPM_DISK_UNLOCK_KEY" == "n" ]; then DEBUG "LUKS TPM Disk Unlock Key is prohibited in board configs" @@ -96,17 +621,17 @@ reseal_tpm_disk_decryption_key() { fi if [ -s /boot/kexec_key_devices.txt ] || [ -s /boot/kexec_key_lvm.txt ]; then - warn "LUKS TPM sealed Disk Unlock Key secret needs to be resealed alongside TOTP/HOTP secret" + NOTE "LUKS TPM sealed Disk Unlock Key secret needs to be resealed alongside TOTP/HOTP secret" echo "Resealing LUKS TPM Disk Unlock Key to be unsealed by LUKS TPM Disk Unlock Key passphrase" while ! kexec-seal-key /boot; do warn "Recovery Disk Encryption key passphrase/TPM Owner Password may be invalid. Please try again" done - warn "LUKS header hash changed under /boot/kexec_luks_hdr_hash.txt" + NOTE "LUKS header hash changed under /boot/kexec_luks_hdr_hash.txt" echo "Updating checksums and signing all files under /boot/kexec.sig" while ! update_checksums; do warn "Checksums were not signed. Preceding errors should explain possible causes" done - warn "Rebooting in 3 seconds to enable booting default boot option" + NOTE "Rebooting in 3 seconds to enable booting default boot option" sleep 3 reboot else @@ -118,7 +643,7 @@ reseal_tpm_disk_decryption_key() { # be detected. If USB storage was already enabled, no wait occurs, this would # have happened already when USB storage was enabled. enable_usb_storage() { - TRACE "Under /etc/functions:enable_usb_storage" + TRACE_FUNC if ! lsmod | grep -q usb_storage; then timeout=0 echo "Scanning for USB storage devices..." @@ -132,8 +657,30 @@ enable_usb_storage() { fi } +device_has_partitions() { + local DEVICE="$1" + # fdisk normally says "doesn't contain a valid partition table" for + # devices that lack a partition table - except for FAT32. + # + # FAT32 devices have a volume boot record that looks enough like an MBR + # to satisfy fdisk. In that case, fdisk prints a partition table header + # but no partitions. + # + # This check covers that: [ $(fdisk -l "$b" | wc -l) -eq 5 ] + # In both cases the output is 5 lines: 3 about device info, 1 empty line + # and the 5th will be the table header or the invalid message. + local DISK_DATA=$(fdisk -l "$DEVICE" 2>/dev/null) + if echo "$DISK_DATA" | grep -q "doesn't contain a valid partition table" || + [ "$(echo "$DISK_DATA" | wc -l)" -eq 5 ]; then + # No partition table + return 1 + fi + # There is a partition table + return 0 +} + list_usb_storage() { - TRACE "Under /etc/functions:list_usb_storage" + TRACE_FUNC # List all USB storage devices, including partitions unless we received argument stating we want drives only # The output is a list of device names, one per line. @@ -162,16 +709,7 @@ list_usb_storage() { # never usable directly, and this allows the "wait for # disks" loop in mount-usb to correctly wait for the # partitions. - # This check: [ $(fdisk -l "$b" | wc -l) -eq 5 ] - # covers the case of a device without partition table but - # formatted as fat32, which contains a sortof partition table. - # this causes fdisk to not print the invalid partition table - # message and instead it'll print an empty table with header. - # In both cases the output is 5 lines: 3 about device info, - # 1 empty line and the 5th will be the table header or the - # unvalid message. - DISK_DATA=$(fdisk -l "$b") - if echo "$DISK_DATA" | grep -q "doesn't contain a valid partition table" || [ $(echo "$DISK_DATA" | wc -l) -eq 5 ]; then + if ! device_has_partitions "$b"; then # No partition table, include this device DEBUG "USB storage device without partition table: $b" echo "$b" @@ -189,12 +727,12 @@ list_usb_storage() { done } -# Prompt for a TPM Owner Password if it is not already cached in /tmp/secret/tpm_owner_password. -# Sets tpm_owner_password variable reused in flow, and cache file used until recovery shell is accessed. -# Tools should optionally accept a TPM password on the command line, since some flows need +# Prompt for a TPM Owner Password if it is not already cached in /tmp/secret/tpm_owner_password. +# Sets tpm_owner_password variable reused in flow, and cache file used until recovery shell is accessed. +# Tools should optionally accept a TPM password on the command line, since some flows need # it multiple times and only one prompt is ideal. prompt_tpm_owner_password() { - TRACE "Under /etc/functions:prompt_tpm_owner_password" + TRACE_FUNC if [ -s /tmp/secret/tpm_owner_password ]; then DEBUG "/tmp/secret/tpm_owner_password already cached in file. Reusing" @@ -211,12 +749,12 @@ prompt_tpm_owner_password() { echo -n "$tpm_owner_password" >/tmp/secret/tpm_owner_password || die "Unable to cache TPM owner_password under /tmp/secret/tpm_owner_password" } -# Prompt for a new TPM Owner Password when resetting the TPM. +# Prompt for a new TPM Owner Password when resetting the TPM. # Returned in tpm_owner_passpword and cached under /tpm/secret/tpm_owner_password # The password must be 1-32 characters and must be entered twice, # the script will loop until this is met. prompt_new_owner_password() { - TRACE "Under /etc/functions:prompt_new_owner_password" + TRACE_FUNC local tpm_owner_password2 tpm_owner_password=1 tpm_owner_password2=2 @@ -240,8 +778,8 @@ prompt_new_owner_password() { } check_tpm_counter() { - TRACE "Under /etc/functions:check_tpm_counter" - + TRACE_FUNC + LABEL=${2:-3135106223} tpm_password="$3" # if the /boot.hashes file already exists, read the TPM counter ID @@ -249,12 +787,12 @@ check_tpm_counter() { if [ -r "$1" ]; then TPM_COUNTER=$(grep counter- "$1" | cut -d- -f2) else - warn "$1 does not exist; creating new TPM counter" + INFO "$1 does not exist; creating new TPM counter" tpmr counter_create \ -pwdc '' \ -la $LABEL | - tee /tmp/counter || - die "Unable to create TPM counter" + tee /tmp/counter >/dev/null 2>&1 || + die "Unable to create TPM counter" TPM_COUNTER=$(cut -d: -f1 /dev/null 2>&1 || die "Counter read failed" } +# Increment the TPM counter value in the TPM. increment_tpm_counter() { - TRACE "Under /etc/functions:increment_tpm_counter" + TRACE_FUNC tpmr counter_increment -ix "$1" -pwdc '' | - tee /tmp/counter-$1 || + tee /tmp/counter-$1 >/dev/null 2>&1 || die "TPM counter increment failed for rollback prevention. Please reset the TPM" } +# Check detached signature on kexec boot params check_config() { - TRACE "Under /etc/functions:check_config" + TRACE_FUNC if [ ! -d /tmp/kexec ]; then mkdir /tmp/kexec || die 'Failed to make kexec tmp dir' @@ -295,12 +836,13 @@ check_config() { fi if [ "$2" != "force" ]; then + # Note that kexec.sig detached signature is solely verifying kexec*.txt files here! if ! sha256sum $(find $1/kexec*.txt) | gpgv $1/kexec.sig -; then die 'Invalid signature on kexec boot params' fi fi - echo "+++ Found verified kexec boot params" + INFO "+++ Found verified kexec boot params" cp $1/kexec*.txt /tmp/kexec || die "Failed to copy kexec boot params to tmp" } @@ -317,8 +859,9 @@ replace_rom_file() { cbfs.sh -o "$ROM" -a "$ROM_FILE" -f "$NEW_FILE" } +# Replace the config file by the changed one replace_config() { - TRACE "Under /etc/functions:replace_config" + TRACE_FUNC CONFIG_FILE=$1 CONFIG_OPTION=$2 NEW_SETTING=$3 @@ -350,8 +893,9 @@ secret_from_rom_hash() { sha256sum "${ROM_IMAGE}" | cut -f1 -d ' ' | fromhex_plain } +# Update the checksums of the files in /boot and sign them update_checksums() { - TRACE "Under /etc/functions:update_checksums" + TRACE_FUNC # ensure /boot mounted if ! grep -q /boot /proc/mounts; then mount -o ro /boot || @@ -380,8 +924,9 @@ update_checksums() { return $rv } +# Print the file and directory structure of /boot to caller's stdout print_tree() { - TRACE "Under /etc/functions:print_tree" + TRACE_FUNC find ./ ! -path './kexec*' -print0 | sort -z } @@ -449,11 +994,9 @@ escape_zero() { # due to https://bugs.busybox.net/show_bug.cgi?id=14226. Also, certain characters # may be intepreted by `whiptail`, `less` et al (e.g. \n, \b, ...). assert_signable() { - TRACE "Under /etc/functions:assert_signable" + TRACE_FUNC # ensure /boot mounted - if ! grep -q /boot /proc/mounts; then - mount -o ro /boot || die "Unable to mount /boot" - fi + detect_boot_device find /boot -print0 >/tmp/signable.ref local del='\001-\037\134\177-\377' @@ -467,8 +1010,9 @@ assert_signable() { rm -f /tmp/signable.* } +# Verify the checksums of the files in /boot verify_checksums() { - TRACE "Under /etc/functions:verify_checksums" + TRACE_FUNC local boot_dir="$1" local gui="${2:-y}" @@ -498,57 +1042,159 @@ verify_checksums() { return $? } +# Check if a device is an LVM2 PV, and if so print the VG name +find_lvm_vg_name() { + TRACE_FUNC + local DEVICE VG + DEVICE="$1" + + mkdir -p /tmp/root-hashes-gui + if ! lvm pvs "$DEVICE" >/tmp/root-hashes-gui/lvm_vg 2>/dev/null; then + # It's not an LVM PV + return 1 + fi + + VG="$(tail -n +2 /tmp/root-hashes-gui/lvm_vg | awk '{print $2}')" + if [ -z "$VG" ]; then + DEBUG "Could not find LVM2 VG from lvm pvs output:" + DEBUG "$(cat /tmp/root-hashes-gui/lvm_vg)" + return 1 + fi + + echo "$VG" +} + +# If a block device is a partition, check if it is a bios-grub partition on a +# GPT-partitioned disk. +is_gpt_bios_grub() { + TRACE_FUNC + + local PART_DEV="$1" DEVICE NUMBER + + # Figure out the partitioned device containing this device (if there is + # one) from /sys/class/block. + local DEVICE_MATCHES=("/sys/class/block/"*"/$(basename "$PART_DEV")") + + DEVICE="$(echo "${DEVICE_MATCHES[0]}" | cut -d/ -f5)" + if [ "${#DEVICE_MATCHES[@]}" -ne 1 ] || [ "$DEVICE" = "*" ]; then + return 0 + fi + + # Extract the partition number + if ! [[ $(basename "$PART_DEV") =~ ([0-9]+)$ ]]; then + return 0 # Can't figure out the partition number + fi + + NUMBER="${BASH_REMATCH[1]}" + + # Now we know the device and partition number, get the type. This is + # specific to GPT disks, MBR disks are shown differently by fdisk. + TRACE "$PART_DEV is partition $NUMBER of $DEVICE" + if [ "$(fdisk -l "/dev/$DEVICE" 2>/dev/null | awk '$1 == '"$NUMBER"' {print $5}')" == grub ]; then + return 0 + fi + return 1 +} + +# Test if a block device could be used as /boot - we can mount it and it +# contains /boot/grub* files. (Here, the block device could be a partition or +# an unpartitioned device.) +# +# If the device is a partition, its type is also checked. Some common types +# that we definitely can't mount this way are excluded to silence spurious exFAT +# errors. +# +# Any existing /boot is unmounted. If the device is a reasonable boot device, +# it's left mounted on /boot. +mount_possible_boot_device() { + TRACE_FUNC + + local BOOT_DEV="$1" + local PARTITION_TYPE + + # Unmount anything on /boot. Ignore failure since there might not be + # anything. If there is something mounted and we cannot unmount it for + # some reason, mount will fail, which is handled. + umount /boot 2>/dev/null || true + + # Skip bios-grub partitions on GPT disks, LUKS partitions, and LVM PVs, + # we can't mount these as /boot. + if is_gpt_bios_grub "$BOOT_DEV" || cryptsetup isLuks "$BOOT_DEV" || + find_lvm_vg_name "$BOOT_DEV" >/dev/null; then + TRACE "$BOOT_DEV is not a mountable partition for /boot" + return 1 + fi + + # Get the size of BOOT_DEV in 512-byte sectors + sectors=$(blockdev --getsz "$BOOT_DEV") + + # Check if the partition is small (less than 2MB, which is 4096 sectors) + if [ "$sectors" -lt 4096 ]; then + TRACE_FUNC + DEBUG "Partition $BOOT_DEV is very small, likely BIOS boot. Skipping mount." + return 1 + else + TRACE_FUNC + DEBUG "Try mounting $BOOT_DEV as /boot" + if mount -o ro "$BOOT_DEV" /boot >/dev/null 2>&1; then + if ls -d /boot/grub* >/dev/null 2>&1; then + # This device is a reasonable boot device + return 0 + fi + umount /boot || true + fi + fi + + return 1 +} + # detect and set /boot device # mount /boot if successful detect_boot_device() { - TRACE "Under /etc/functions:detect_boot_device" + TRACE_FUNC + local devname # unmount /boot to be safe cd / && umount /boot 2>/dev/null # check $CONFIG_BOOT_DEV if set/valid - if [ -e "$CONFIG_BOOT_DEV" ]; then - if mount -o ro $CONFIG_BOOT_DEV /boot >/dev/null 2>&1; then - if ls -d /boot/grub* >/dev/null 2>&1; then - # CONFIG_BOOT_DEV is valid device and contains an installed OS - return 0 - fi - fi + if [ -e "$CONFIG_BOOT_DEV" ] && mount_possible_boot_device "$CONFIG_BOOT_DEV"; then + # CONFIG_BOOT_DEV is valid device and contains an installed OS + return 0 fi # generate list of possible boot devices - fdisk -l | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" >/tmp/disklist + fdisk -l 2>/dev/null | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" >/tmp/disklist - # filter out extraneous options - >/tmp/boot_device_list + # Check each possible boot device for i in $(cat /tmp/disklist); do - # remove block device from list if numeric partitions exist, since not bootable - DEV_NUM_PARTITIONS=$(($(ls -1 $i* | wc -l) - 1)) - if [ ${DEV_NUM_PARTITIONS} -eq 0 ]; then - echo $i >>/tmp/boot_device_list + # If the device has partitions, check the partitions instead + if device_has_partitions "$i"; then + devname="$(basename "$i")" + partitions=("/sys/class/block/$devname/$devname"?*) else - ls $i* | tail -${DEV_NUM_PARTITIONS} >>/tmp/boot_device_list + partitions=("$i") # Use the device itself fi - done - - # iterate thru possible options and check for grub dir - for i in $(cat /tmp/boot_device_list); do - umount /boot 2>/dev/null - if mount -o ro $i /boot >/dev/null 2>&1; then - if ls -d /boot/grub* >/dev/null 2>&1; then - CONFIG_BOOT_DEV="$i" + for partition in "${partitions[@]}"; do + partition_dev=/dev/"$(basename "$partition")" + # No sense trying something we already tried above + if [ "$partition_dev" = "$CONFIG_BOOT_DEV" ]; then + continue + fi + # If this is a reasonable boot device, select it and finish + if mount_possible_boot_device "$partition_dev"; then + CONFIG_BOOT_DEV="$partition_dev" return 0 fi - fi + done done # no valid boot device found echo "Unable to locate /boot files on any mounted disk" - umount /boot 2>/dev/null return 1 } scan_boot_options() { - TRACE "Under /etc/functions:scan_boot_options" + TRACE_FUNC local bootdir config option_file bootdir="$1" config="$2" @@ -568,9 +1214,6 @@ scan_boot_options() { fi } -calc() { - awk "BEGIN { print "$*" }" -} # truncate a file to a size only if it is longer (busybox truncate lacks '<' and # always sets the file size) @@ -598,18 +1241,42 @@ fromhex_plain() { fold -w 60 | xxd -p -r } +print_battery_charge() { + local battery + battery="$1" + echo "$((100*$(cat "${battery}/charge_now")/$(cat "${battery}/charge_full")))" +} + print_battery_health() { - if [ -d /sys/class/power_supply/BAT* ]; then - battery_health=$(calc $(cat /sys/class/power_supply/BAT*/charge_full)/$(cat /sys/class/power_supply/BAT*/charge_full_design)*100 | awk -F "." {'print $1'}) - echo "$battery_health" - fi + local battery + battery="$1" + echo "$((100*$(cat "${battery}/charge_full")/$(cat "${battery}/charge_full_design")))" } -print_battery_charge() { - if [ -d /sys/class/power_supply/BAT* ]; then - battery_charge=$(calc $(cat /sys/class/power_supply/BAT*/charge_now)/$(cat /sys/class/power_supply/BAT*/charge_full)*100 | awk -F "." {'print $1'}) - echo "$battery_charge" - fi +print_battery_name() { + local battery + battery="$1" + echo "$(cat "${battery}/manufacturer") $(cat "${battery}/model_name")" +} + +# Print the charging and health state for all batteries +# Print the maufacturer and model name for each battery if more than 1 +# The printed string contains the full formatting including leading an trailing "\n" strings +print_battery_state() { + local battery_status + battery_status="" + all_batteries=(/sys/class/power_supply/BAT*) + for battery in "${all_batteries[@]}"; do + if [[ -d "${battery}" ]]; then + battery_name="Battery" + if [ "${#all_batteries[@]}" -gt 1 ]; then + battery_name+=" $(print_battery_name "${battery}")" + fi + battery_status+="\n${battery_name} charge: $(print_battery_charge "${battery}")%" + battery_status+="\n${battery_name} health: $(print_battery_health "${battery}")%" + fi + done + echo "${battery_status:+${battery_status}\n}" } generate_random_mac_address() { @@ -650,3 +1317,144 @@ run_at_exit_handlers() { done } trap run_at_exit_handlers EXIT + +# Helper function to generate diceware passphrase +generate_passphrase() { + usage_generate_passphrase() { + echo "Usage: generate_passphrase --dictionary|-d [--number_words|-n ] [--max_length|-m ] [--lowercase|-l]" + echo "Generates a passphrase using a Diceware dictionary." + echo " --dictionary|-d Path to the Diceware dictionary file (defaults to /etc/diceware_dictionaries/eff_short_wordlist_2_0.txt )." + echo " [--number_words|-n ] Number of words in the passphrase (default: 3)." + echo " [--max_length|-m ] Maximum size of the passphrase (default: 256)." + echo " [--lowercase|-l] Use lowercase words (default: false)." + } + + # Helper subfunction to get a random word from the dictionary + get_random_word_from_dictionary() { + local dictionary_file="$1" lines random + + lines="$(wc -l <"$dictionary_file")" + # 4 random bytes are used to reduce modulo bias to an acceptable + # level. 4 bytes with modulus 1296 results in 0.000003% bias + # toward the first 1263 words. + random="$(dd if=/dev/random bs=4 count=1 status=none | hexdump -e '1/4 "%u\n"')" + ((random %= lines)) + ((++random)) # tail's line count is 1-based + tail -n +"$random" "$dictionary_file" | head -1 | cut -d$'\t' -f2 + } + + TRACE_FUNC + local dictionary_file="/etc/diceware_dictionaries/eff_short_wordlist_2_0.txt" + local num_words=3 + local max_size=256 + local lowercase=false + + # Parse parameters + while [[ "$#" -gt 0 ]]; do + case "$1" in + --dictionary | -d) + dictionary_file="$2" + shift + ;; + --lowercase | -l) + lowercase=true + ;; + --number_words | -n) + if ! [[ "$2" =~ ^[0-9]+$ ]] || [[ "$2" -le 0 ]]; then + warn "Invalid number of words: $2" + usage_generate_passphrase + return 1 + fi + num_words="$2" + shift + ;; + --max_length | -m) + if ! [[ "$2" =~ ^[0-9]+$ ]] || [[ "$2" -le 0 ]]; then + warn "Invalid maximum size: $2" + usage_generate_passphrase + return 1 + fi + max_size="$2" + shift + ;; + *) + warn "Unknown parameter: $1" + usage_generate_passphrase + return 1 + ;; + esac + shift + done + + # Validate dictionary file + if [[ -z "$dictionary_file" || ! -f "$dictionary_file" ]]; then + warn "Dictionary file not found or not provided: $dictionary_file" + usage_generate_passphrase + return 1 + fi + + local passphrase="" + local word="" + + for ((i = 0; i < num_words; ++i)); do + word=$(get_random_word_from_dictionary "$dictionary_file") + if [[ "$lowercase" == "false" ]]; then + word=${word^} # Capitalize the first letter + fi + passphrase+="$word " + if [[ ${#passphrase} -gt $max_size ]]; then + DEBUG "Passphrase exceeds max size: $max_size, removing last word" + passphrase=${passphrase% *} # Remove the last word if it exceeds max_size + break + fi + done + + #Remove passphrase trailing space from passphrase+="$word" + passphrase=${passphrase% } + echo "$passphrase" + return 0 +} + +# Load a keymap. Normally used to load the configured keymap, also used in +# config to test a keymap. +# +# This always resets the keymap before loading, so the result is the same even +# if other keymaps had been loaded before, and even if the new keymap doesn't +# define all keys (or if none was given). +# +# If the board defines an override keymap, it is always loaded after the keymap. +# (For example, tablets map volume up/down and power to up/down/enter, and we +# do not want a custom keymap to override that.) +# +# If the board didn't include loadkeys, this is a no-op. +load_keymap() { + TRACE_FUNC + + if ! [ -x /bin/loadkeys ]; then + return 0 + fi + + # Reset the keymap + DEBUG "Loading linux kernel shipped keyboard layout keymap: share/keymaps/defkeymap.map" + DO_WITH_DEBUG loadkeys --default + + # Load the specified keymap, if given + if [ -n "$1" ]; then + if [ -f "$1" ]; then + DEBUG "Loading keyboard keymap: $1" + DO_WITH_DEBUG loadkeys "$1" + else + # We can continue by ignoring the specified keymap, but + # this might mean keys map unexpectedly. If this is + # desired, update or clear the keymap setting to silence + # the warning. + warn "Keymap $1 does not exist, continuing without keymap" + fi + fi + + # Load the board keymap. These only define the keys that must always + # have a specific function on that board. + if [ -f /etc/board_keys.map ]; then + DO_WITH_DEBUG loadkeys /etc/board_keys.map + fi +} diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 86e099164..f636e5912 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -4,34 +4,68 @@ # Pause for the configured timeout before booting automatically. Returns 0 to # continue with automatic boot, nonzero if user interrupted. -pause_automatic_boot() -{ - if IFS= read -t "$CONFIG_AUTO_BOOT_TIMEOUT" -s -n 1 -p \ - "Automatic boot in $CONFIG_AUTO_BOOT_TIMEOUT seconds unless interrupted by keypress... "; then +pause_automatic_boot() { + if IFS= read -t "$CONFIG_AUTO_BOOT_TIMEOUT" -s -n 1 -r -p \ + $'Automatic boot in '"$CONFIG_AUTO_BOOT_TIMEOUT"$' seconds unless interrupted by keypress...\n'; then return 1 # Interrupt automatic boot fi return 0 # Continue with automatic boot } -mount_usb() -{ - TRACE "under gui_functions:mount_usb" - # Unmount any previous USB device - if grep -q /media /proc/mounts ; then - umount /media || die "Unable to unmount /media" - fi - # Mount the USB boot device - mount-usb && USB_FAILED=0 || ( [ $? -eq 5 ] && exit 1 || USB_FAILED=1 ) - if [ $USB_FAILED -ne 0 ]; then - whiptail $BG_COLOR_ERROR --title 'USB Drive Missing' \ - --msgbox "Insert your USB drive and press Enter to continue." 0 80 - mount-usb && USB_FAILED=0 || ( [ $? -eq 5 ] && exit 1 || USB_FAILED=1 ) - if [ $USB_FAILED -ne 0 ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: Mounting /media Failed' \ - --msgbox "Unable to mount USB device" 0 80 - exit 1 - fi - fi +mount_usb() { + TRACE_FUNC + # Unmount any previous USB device + if grep -q /media /proc/mounts; then + umount /media || die "Unable to unmount /media" + fi + # Mount the USB boot device + mount-usb && USB_FAILED=0 || ([ $? -eq 5 ] && exit 1 || USB_FAILED=1) + if [ $USB_FAILED -ne 0 ]; then + whiptail_error --title 'USB Drive Missing' \ + --msgbox "Insert your USB drive and press Enter to continue." 0 80 + mount-usb && USB_FAILED=0 || ([ $? -eq 5 ] && exit 1 || USB_FAILED=1) + if [ $USB_FAILED -ne 0 ]; then + whiptail_error --title 'ERROR: Mounting /media Failed' \ + --msgbox "Unable to mount USB device" 0 80 + exit 1 + fi + fi +} + +# -- Display related functions -- +# Produce a whiptail prompt with 'warning' background, works for fbwhiptail and newt +whiptail_warning() { + if [ -x /bin/fbwhiptail ]; then + whiptail $BG_COLOR_WARNING "$@" + else + env NEWT_COLORS="root=,$TEXT_BG_COLOR_WARNING" whiptail "$@" + fi +} + +# Produce a whiptail prompt with 'error' background, works for fbwhiptail and newt +whiptail_error() { + if [ -x /bin/fbwhiptail ]; then + whiptail $BG_COLOR_ERROR "$@" + else + env NEWT_COLORS="root=,$TEXT_BG_COLOR_ERROR" whiptail "$@" + fi +} + +# Produce a whiptail prompt of the given type - 'error', 'warning', or 'normal' +whiptail_type() { + local TYPE="$1" + shift + case "$TYPE" in + error) + whiptail_error "$@" + ;; + warning) + whiptail_warning "$@" + ;; + normal) + whiptail "$@" + ;; + esac } # Create display text for a size in bytes in either MB or GB, unit selected @@ -41,16 +75,16 @@ display_size() { size_bytes="$1" # If it's less than 1 GB, display MB - if [ "$((size_bytes))" -lt "$((1024*1024*1024))" ]; then - unit_divisor=$((1024*1024)) + if [ "$((size_bytes))" -lt "$((1024 * 1024 * 1024))" ]; then + unit_divisor=$((1024 * 1024)) unit_symbol="MB" else - unit_divisor=$((1024*1024*1024)) + unit_divisor=$((1024 * 1024 * 1024)) unit_symbol="GB" fi # Divide by the unit divisor and round to nearest - echo "$(( (size_bytes + unit_divisor/2) / unit_divisor )) $unit_symbol" + echo "$(((size_bytes + unit_divisor / 2) / unit_divisor)) $unit_symbol" } # Create display text for the size of a block device using MB or GB, rounded to @@ -78,9 +112,8 @@ display_block_device_size() { # Success: Sets FILE with the selected file # User aborted: Exits successfully with FILE empty # No entries in list: Displays error and exits unsuccessfully -file_selector() -{ - TRACE "under gui_functions:file_selector" +file_selector() { + TRACE_FUNC local FILE_LIST MENU_MSG MENU_TITLE CHOICE_ARGS SHOW_SIZE OPTION_SIZE option_index @@ -104,10 +137,10 @@ file_selector() option="$option - $OPTION_SIZE" fi CHOICE_ARGS+=("$n" "$option") - done < "$FILE_LIST" + done <"$FILE_LIST" if [ "${#CHOICE_ARGS[@]}" -eq 0 ]; then - whiptail $BG_COLOR_ERROR --title 'ERROR: No Files Found' \ + whiptail_error --title 'ERROR: No Files Found' \ --msgbox "No Files found matching the pattern. Aborting." 0 80 exit 1 fi @@ -130,40 +163,32 @@ file_selector() done } -show_system_info() -{ - TRACE "Under /bin/gui-init:show_system_info" - battery_charge="$(print_battery_charge)" - battery_health="$(print_battery_health)" - if [ -n $battery_charge -a -n $battery_health ];then - battery_status="\nBattery charge: $battery_charge%\nBattery health: $battery_health%\n" - fi - - memtotal=$(cat /proc/meminfo | grep 'MemTotal' | tr -s ' ' | cut -f2 -d ' ') - memtotal=$((${memtotal} / 1024 / 1024 + 1)) - cpustr=$(cat /proc/cpuinfo | grep 'model name' | uniq | sed -r 's/\(R\)//;s/\(TM\)//;s/CPU //;s/model name.*: //') - kernel=$(uname -s -r) - - whiptail $BG_COLOR_MAIN_MENU --title 'System Info' \ - --msgbox "${BOARD_NAME}\n\nFW_VER: ${FW_VER}\nKernel: ${kernel}\n\nCPU: ${cpustr}\nRAM: ${memtotal} GB\n$battery_status\n$(fdisk -l | grep -e '/dev/sd.:' -e '/dev/nvme.*:' | sed 's/B,.*/B/')" 0 80 +show_system_info() { + TRACE_FUNC + battery_status="$(print_battery_state)" + + memtotal=$(cat /proc/meminfo | grep 'MemTotal' | tr -s ' ' | cut -f2 -d ' ') + memtotal=$((${memtotal} / 1024 / 1024 + 1)) + cpustr=$(cat /proc/cpuinfo | grep 'model name' | uniq | sed -r 's/\(R\)//;s/\(TM\)//;s/CPU //;s/model name.*: //') + kernel=$(uname -s -r) + + whiptail_type $BG_COLOR_MAIN_MENU --title 'System Info' \ + --msgbox "${BOARD_NAME}\n\nFW_VER: ${FW_VER}\nKernel: ${kernel}\n\nCPU: ${cpustr}\nRAM: ${memtotal} GB\n$battery_status\n$(fdisk -l 2>/dev/null | grep -e '/dev/sd.:' -e '/dev/nvme.*:' | sed 's/B,.*/B/')" 0 80 } # Get "Enable" or "Disable" to display in the configuration menu, based on a # setting value -get_config_display_action() -{ - [ "$1" = "y" ] && echo "Disable" || echo "Enable" +get_config_display_action() { + [ "$1" = "y" ] && echo "Disable" || echo "Enable" } # Invert a config value -invert_config() -{ - [ "$1" = "y" ] && echo "n" || echo "y" +invert_config() { + [ "$1" = "y" ] && echo "n" || echo "y" } # Get "Enable" or "Disable" for a config that internally is inverted (because it # disables a behavior that is on by default). -get_inverted_config_display_action() -{ - get_config_display_action "$(invert_config "$1")" +get_inverted_config_display_action() { + get_config_display_action "$(invert_config "$1")" } diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 8f8e5ad72..43fc09aac 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -1,22 +1,118 @@ #!/bin/bash -# LUKS related functions +# This script contains various functions related to LUKS (Linux Unified Key Setup) encryption management. . /etc/functions . /etc/gui_functions . /tmp/config -#List all LUKS devices on the system -list_luks_devices() { - #generate a list of devices to choose from that contain a LUKS header - lvm vgscan || true - blkid | cut -d ':' -f 1 | while read device; do - if cryptsetup isLuks $device; then echo $device; fi +# List all LUKS devices on the system that are not USB +list_local_luks_devices() { + TRACE_FUNC + lvm vgscan 2>/dev/null || true + blkid | cut -d ':' -f 1 | while read -r device; do + DEBUG "Checking device: $device" + if cryptsetup isLuks "$device"; then + DEBUG "Device $device is a LUKS device" + dev_name=$(basename "$device") + # Dynamically determine parent device name + parent_dev_name=$(echo "$dev_name" | sed -E 's/(p?[0-9]+)$//') # Handles both NVMe (pX) and non-NVMe (X) + DEBUG "Derived parent device name: $parent_dev_name" + if [ -e "/sys/block/$parent_dev_name" ]; then + DEBUG "Device $device exists in /sys/block" + if ! stat -c %N "/sys/block/$parent_dev_name" 2>/dev/null | grep -q "usb"; then + DEBUG "Device $device is not a USB device" + echo "$device" + else + DEBUG "Device $device is a USB device, skipping" + fi + else + DEBUG "Device $device does not exist in /sys/block, skipping" + fi + else + DEBUG "Device $device is not a LUKS device" + fi done | sort } +# Prompt for LUKS Disk Recovery Key passphrase +prompt_luks_passphrase() { + TRACE_FUNC + while [[ ${#luks_current_Disk_Recovery_Key_passphrase} -lt 8 ]]; do + echo -e "\nEnter the LUKS Disk Recovery Key passphrase (At least 8 characters long):" + read -r luks_current_Disk_Recovery_Key_passphrase + if [[ ${#luks_current_Disk_Recovery_Key_passphrase} -lt 8 ]]; then + echo -e "\nPassphrase must be at least 8 characters long. Please try again." + unset luks_current_Disk_Recovery_Key_passphrase + continue + fi + done + echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/secret/luks_current_Disk_Recovery_Key_passphrase +} + +# Test LUKS passphrase against all found LUKS containers that are not USB +test_luks_passphrase() { + TRACE_FUNC + DEBUG "Testing LUKS passphrase against all found LUKS containers" + list_local_luks_devices >/tmp/luks_devices.txt + if [ ! -s /tmp/luks_devices.txt ]; then + warn "No LUKS devices found" + return 1 + fi + + valid_luks_devices=() + while read -r luks_device; do + DEBUG "Testing passphrase on device: $luks_device" + if cryptsetup open --test-passphrase "$luks_device" --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase; then + DEBUG "Passphrase valid for $luks_device" + valid_luks_devices+=("$luks_device") + else + DEBUG "Passphrase test failed on $luks_device" + fi + done /tmp/luks_container_size_percent + echo "10" >/tmp/luks_container_size_percent elif [ "$option_index" = "2" ]; then - echo "25" > /tmp/luks_container_size_percent + echo "25" >/tmp/luks_container_size_percent elif [ "$option_index" = "3" ]; then - echo "50" > /tmp/luks_container_size_percent + echo "50" >/tmp/luks_container_size_percent elif [ "$option_index" = "4" ]; then - echo "75" > /tmp/luks_container_size_percent + echo "75" >/tmp/luks_container_size_percent else die "Error selecting LUKS container size percentage of device" fi @@ -54,20 +150,19 @@ select_luks_container_size_percent() { # Partition a device interactively with two partitions: a LUKS container # containing private ext4 partition and second public exFAT partition # Size provisioning is done by percentage of the device -interactive_prepare_thumb_drive() -{ - TRACE "Under /etc/luks-functions:interactive_prepare_thumb_drive()" +interactive_prepare_thumb_drive() { + TRACE_FUNC #Refactoring: only one parameter needed to be prompted for: the passphrase for LUKS container if not coming from oem-provisioning #If no passphrase was provided, ask user to select passphrase for LUKS container # if no device provided as parameter, we will ask user to select device to partition # if no percentage provided as parameter, we will default to 10% of device to use for LUKS container # we will validate parameters and not make them positional and print a usage function first - + #Set defaults - DEVICE="" #Will list all usb storage devices if not provided as parameter + DEVICE="" #Will list all usb storage devices if not provided as parameter PERCENTAGE="10" #default to 10% of device to use for LUKS container (requires a LUKS partition bigger then 32mb!) - PASSPHRASE="" #Will prompt user for passphrase if not provided as parameter - + PASSPHRASE="" #Will prompt user for passphrase if not provided as parameter + #Parse parameters while [ $# -gt 0 ]; do case "$1" in @@ -100,38 +195,39 @@ interactive_prepare_thumb_drive() #If no passphrase was provided, ask user to select passphrase for LUKS container #console based no whiptail while [[ ${#PASSPHRASE} -lt 8 ]]; do - { - echo -e "\nEnter passphrase for LUKS container (At least 8 characters long):" - #hide passphrase input from read command - read -r -s PASSPHRASE - #skip confirmation if passphrase is less then 8 characters long (continue) - if [[ ${#PASSPHRASE} -lt 8 ]]; then - echo -e "\nPassphrase must be at least 8 characters long. Please try again." - unset PASSPHRASE - continue - fi - #validate passphrase and ask user to re-enter if not at least 8 characters long - #confirm passphrase - echo -e "\nConfirm passphrase for LUKS container:" - #hide passphrase input from read command - read -r -s PASSPHRASE_CONFIRM - #compare passphrase and passphrase confirmation - if [ "$PASSPHRASE" != "$PASSPHRASE_CONFIRM" ]; then - echo -e "\nPassphrases do not match. Please try again." - unset PASSPHRASE - unset PASSPHRASE_CONFIRM - fi + { + echo -e "\nEnter passphrase for LUKS container (At least 8 characters long):" + #hide passphrase input from read command + read -r -s PASSPHRASE + #skip confirmation if passphrase is less then 8 characters long (continue) + if [[ ${#PASSPHRASE} -lt 8 ]]; then + echo -e "\nPassphrase must be at least 8 characters long. Please try again." + unset PASSPHRASE + continue + fi + #validate passphrase and ask user to re-enter if not at least 8 characters long + #confirm passphrase + echo -e "\nConfirm passphrase for LUKS container:" + #hide passphrase input from read command + read -r -s PASSPHRASE_CONFIRM + #compare passphrase and passphrase confirmation + if [ "$PASSPHRASE" != "$PASSPHRASE_CONFIRM" ]; then + echo -e "\nPassphrases do not match. Please try again." + unset PASSPHRASE + unset PASSPHRASE_CONFIRM + fi - };done + } + done fi #If no device was provided, ask user to select device to partition if [ -z "$DEVICE" ]; then #warn user to disconnect all external drives if [ -x /bin/whiptail ]; then - whiptail $BG_COLOR_WARNING --title "WARNING: Disconnect all external drives" --msgbox \ - "WARNING: Please disconnect all external drives before proceeding.\n\nHit Enter to continue." 0 80 \ - || die "User cancelled wiping and repartitioning of $DEVICE" + whiptail_warning --title "WARNING: Disconnect all external drives" --msgbox \ + "WARNING: Please disconnect all external drives before proceeding.\n\nHit Enter to continue." 0 80 || + die "User cancelled wiping and repartitioning of $DEVICE" else echo -e -n "Warning: Please disconnect all external drives before proceeding.\n\nHit Enter to continue?" read -r -p " [Y/n] " response @@ -149,7 +245,7 @@ interactive_prepare_thumb_drive() enable_usb_storage #list all usb storage devices - list_usb_storage disks > /tmp/devices.txt + list_usb_storage disks >/tmp/devices.txt if [ $(cat /tmp/devices.txt | wc -l) -gt 0 ]; then file_selector "/tmp/devices.txt" "Select device to partition" if [ "$FILE" == "" ]; then @@ -186,9 +282,8 @@ interactive_prepare_thumb_drive() # parameters: # $1 - block device of flash drive # $2 - percent of device allocated to LUKS [1-99] -confirm_thumb_drive_format() -{ - TRACE "Under /etc/luks-functions:confirm_thumb_drive_format()" +confirm_thumb_drive_format() { + TRACE_FUNC local DEVICE LUKS_PERCENTAGE DISK_SIZE_BYTES DISK_SIZE_DISPLAY LUKS_PERCENTAGE LUKS_SIZE_MB MSG DEVICE="$1" @@ -206,7 +301,7 @@ confirm_thumb_drive_format() MSG="WARNING: Wiping and repartitioning $DEVICE ($DISK_SIZE_DISPLAY) with $LUKS_SIZE_MB MB\n assigned to private LUKS ext4 partition,\n rest assigned to exFAT public partition.\n\nAre you sure you want to continue?" if [ -x /bin/whiptail ]; then - whiptail $BG_COLOR_WARNING --title "WARNING: Wiping and repartitioning $DEVICE ($DISK_SIZE_DISPLAY)" --yesno \ + whiptail_warning --title "WARNING: Wiping and repartitioning $DEVICE ($DISK_SIZE_DISPLAY)" --yesno \ "$MSG" 0 80 else echo -e -n "$MSG" @@ -228,9 +323,8 @@ confirm_thumb_drive_format() # $1 - block device of flash drive # $2 - percentage of flash drive to allocate to LUKS [1-99] # $3 - passphrase for LUKS container -prepare_thumb_drive() -{ - TRACE "Under /etc/luks-functions:prepare_thumb_drive()" +prepare_thumb_drive() { + TRACE_FUNC local DEVICE PERCENTAGE PASSPHRASE DISK_SIZE_BYTES PERCENTAGE_MB DEVICE="$1" @@ -265,183 +359,232 @@ prepare_thumb_drive() echo "Done." } -select_luks_container() -{ - TRACE "Under /etc/luks-functions:select_luks_container()" +# Select LUKS container +select_luks_container() { + TRACE_FUNC if [ -s /boot/kexec_key_devices.txt ]; then DEBUG "Reusing known good LUKS container device from /boot/kexec_key_devices.txt" - DEBUG "LUKS container device: $(cut -d ' ' -f1 /boot/kexec_key_devices.txt)" LUKS=$(cut -d ' ' -f1 /boot/kexec_key_devices.txt) - else - list_luks_devices > /tmp/luks_devices.txt - #if /tmp/luks_devices.txt exists and is not empty - if [ -s /tmp/luks_devices.txt ]; then - file_selector "/tmp/luks_devices.txt" "Select LUKS container device" - if [ "$FILE" == "" ]; then - return 1 - else - LUKS=$FILE - detect_boot_device - mount -o remount,rw /boot - echo "$LUKS $(cryptsetup luksUUID $LUKS)" >/boot/kexec_key_devices.txt - mount -o remount,ro /boot - fi - else - warn "No encrypted device found" - return 1 - fi + DEBUG "LUKS container device: $(echo $LUKS)" + elif [ -z "$LUKS" ]; then + main_luks_selection fi } -test_luks_current_disk_recovery_key_passphrase() -{ - TRACE "Under /etc/luks-functions:test_luks_current_disk_recovery_key_passphrase()" +# Test LUKS current disk recovery key passphrase +test_luks_current_disk_recovery_key_passphrase() { + TRACE_FUNC while :; do select_luks_container || return 1 + + PRINTABLE_LUKS=$(echo $LUKS) + if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then - #if no external provisioning provides current LUKS Disk Recovery Key passphrase echo -e "\nEnter the current LUKS Disk Recovery Key passphrase (Configured at OS installation or by OEM):" read -r luks_current_Disk_Recovery_Key_passphrase - echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/luks_current_Disk_Recovery_Key_passphrase - warn "Testing opening "$LUKS" LUKS encrypted drive content with the current LUKS Disk Recovery Key passphrase..." - cryptsetup open $LUKS test --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase + echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/secret/luks_current_Disk_Recovery_Key_passphrase else - echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/luks_current_Disk_Recovery_Key_passphrase - warn "Testing opening "$LUKS" LUKS encrypted drive content with the current LUKS Disk Recovery Key passphrase..." - cryptsetup open $LUKS test --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase + echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/secret/luks_current_Disk_Recovery_Key_passphrase fi - #Validate past cryptsetup-reencrypt attempts - if [ $? -eq 0 ]; then - whiptail --title 'Invalid Actual LUKS Disk Recovery Key passphrase?' --msgbox \ - "If you previously changed it and do not remember it, you will have to\n reinstall the OS from a an external drive.\n\nTo do so, place the ISO file and its signature file on root of an\n external drive, and select Options-> Boot from USB \n\nHit Enter to retry." 30 60 - shred -n 10 -z -u /tmp/luks_current_Disk_Recovery_Key_passphrase 2>/dev/null - #unsetting luks_current_Disk_Recovery_Key_passphrase so we prompt for it again LUKS Disk Recovery Key passphrase prompt on next round - unset luks_current_Disk_Recovery_Key_passphrase - #remove "known good" selected LUKS container so that next pass asks again user to select LUKS container. - #maybe the container was not the right one - detect_boot_device - mount -o remount,rw /boot - rm -f /boot/kexec_key_devices.txt - mount -o remount,ro /boot - else - #LuksOpen test was successful. Cleanup should be called only when done - #Exporting successfully used passphrase possibly reused by oem-factory-reset - #We close the volume - cryptsetup close test - export luks_current_Disk_Recovery_Key_passphrase - break; + echo -e "\n$PRINTABLE_LUKS: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." + + for luks_container in $LUKS; do + DEBUG "$luks_container: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." + if ! cryptsetup open --test-passphrase "$luks_container" --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase; then + whiptail_error --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + "If you previously changed it and do not remember it, you will have to reinstall the OS from an external drive.\n\nTo do so, place the ISO file and its signature file on root of an external drive, and select Options-> Boot from USB \n\nHit Enter to retry." 0 80 + detect_boot_device + mount -o remount,rw /boot + rm -f /boot/kexec_key_devices.txt + mount -o remount,ro /boot + luks_secrets_cleanup + unset LUKS + else + echo "$luks_container: unlocking LUKS container with current Disk Recovery Key passphrase successful" + export luks_current_Disk_Recovery_Key_passphrase + fi + done + + if [ -n "$LUKS" ]; then + export LUKS + TRACE_FUNC + DEBUG "LUKS container(s) $PRINTABLE_LUKS exported to be reused" + break fi done } +# Function to re-encrypt LUKS partitions luks_reencrypt() { - TRACE "Under /etc/luks-functions:luks_reencrypt()" - while :; do - select_luks_container || return 1 - #If the user just set a new LUKS Disk Recovery Key passphrase - if [ -n "$luks_new_Disk_Recovery_Key_passphrase" ]; then - luks_current_Disk_Recovery_Key_passphrase="$luks_new_Disk_Recovery_Key_passphrase" - fi - if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then - #if no external provisioning provides current LUKS Disk Recovery Key passphrase + TRACE_FUNC + test_luks_current_disk_recovery_key_passphrase || return 1 + + luks_containers=($LUKS) + TRACE_FUNC + DEBUG "luks_containers: ${luks_containers[@]}" + + if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then + if [ -f /tmp/secret/luks_current_Disk_Recovery_Key_passphrase ]; then + luks_current_Disk_Recovery_Key_passphrase=$(cat /tmp/secret/luks_current_Disk_Recovery_Key_passphrase) + else msg=$(echo -e "This will replace the encrypted container content and its LUKS Disk Recovery Key.\n\nThe passphrase associated with this key will be asked from the user under the following conditions:\n 1-Every boot if no Disk Unlock Key was added to the TPM\n 2-If the TPM fails (hardware failure)\n 3-If the firmware has been tampered with/modified by the user\n\nThis process requires you to type the current LUKS Disk Recovery Key passphrase and will delete the LUKS TPM Disk Unlock Key slot, if set up, by setting a default boot LUKS key slot (1) if present.\n\nAt the next prompt, you may be asked to select which file corresponds to the LUKS device container.\n\nHit Enter to continue." | fold -w 70 -s) - whiptail --title 'Reencrypt LUKS encrypted container ?' \ - --msgbox "$msg" 0 80 + whiptail --title 'Reencrypt LUKS encrypted container ?' --msgbox "$msg" 0 80 echo -e "\nEnter the current LUKS Disk Recovery Key passphrase:" - read -r luks_current_Disk_Recovery_Key_passphrase - echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/luks_current_Disk_Recovery_Key_passphrase - warn "Reencrypting "$LUKS" LUKS encrypted drive content with a new LUKS Disk Recovery Key. Do NOT shut down or reboot!" - cryptsetup-reencrypt -B 64 --use-directio "$LUKS" --key-slot 0 --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase - else - echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/luks_current_Disk_Recovery_Key_passphrase - warn "Reencrypting "$LUKS" LUKS encrypted drive content with a new LUKS Disk Recovery Key. Do NOT shut down or reboot!" - cryptsetup-reencrypt -B 64 --use-directio "$LUKS" --key-slot 0 --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase + read -r -s luks_current_Disk_Recovery_Key_passphrase + echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/secret/luks_current_Disk_Recovery_Key_passphrase fi - #Validate past cryptsetup-reencrypt attempts - if [ $(echo $?) -ne 0 ]; then - whiptail --title 'Invalid Actual LUKS Disk Recovery Key passphrase?' --msgbox \ - "If you previously changed it and do not remember it, you will have to\n reinstall the OS from a an external drive.\n\nTo do so, place the ISO file and its signature file on root of an\n external drive, and select Options-> Boot from USB \n\nHit Enter to retry." 30 60 - shred -n 10 -z -u /tmp/luks_current_Disk_Recovery_Key_passphrase 2>/dev/null - #unsetting luks_current_Disk_Recovery_Key_passphrase so we prompt for it again LUKS Disk Recovery Key passphrase prompt on next round - unset luks_current_Disk_Recovery_Key_passphrase - #remove "known good" selected LUKS container so that next pass asks again user to select LUKS container. - #maybe the container was not the right one + else + echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/secret/luks_current_Disk_Recovery_Key_passphrase + fi + + for luks_container in "${luks_containers[@]}"; do + DEBUG "$luks_container: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." + if ! DO_WITH_DEBUG cryptsetup open --test-passphrase "$luks_container" --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase >/dev/null 2>&1; then + whiptail_error --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + "If you previously changed it and do not remember it, you will have to reinstall the OS from an external drive.\n\nTo do so, place the ISO file and its signature file on root of an external drive, and select Options-> Boot from USB \n\nHit Enter to retry." 0 80 + TRACE_FUNC + detect_boot_device + mount -o remount,rw /boot + rm -f /boot/kexec_key_devices.txt + mount -o remount,ro /boot + luks_secrets_cleanup + unset LUKS + continue + fi + + DEBUG "Test opening ${luks_container} successful. Now testing key slots to determine which holds master key" + DRK_KEYSLOT=-1 + DEBUG "$luks_container: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." + for i in $(seq 0 31); do + DEBUG "Testing key slot $i on $luks_container" + if DO_WITH_DEBUG cryptsetup open --test-passphrase $luks_container --key-slot $i --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase >/dev/null 2>&1; then + DRK_KEYSLOT=$i + DEBUG "$luks_container: Found key-slot $DRK_KEYSLOT that can be unlocked with the current passphrase. breaking loop" + break + else + DEBUG "Key slot $i on $luks_container cannot be unlocked with the current passphrase" + fi + done + + if [ $DRK_KEYSLOT -eq -1 ]; then + whiptail_error --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + "If you previously changed it and do not remember it, you will have to reinstall the OS from an external drive.\n\nTo do so, place the ISO file and its signature file on root of an external drive, and select Options-> Boot from USB \n\nHit Enter to retry." 0 80 + TRACE_FUNC detect_boot_device mount -o remount,rw /boot rm -f /boot/kexec_key_devices.txt mount -o remount,ro /boot + luks_secrets_cleanup + unset LUKS + continue + fi + + # --perf-no_read_workqueue and/or --perf-no_write_workqueue improve encryption/reencrypton performance on kernel 5.10.9+ + # bypassing dm-crypt queues. + # Ref https://github.com/cloudflare/linux/issues/1#issuecomment-729695518 + # --resilience=none disables the resilience feature of cryptsetup, which is enabled by default + # --force-offline-reencrypt forces the reencryption to be done offline (no read/write operations on the device) + # --disable-locks disables the lock feature of cryptsetup, which is enabled by default + + echo -e "\nReencrypting $luks_container LUKS encrypted drive content with current Recovery Disk Key passphrase..." + warn "DO NOT POWER DOWN MACHINE, UNPLUG AC OR REMOVE BATTERY DURING REENCRYPTION PROCESS" + + if ! DO_WITH_DEBUG cryptsetup reencrypt \ + --perf-no_read_workqueue --perf-no_write_workqueue \ + --resilience=none --force-offline-reencrypt --disable-locks \ + "$luks_container" --key-slot "$DRK_KEYSLOT" \ + --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase; then + whiptail_error --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + "If you previously changed it and do not remember it, you will have to reinstall the OS from an external drive.\n\nTo do so, place the ISO file and its signature file on root of an external drive, and select Options-> Boot from USB \n\nHit Enter to retry." 0 80 + TRACE_FUNC + detect_boot_device + mount -o remount,rw /boot + rm -f /boot/kexec_key_devices.txt + mount -o remount,ro /boot + luks_secrets_cleanup + unset LUKS else - #Reencryption was successful. Cleanup should be called only when done - #Exporting successfully used passphrase possibly reused by oem-factory-reset export luks_current_Disk_Recovery_Key_passphrase - break; + export LUKS fi done } -luks_change_passphrase() -{ - TRACE "Under /etc/luks-functions:luks_change_passphrase()" - while :; do - select_luks_container || return 1 - #if actual or new LUKS Disk Recovery Key is not provisioned by oem-provisioning file - if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ] || [ -z "$luks_new_Disk_Recovery_Key_passphrase" ]; then - whiptail --title 'Changing LUKS Disk Recovery Key passphrase' --msgbox \ - "Please enter the current LUKS Disk Recovery Key passphrase (slot 0).\nThen choose a strong passphrase of your own.\n\n**DICEWARE passphrase methodology is STRONGLY ADVISED.**\n\nHit Enter to continue" 30 60 - if [ -z "$luks_new_Disk_Recovery_Key_passphrase" ]; then - echo -e "\nEnter your desired replacement for the actual LUKS Disk Recovery Key passphrase (At least 8 characters long):" - while [[ ${#luks_new_Disk_Recovery_Key_passphrase} -lt 8 ]]; do - { - read -r luks_new_Disk_Recovery_Key_passphrase - };done - fi - if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then +# Function to change LUKS passphrase +luks_change_passphrase() { + TRACE_FUNC + test_luks_current_disk_recovery_key_passphrase || return 1 + + luks_containers=($LUKS) + TRACE_FUNC + DEBUG "luks_containers: ${luks_containers[@]}" + # unset new passphrase to make sure the user enters it and knows what they are setting as the new passphrase! + unset luks_new_Disk_Recovery_Key_passphrase + + for luks_container in "${luks_containers[@]}"; do + if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then + if [ -f /tmp/secret/luks_current_Disk_Recovery_Key_passphrase ]; then + luks_current_Disk_Recovery_Key_passphrase=$(cat /tmp/secret/luks_current_Disk_Recovery_Key_passphrase) + else + TRACE_FUNC echo -e "\nEnter the current LUKS Disk Recovery Key passphrase (Configured at OS installation or by OEM):" read -r luks_current_Disk_Recovery_Key_passphrase fi - export luks_current_Disk_Recovery_Key_passphrase - export luks_new_Disk_Recovery_Key_passphrase - echo -n "$luks_new_Disk_Recovery_Key_passphrase" >/tmp/luks_new_Disk_Recovery_Key_passphrase - echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/luks_current_Disk_Recovery_Key_passphrase - warn "Changing "$LUKS" LUKS encrypted disk passphrase to the new LUKS Disk Recovery Key passphrase..." - cryptsetup luksChangeKey "$LUKS" --key-slot 0 --key-file=/tmp/luks_current_Disk_Recovery_Key_passphrase /tmp/luks_new_Disk_Recovery_Key_passphrase - else - #If current and new LUKS Disk Recovery Key were exported - echo -n "$luks_new_Disk_Recovery_Key_passphrase" >/tmp/luks_new_Disk_Recovery_Key_passphrase - echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/luks_current_Disk_Recovery_Key_passphrase - warn "Changing "$LUKS" LUKS encrypted disk passphrase to the new LUKS Disk Recovery Key passphrase..." - cryptsetup luksChangeKey "$LUKS" --key-slot 0 --key-file=/tmp/luks_current_Disk_Recovery_Key_passphrase /tmp/luks_new_Disk_Recovery_Key_passphrase + elif [ -z "$luks_new_Disk_Recovery_Key_passphrase" ]; then + whiptail --title 'Changing LUKS Disk Recovery Key passphrase' --msgbox \ + "Please choose a strong passphrase of your own.\n\n**DICEWARE passphrase methodology is STRONGLY ADVISED.**\n\nHit Enter to continue" 0 80 + + echo -e "\nEnter your desired replacement for the actual LUKS Disk Recovery Key passphrase (At least 8 characters long):" + while [[ ${#luks_new_Disk_Recovery_Key_passphrase} -lt 8 ]]; do + read -r luks_new_Disk_Recovery_Key_passphrase + done fi - #Validate past cryptsetup attempts - if [ $(echo $?) -ne 0 ]; then - #Cryptsetup luksChangeKey was unsuccessful - whiptail --title 'Invalid LUKS passphrase?' --msgbox \ - "The LUKS Disk Recovery Key passphrase was provided to you by the OEM over\n a secure communication channel.\n\nIf you previously changed it and do not remember it,\n you will have to reinstall the OS from a USB drive.\nTo do so, put OS ISO file and it's signature file on root of a USB drive,\n and select Boot from USB\n\nHit Enter to continue." 30 60 - unset luks_current_Disk_Recovery_Key_passphrase - unset luks_new_Disk_Recovery_Key_passphrase - #remove "known good" selected LUKS container so that next pass asks again user to select LUKS container. - #maybe the container was not the right one + echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/secret/luks_current_Disk_Recovery_Key_passphrase + echo -n "$luks_new_Disk_Recovery_Key_passphrase" >/tmp/secret/luks_new_Disk_Recovery_Key_passphrase + + DEBUG "$luks_container: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." + if ! DO_WITH_DEBUG cryptsetup open --test-passphrase "$luks_container" --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase >/dev/null 2>&1; then + whiptail_error --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + "If you previously changed it and do not remember it, you will have to reinstall the OS from an external drive.\n\nTo do so, place the ISO file and its signature file on root of an external drive, and select Options-> Boot from USB \n\nHit Enter to retry." 0 80 + TRACE_FUNC detect_boot_device mount -o remount,rw /boot rm -f /boot/kexec_key_devices.txt mount -o remount,ro /boot - else - #Cryptsetup was successful. - #Cleanup should be called seperately. - #Exporting successfully used passphrase possibly reused by oem-factory-reset - export luks_new_Disk_Recovery_Key_passphrase - break; + luks_secrets_cleanup + unset LUKS + continue fi + + echo -e "\nChanging $luks_container LUKS encrypted disk passphrase to the new LUKS Disk Recovery Key passphrase..." + if ! DO_WITH_DEBUG cryptsetup luksChangeKey "$luks_container" --key-file=/tmp/secret/luks_current_Disk_Recovery_Key_passphrase /tmp/secret/luks_new_Disk_Recovery_Key_passphrase; then + whiptail_error --title 'Failed to change LUKS passphrase' --msgbox \ + "Failed to change the passphrase for $luks_container.\nPlease try again." 0 80 + continue + fi + + echo "Success changing passphrase for $luks_container." done + + # Export the new passphrase if all containers were processed successfully + luks_current_Disk_Recovery_Key_passphrase=$luks_new_Disk_Recovery_Key_passphrase + export luks_current_Disk_Recovery_Key_passphrase + export luks_new_Disk_Recovery_Key_passphrase + export LUKS } -luks_secrets_cleanup() -{ +# Cleanup LUKS secrets +luks_secrets_cleanup() { + TRACE_FUNC + #Cleanup - shred -n 10 -z -u /tmp/luks_new_Disk_Recovery_Key_passphrase 2>/dev/null || true - shred -n 10 -z -u /tmp/luks_current_Disk_Recovery_Key_passphrase 2>/dev/null || true + shred -n 10 -z -u /tmp/secret/luks_new_Disk_Recovery_Key_passphrase 2>/dev/null || true + shred -n 10 -z -u /tmp/secret/luks_current_Disk_Recovery_Key_passphrase 2>/dev/null || true + + #Unset variables (when in same boot) unset luks_current_Disk_Recovery_Key_passphrase unset luks_new_Disk_Recovery_Key_passphrase + unset LUKS } diff --git a/initrd/init b/initrd/init index 1b0d13ae3..44f2abecd 100755 --- a/initrd/init +++ b/initrd/init @@ -1,9 +1,7 @@ -#! /bin/ash -# Note this is used on legacy-flash boards that lack bash, it runs with busybox -# ash. Calls to bash scripts must be guarded by checking config. +#! /bin/bash mknod /dev/ttyprintk c 5 3 -echo "hello world" > /dev/ttyprintk +echo "hello world" >/dev/ttyprintk # Setup our path export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin @@ -12,7 +10,7 @@ export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin # running out of the ram disk. There are no fileysstems mounted. # It is important to have a way to invoke a recovery shell in case # the boot scripts are messed up, but also important to modify the -# PCRs if this happens to prevent the TPM disk keys from being revealed. +# PCRs if this happens to prevent the TPM Disk Unlock Keys from being revealed. # First thing it is vital to mount the /dev and other system directories mkdir /proc /sys /dev /tmp /boot /media 2>&- 1>&- @@ -24,7 +22,7 @@ if [ "$CONFIG_LINUXBOOT" = "y" ]; then mount /sys/firmware/efi/efivars fi -# Setup the pty psudeo filesystem +# Setup the pty pseudo filesystem mkdir /dev/pts mount /dev/pts 2>/dev/ttyprintk @@ -43,36 +41,110 @@ mkdir -p /tmp/secret # Now it is safe to print a banner if [ -r /etc/motd ]; then - cat /etc/motd > /dev/tty0 + cat /etc/motd >/dev/tty0 fi # Load the date from the hardware clock, setting it in local time hwclock -l -s -# Read the system configuration parameters -. /etc/ash_functions +# When mounting a filesystem, try exFAT last, since it logs errors if the +# filesystem is not exFAT, and the errors go to the console. Those errors are +# spurious when the medium is iso9660. By default in our config, the only +# filesystem after exFAT is iso9660, move exFAT last. +(grep -v '^\texfat$' /proc/filesystems && echo -e '\texfat') >/etc/filesystems + +# Read the system configuration parameters from build time board configuration . /etc/config +# import global functions +. /etc/functions + +# export user related content from cbfs +if [ "$CONFIG_COREBOOT" = "y" ]; then + /bin/cbfs-init +fi + +# Override CONFIG_USE_BLOB_JAIL if needed and persist via user config +if lspci -n | grep -E -q "8086:(2723|4df0)"; then + if ! cat /etc/config.user 2>/dev/null | grep -q "USE_BLOB_JAIL"; then + echo "CONFIG_USE_BLOB_JAIL=y" >>/etc/config.user + fi +fi + +# Override CONFIG_TPM and CONFIG_TPM2_TOOLS from /etc/config with runtime value +# determined above. +# +# Values in user config have higher priority during combining thus effectively +# changing the value for the rest of the scripts which source /tmp/config. + +#Only set CONFIG_TPM and CONFIG_TPM2_TOOLS if they are not already set in /etc/config.user +if ! grep -q 'CONFIG_TPM=' /etc/config.user 2>/dev/null; then + echo "export CONFIG_TPM=\"$CONFIG_TPM\"" >>/etc/config.user +fi +if ! grep -q 'CONFIG_TPM2_TOOLS=' /etc/config.user 2>/dev/null; then + echo "export CONFIG_TPM2_TOOLS=\"$CONFIG_TPM2_TOOLS\"" >>/etc/config.user +fi + +# CONFIG_BASIC was previously CONFIG_PUREBOOT_BASIC in the PureBoot distribution. +# Substitute it in config.user if present for backward compatibility. +sed -i -e 's/^export CONFIG_PUREBOOT_BASIC=/export CONFIG_BASIC=/g' /etc/config.user + +# Combine user configuration overrides from CBFS's /etc/config.user +combine_configs +# Load the user configuration parameters from combined config +. /tmp/config -# Board config had CONFIG_DEBUG_OUTPUT=y defined. -# Note that boards's coreboot config kernel command line "debug" option only will have all kernel messages output on console prior of this point +# Enable maximum debug info from here if config.user extracted and combined from CBFS had CONFIG_DEBUG_OUTPUT=y if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then - #Maximize printk messages to output all to console (8=debug) - #DEBUG and TRACE calls will output to /dev/kmsg, outputting both on dmesg and on console - dmesg -n 8 || true - DEBUG "Debug output enabled from board CONFIG_DEBUG_OUTPUT=y option (/etc/config)" -else - # Board config did't have CONFIG_DEBUG_OUTPUT=y defined + #Output all kernel messages to console (8=debug) + #DEBUG and TRACE calls will be in dmesg and on console # config.user extracted and combined from CBFS had CONFIG_DEBUG_OUTPUT=y - # Output only print messages with a priority of 4 (warnings) or lower (errors and critical) kernel messages to console - # This way, "debug" kernel command line option will have all kernel messages output on console prior of this point - # This is useful to debug boot issues but permits qemu board to boot without flooding console with kernel messages by disabling CONFIG_DEBUG_OUTPUT=y in qemu board config - dmesg -n 4 || true - DEBUG "Debug output enabled from /etc/config.user's CONFIG_DEBUG_OUTPUT=y after combine_configs (Config menu enabled Debug)" + # DO_WITH_DEBUG redirects stderr and stdout to /tmp/debug.log to not clog console + TRACE_FUNC + dmesg -n 8 + DEBUG "Full debug output enabled from this point: output both in dmesg and on console (equivalent of passing debug to kernel cmdline)" + DEBUG "NOTE: DO_WITH_DEBUG std_err and std_out will be redirected to /tmp/debug.log" +fi + +# report if we are in quiet mode, tell user measurements logs available under /tmp/debug.log +if [ "$CONFIG_QUIET_MODE" = "y" ]; then + # check origin of quiet mode setting =y: if it is under /etc/config.user then early cbfs-init outputs are not suppressible + # if it is under /etc/config then early cbfs-init outputs are suppressible + if grep -q 'CONFIG_QUIET_MODE="y"' /etc/config 2>/dev/null; then + echo "Quiet mode enabled from board configuration: refer to '/tmp/debug.log' for boot measurements traces" >/dev/tty0 + else + echo "Runtime applied Quiet mode: refer to '/tmp/debug.log' for additional boot measurements traces past this point" >/dev/tty0 + echo "To suppress earlier boot measurements traces, enable CONFIG_QUIET_MODE=y in your board configuration at build time." >/dev/tty0 + fi +# If CONFIG_QUIET_MODE enabled in board config but disabled from Config->Configuration Settings +# warn that early boot measurements output was suppressed prior of this point +elif [ "$CONFIG_QUIET_MODE" = "n" ]; then + # if CONFIG_QUIET_MODE=n in /etc/config.user but CONFIG_QUIET_MODE=y in /etc/config then early cbfs-init outputs are suppressed + # both needs to be checked to determine if early boot measurements traces were suppressed + if grep -q 'CONFIG_QUIET_MODE="y"' /etc/config 2>/dev/null && grep -q 'CONFIG_QUIET_MODE="n"' /etc/config.user 2>/dev/null; then + echo "Early boot measurements traces were suppressed per CONFIG_QUIET_MODE=y in your board configuration at build time (/etc/config)" >/dev/tty0 + echo "Runtime applied Quiet mode disabled: refer to '/tmp/debug.log' for cbfs-init related traces prior of this point" >/dev/tty0 + fi fi -TRACE "Under init" +TRACE_FUNC -# set CONFIG_TPM dynamically before init +# make sure we have sysctl requirements +if [ ! -d /proc/sys ]; then + warn "BUG!!! The following requirements to apply runtime kernel tweaks are missing:" + warn "CONFIG_SYSCTL=y" + warn "CONFIG_PROC_SYSCTL=y" + warn "Please open an issue" +fi + +if [ ! -e /proc/sys/vm/panic_on_oom ]; then + warn "BUG!!! Requirements to setup Panic when under Out Of Memory situation through PROC_SYSCTL are missing (panic_on_oom was not enabled)" + warn "Please open an issue" +else + DEBUG "Applying panic_on_oom setting to sysctl" + echo 1 >/proc/sys/vm/panic_on_oom +fi + +# set CONFIG_TPM dynamically off before init if no TPM device is present if [ ! -e /dev/tpm0 ]; then CONFIG_TPM='n' CONFIG_TPM2_TOOLS='n' @@ -82,9 +154,11 @@ fi if [ -x /bin/fbwhiptail ]; then export BG_COLOR_WARNING="${CONFIG_WARNING_BG_COLOR:-"--background-gradient 0 0 0 150 125 0"}" export BG_COLOR_ERROR="${CONFIG_ERROR_BG_COLOR:-"--background-gradient 0 0 0 150 0 0"}" + export BG_COLOR_MAIN_MENU="normal" else - export BG_COLOR_WARNING="${CONFIG_WARNING_BG_COLOR:-""}" - export BG_COLOR_ERROR="${CONFIG_ERROR_BG_COLOR:-""}" + export TEXT_BG_COLOR_WARNING="${CONFIG_WARNING_TEXT_BG_COLOR:-"yellow"}" + export TEXT_BG_COLOR_ERROR="${CONFIG_ERROR_TEXT_BG_COLOR:-"red"}" + export BG_COLOR_MAIN_MENU="normal" fi if [ "$CONFIG_TPM" = "y" ]; then @@ -92,68 +166,34 @@ if [ "$CONFIG_TPM" = "y" ]; then tpmr startsession fi -if [ "$CONFIG_COREBOOT" = "y" ]; then - [ -x /bin/bash ] && /bin/cbfs-init -fi if [ "$CONFIG_LINUXBOOT" = "y" ]; then + # Initialize the UEFI environment for linuxboot boards /bin/uefi-init fi # Set GPG_TTY before calling gpg in key-init +#TODO: do better then this; on dual console gpg only interacts with main console (affects Talos-2 and all whiptail variants) export GPG_TTY=/dev/console # Initialize gpnupg with distro/user keys and setup the keyrings -[ -x /bin/bash ] && /bin/key-init - -# Override CONFIG_USE_BLOB_JAIL if needed and persist via user config -if lspci -n | grep -E -q "8086:(2723|4df0)"; then - if ! cat /etc/config.user 2>/dev/null | grep -q "USE_BLOB_JAIL"; then - echo "CONFIG_USE_BLOB_JAIL=y" >> /etc/config.user - fi -fi - -# Override CONFIG_TPM and CONFIG_TPM2_TOOLS from /etc/config with runtime value -# determined above. -# -# Values in user config have higher priority during combining thus effectively -# changing the value for the rest of the scripts which source /tmp/config. -echo "export CONFIG_TPM=\"$CONFIG_TPM\"" >> /etc/config.user -echo "export CONFIG_TPM2_TOOLS=\"$CONFIG_TPM2_TOOLS\"" >> /etc/config.user - -# CONFIG_BASIC was previously CONFIG_PUREBOOT_BASIC in the PureBoot distribution. -# Substitute it in config.user if present for backward compatibility. -sed -i -e 's/^export CONFIG_PUREBOOT_BASIC=/export CONFIG_BASIC=/g' /etc/config.user - -combine_configs -. /tmp/config - -# Enable maximum debug info from here if config.user extracted and combined from CBFS had CONFIG_DEBUG_OUTPUT=y -if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then - #Output all kernel messages to console (8=debug) - #DEBUG and TRACE calls will be in dmesg and on console - if ! grep -q 'CONFIG_DEBUG_OUTPUT="y"' /etc/config;then - # Board config did't have CONFIG_DEBUG_OUTPUT=y defined - # config.user extracted and combined from CBFS had CONFIG_DEBUG_OUTPUT=y - dmesg -n 8 - DEBUG "Debug output enabled from /etc/config.user's CONFIG_DEBUG_OUTPUT=y after combine_configs (Config menu enabled Debug)" - TRACE "Under init:after combine_configs" - fi -fi - +/bin/key-init # Setup recovery serial shell if [ ! -z "$CONFIG_BOOT_RECOVERY_SERIAL" ]; then stty -F "$CONFIG_BOOT_RECOVERY_SERIAL" 115200 - pause_recovery 'Console recovery shell' \ - < "$CONFIG_BOOT_RECOVERY_SERIAL" \ - > "$CONFIG_BOOT_RECOVERY_SERIAL" 2>&1 & + pause_recovery 'Serial console recovery shell' \ + <"$CONFIG_BOOT_RECOVERY_SERIAL" \ + >"$CONFIG_BOOT_RECOVERY_SERIAL" 2>&1 & fi # load USB modules for boards using a USB keyboard -if [ "$CONFIG_USB_KEYBOARD" = "y" ]; then +if [ "$CONFIG_USB_KEYBOARD_REQUIRED" = y ] || [ "$CONFIG_USER_USB_KEYBOARD" = "y" ]; then enable_usb fi +# Set the keyboard keymap if defined, file exists, and loadkeys is available +load_keymap "$CONFIG_KEYBOARD_KEYMAP" + # If the user has been holding down r, enter a recovery shell # otherwise immediately start the configured boot script. # We don't print a prompt, since this is a near instant timeout. @@ -169,29 +209,28 @@ if [ "$boot_option" = "r" ]; then # just in case... exit elif [ "$boot_option" = "o" ]; then - # Launch OEM Factory Reset/Re-Ownership - oem-factory-reset + # Launch OEM Factory Reset mode + echo -e "***** Entering OEM Factory Reset mode\n" >/dev/tty0 + oem-factory-reset --mode oem # just in case... exit fi if [ "$CONFIG_BASIC" = "y" ]; then - echo -e "***** BASIC mode: tamper detection disabled\n" > /dev/tty0 + echo -e "***** BASIC mode: tamper detection disabled\n" >/dev/tty0 fi # export firmware version -export FW_VER=$(dmesg | grep 'DMI' | grep -o 'BIOS.*' | cut -f2- -d ' ') -# chop off date, since will always be epoch w/timeless builds -FW_VER=${FW_VER::-10} +export FW_VER=$(fw_version) # Add our boot devices into the /etc/fstab, if they are defined # in the configuration file. if [ ! -z "$CONFIG_BOOT_DEV" ]; then - echo >> /etc/fstab "$CONFIG_BOOT_DEV /boot auto defaults,ro 0 0" + echo >>/etc/fstab "$CONFIG_BOOT_DEV /boot auto defaults,ro 0 0" fi # Set the console font if needed -[ -x /bin/bash ] && setconsolefont.sh +setconsolefont.sh if [ "$CONFIG_BASIC" = "y" ]; then CONFIG_BOOTSCRIPT=/bin/gui-init-basic @@ -221,7 +260,7 @@ else setsid agetty -aroot -l"$CONFIG_BOOTSCRIPT" "$console" linux & done fi - + #Setup a control tty so that all terminals outputs correct tty when tty is called exec cttyhack "$CONFIG_BOOTSCRIPT" else diff --git a/initrd/mount-boot b/initrd/mount-boot index 42e4c9ae5..be02e08d8 100755 --- a/initrd/mount-boot +++ b/initrd/mount-boot @@ -36,7 +36,7 @@ dev_blocks=`cat "$dev_size_file"` # # Extract the signed file from the hard disk image # -if ! dd if="$dev" of="$cmd_sig" bs=512 skip="`expr $dev_blocks - 1`"; then +if ! dd if="$dev" of="$cmd_sig" bs=512 skip="`expr $dev_blocks - 1`" > /dev/null 2>&1; then echo >&2 '!!!!!' echo >&2 '!!!!! Boot block extraction failed' echo >&2 '!!!!! Dropping to recovery shell' diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index 3f04edc82..b079fcc0c 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -6,7 +6,7 @@ . /etc/functions -TRACE "Under insmod.sh" +TRACE_FUNC MODULE="$1"; shift @@ -23,6 +23,15 @@ if [ ! -r "$MODULE" ]; then die "$MODULE: not found?" fi +# Check if module is already loaded +# Transform module name changing _ for - and trailing .ko if present +# Unify lsmod output to use - instead of _ for comparison +module_name=$(basename "$MODULE" | sed 's/_/-/g' | sed 's/\.ko$//') +if lsmod | sed 's/_/-/g' | grep -q "^$module_name\\b"; then + DEBUG "$MODULE: already loaded, skipping" + exit 0 +fi + if [ ! -r /sys/class/tpm/tpm0/pcrs -o ! -x /bin/tpm ]; then if [ ! -c /dev/tpmrm0 -o ! -x /bin/tpm2 ]; then tpm_missing=1 @@ -30,22 +39,26 @@ if [ ! -r /sys/class/tpm/tpm0/pcrs -o ! -x /bin/tpm ]; then fi if [ -z "$tpm_missing" ]; then - DEBUG "Extending TPM PCR $MODULE_PCR with $MODULE prior of usage" - tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ - || die "$MODULE: tpm extend failed" -fi - -if [ ! -z "$*" -a -z "$tpm_missing" ]; then - DEBUG "Extending TPM PCR $MODULE_PCR with $*" - TMPFILE=/tmp/insmod.$$ - echo "$@" > $TMPFILE - DEBUG "Extending TPM PCR $MODULE_PCR with $MODULE prior of usage" - tpmr extend -ix "$MODULE_PCR" -if $TMPFILE \ - || die "$MODULE: tpm extend on arguments failed" + INFO "TPM: Extending PCR[$MODULE_PCR] with $MODULE and parameters '$*' before loading" + # Extend with the module parameters (even if they are empty) and the + # module. Changing the parameters or the module content will result in a + # different PCR measurement. + if [ -n "$*" ]; then + TRACE_FUNC + INFO "Extending with module parameters and the module's content" + tpmr extend -ix "$MODULE_PCR" -ic "$*" + tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ + || die "$MODULE: tpm extend failed" + else + TRACE_FUNC + INFO "No module parameters, extending only with the module's content" + tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ + || die "$MODULE: tpm extend failed" + fi fi # Since we have replaced the real insmod, we must invoke # the busybox insmod via the original executable DEBUG "Loading $MODULE with busybox insmod" busybox insmod "$MODULE" "$@" \ -|| die "$MODULE: insmod failed" + || die "$MODULE: insmod failed" diff --git a/modules/bash b/modules/bash index 327b5dd50..62f063f93 100644 --- a/modules/bash +++ b/modules/bash @@ -7,20 +7,23 @@ bash_tar := bash-$(bash_version).tar.gz bash_url := https://ftpmirror.gnu.org/bash/$(bash_tar) bash_hash := 5bac17218d3911834520dad13cd1f85ab944e1c09ae1aba55906be1f8192f558 +# --enable-debugger: Enables BASH_SOURCE tracing through functions as well as +# BASH_ARGV/BASH_ARGC. (Otherwise BASH_SOURCE[0] is empty when calling a +# function, it's only set in top level script code.) bash_configure := CFLAGS="-g0 -Os" LDFLAGS="-s" ./configure \ $(CROSS_TOOLS) \ --host $(target) \ --prefix="/usr" \ - --enable-largefile \ - --infodir=/usr/share/info \ - --mandir=/usr/share/man \ - --without-bash-malloc \ + --infodir=/usr/share/info \ + --mandir=/usr/share/man \ --disable-coprocesses \ - --disable-debugger \ --disable-net-redirections \ - --enable-single-help-strings \ --disable-nls \ - --disable-readline \ + --enable-debugger \ + --enable-largefile \ + --enable-readline \ + --enable-single-help-strings \ + --without-bash-malloc bash_target := $(MAKE_JOBS) \ && $(MAKE) -C $(build)/$(bash_dir) \ diff --git a/modules/cairo b/modules/cairo index b4970652a..81d71e9a4 100644 --- a/modules/cairo +++ b/modules/cairo @@ -12,10 +12,16 @@ cairo_configure := \ ./configure \ --host $(MUSL_ARCH)-elf-linux \ --prefix="/" \ - --disable-xlib --disable-xcb --disable-pdf \ - --disable-ps --disable-svg --disable-script \ - --disable-ft --disable-fc --disable-pthread \ + --disable-fc \ + --disable-ft \ --disable-gobject \ + --disable-pdf \ + --disable-ps \ + --disable-pthread \ + --disable-script \ + --disable-svg \ + --disable-xcb \ + --disable-xlib \ && sed \ -e 's/^hardcode_libdir_flag_spec.*/hardcode_libdir_flag_spec=" -D__LIBTOOL_RPATH_DISABLE__ "/' \ < libtool \ diff --git a/modules/coreboot b/modules/coreboot index a066b058e..84b9f5130 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -65,14 +65,18 @@ $(eval $(call coreboot_module,4.11,)) # libgfxinit, and the old Ada compiler no longer compiles with the Debian 12 host toolchain. coreboot-4.11_toolchain_build_args := BUILD_LANGUAGES=c -coreboot-4.19_hash := 65ccb2f46535b996e0066a1b76f81c8cf1ff3e27df84b3f97d8ad7b3e7cf0a43 -coreboot-blobs-4.19_hash := 30214caed07b25f11e47bec022ff6234841376e36689eb674de2330a3e980cbc -$(eval $(call coreboot_module,4.19,)) - coreboot-4.20.1_hash := b41539a8c2eab2fec752157eb4acbd0e2a637a7203530c12e66b43a5c3c3a931 coreboot-blobs-4.20.1_hash := 30f9d8618e78d483d0903976982485e70825ca3469efd17902c9246aaefd7c4a $(eval $(call coreboot_module,4.20.1,)) +coreboot-4.22.01_hash := 3d1a36dfb2a654133c7f36cf4da436f0d79f535644069adfe7cdcad962532c3f +coreboot-blobs-4.22.01_hash := 4bb98f1a1cc8b3c7004a1d720462bfff0fe34a9106163df2708b952bddfc5203 +$(eval $(call coreboot_module,4.22.01,)) + +coreboot-24.02.01_hash := e56f5c0c9008bfdec1c4be6409ac093680140f9441efd3d5e47bdeffcbf77e50 +coreboot-blobs-24.02.01_hash := 8d03b82cd2b2593473d4cd511c7bef7fdd43839237f6c37a8383161660c14427 +$(eval $(call coreboot_module,24.02.01,)) + # coreboot git forks # talos_2 could use the 4.20.1 toolchain, but it's the only ppc64 fork, so @@ -82,26 +86,35 @@ coreboot-talos_2_repo := https://github.com/Dasharo/coreboot coreboot-talos_2_commit_hash := fc47236e9877f4113dfcce07fa928f52d4d2c8ee $(eval $(call coreboot_module,talos_2,)) -# Similarly, purism is based on 4.21, but nothing builds against 4.21 itself -# or any other fork - no benefit to sharing the toolchain yet. +# coreboot-purism is based on 24.02.01 - reuse that toolchain. coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git -coreboot-purism_commit_hash := 0d57cff58fba2f3a4d3a714a4eae65753e58c6ff -$(eval $(call coreboot_module,purism,)) - -#Nitrokey nv41/ns50 are based on Dasharo coreboot port, -# with patches staging under coreboot-clevo_release -coreboot-nitrokey_repo := https://github.com/dasharo/coreboot -coreboot-nitrokey_commit_hash := 1bcb338682b612cfcca8bba02846f78139b2e0c8 -coreboot-nitrokey_patch_version := clevo_release -#We use clevo_release's crossgcc for now, unshared but between nitropad nv41/ns50 -$(eval $(call coreboot_module,nitrokey,)) +coreboot-purism_commit_hash := bea9947a1279be7d4a72b38a601d0288d10d1cb8 +$(eval $(call coreboot_module,purism,24.02.01)) + +# MSI and NovaCustom NV4xPZ, NS5xPU, V560TU boards are based on Dasharo +# coreboot fork, based on upstream coreboot version 24.02 +coreboot-dasharo_repo := https://github.com/dasharo/coreboot +coreboot-dasharo_commit_hash := 94e5f5d5b808cf8d8fd5c70d4ef6a08a054f8986 +$(eval $(call coreboot_module,dasharo,24.02.01)) +#coreboot-dasharo_patch_version := unreleased + +# T480 is based on coreboot ~24.12 release +# coreboot 24.12 doesn't include t480 support which is still under review at https://review.coreboot.org/c/coreboot/+/83274 +# TODO: track upstream WiP and switch to later upstream release containing patchset without relaying on libreboot downstream maintained patchset +# Therefore, patches/coreboot-2412 includes libreboot patches applied to 24.12 release +# patches/coreboot-2412 also includes PR0 patchset, minus xeon support which don't apply to 24.12 as per https://review.coreboot.org/c/coreboot/+/85278 +# TODO: @miczyg1 rebase of patchset so that doenstream don't have to maintain, adapt work +coreboot-24.12_repo := https://github.com/coreboot/coreboot +coreboot-24.12_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a +#Don't reuse any coreboot buildstack for now since nothing else is based on 24.12 +$(eval $(call coreboot_module,24.12,)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" $(error "$(BOARD): does not specify coreboot version under CONFIG_COREBOOT_VERSION") else ifeq "$(coreboot-$(CONFIG_COREBOOT_VERSION)_dir)" "" $(error "$(BOARD): coreboot version $(CONFIG_COREBOOT_VERSION) not known") -endif +endif coreboot_module := coreboot-$(CONFIG_COREBOOT_VERSION) modules-y += $(coreboot_module) @@ -110,44 +123,47 @@ coreboot_dir := $($(coreboot_module)_dir) coreboot_base_dir := $($(coreboot_module)_base_dir) $(coreboot_module)_depends += $(if $(CONFIG_PURISM_BLOBS), purism-blobs) -$(coreboot_module)_depends += $(if $(CONFIG_NITROKEY_BLOBS), nitrokey-blobs) # coreboot builds are specialized on a per-target basis. # The builds are done in a per-target subdirectory CONFIG_COREBOOT_CONFIG ?= config/coreboot-$(BOARD).config +CONFIG_COREBOOT_LOCALVERSION ?= "$(BRAND_NAME)-$(HEADS_GIT_VERSION)" +CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME ?= $(BOARD) # Ensure that touching the config file will force a rebuild $(build)/$(coreboot_dir)/.configured: $(CONFIG_COREBOOT_CONFIG) -EXTRA_FLAGS ?= -fdebug-prefix-map=$(pwd)=heads -gno-record-gcc-switches -Wno-error=packed-not-aligned -Wno-address-of-packed-member - # Select the coreboot version to use for the toolchain ifeq "$($(coreboot_module)_toolchain)" "" - # Use the same module - coreboot_toolchain_module := $(coreboot_module) +# Use the same module +coreboot_toolchain_module := $(coreboot_module) else - # Use a different module - coreboot_toolchain_module := coreboot-$($(coreboot_module)_toolchain) - modules-y += $(coreboot_toolchain_module) - # The toolchain module won't build anything for this board, we just need - # the module prepped so we can hook up the toolchain target - $(coreboot_toolchain_module)_output := .nobuild - $(coreboot-toolchain_module)_configure := echo -e 'all:\n\ttouch .nobuild' > Makefile.nobuild - $(coreboot-toolchain_module)_target := -f Makefile.nobuild +# Use a different module +coreboot_toolchain_module := coreboot-$($(coreboot_module)_toolchain) +modules-y += $(coreboot_toolchain_module) +# The toolchain module won't build anything for this board, we just need +# the module prepped so we can hook up the toolchain target +$(coreboot_toolchain_module)_output := .nobuild +$(coreboot-toolchain_module)_configure := echo -e 'all:\n\ttouch .nobuild' > Makefile.nobuild +$(coreboot-toolchain_module)_target := -f Makefile.nobuild endif $(coreboot_module)_configure := \ - mkdir -p "$(build)/$(coreboot_dir)" \ - && $(call install_config,$(pwd)/$(CONFIG_COREBOOT_CONFIG),$(build)/$(coreboot_dir)/.config) \ - && echo 'CONFIG_LOCALVERSION="$(BRAND_NAME)-$(HEADS_GIT_VERSION)"' >> $(build)/$(coreboot_dir)/.config \ - && echo 'CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="$(BOARD)"' >> $(build)/$(coreboot_dir)/.config \ - && $(MAKE) olddefconfig \ + mkdir -p "$(build)/$(coreboot_dir)"; \ + $(call install_config,$(pwd)/$(CONFIG_COREBOOT_CONFIG),$(build)/$(coreboot_dir)/.config); \ + sed -i '/^CONFIG_LOCALVERSION/d' $(build)/$(coreboot_dir)/.config; \ + echo 'CONFIG_LOCALVERSION=$(CONFIG_COREBOOT_LOCALVERSION)' >> $(build)/$(coreboot_dir)/.config; \ + sed -i '/^CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME/d' $(build)/$(coreboot_dir)/.config; \ + echo 'CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="$(CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME)"' >> $(build)/$(coreboot_dir)/.config; \ + if [ ! -z "$(CONFIG_COREBOOT_SMBIOS_MANUFACTURER)" ]; then \ + sed -i '/^CONFIG_MAINBOARD_SMBIOS_MANUFACTURER/d' $(build)/$(coreboot_dir)/.config; \ + echo 'CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="$(CONFIG_COREBOOT_SMBIOS_MANUFACTURER)"' >> $(build)/$(coreboot_dir)/.config; \ + fi; \ + $(MAKE) olddefconfig \ -C "$(build)/$(coreboot_base_dir)" \ obj="$(build)/$(coreboot_dir)" \ DOTCONFIG="$(build)/$(coreboot_dir)/.config" \ BUILD_TIMELESS=1 \ - CFLAGS_x86_32="$(EXTRA_FLAGS)" \ - CFLAGS_x86_64="$(EXTRA_FLAGS)" \ # Create a dependency from coreboot to the toolchain. Use .heads-toolchain to # mark that the toolchain was built. @@ -205,8 +221,6 @@ $(coreboot_module)_target := \ XGCCPATH="$(build)/$($(coreboot_toolchain_module)_base_dir)/util/crossgcc/xgcc/bin/" \ $(COREBOOT_TARGET_CROSS) \ BUILD_TIMELESS=1 \ - CFLAGS_x86_32="$(EXTRA_FLAGS)" \ - CFLAGS_x86_64="$(EXTRA_FLAGS)" \ $(MAKE_JOBS) $(coreboot_module)_output := $(CONFIG_COREBOOT_ROM) @@ -249,7 +263,7 @@ coreboot.save_in_defconfig_format_in_place: DOTCONFIG="$(build)/$(coreboot_dir)/.config" \ savedefconfig && \ mv "$(build)/$(coreboot_base_dir)/defconfig" "$(pwd)/$(CONFIG_COREBOOT_CONFIG)" - + coreboot.save_in_oldconfig_format_in_place: mkdir -p "$(build)/$(coreboot_dir)" && \ cp "$(pwd)/$(CONFIG_COREBOOT_CONFIG)" "$(build)/$(coreboot_dir)/.config" && \ diff --git a/modules/cryptsetup2 b/modules/cryptsetup2 index b7ffd8d43..ff98639b6 100644 --- a/modules/cryptsetup2 +++ b/modules/cryptsetup2 @@ -2,11 +2,11 @@ modules-$(CONFIG_CRYPTSETUP2) += cryptsetup2 cryptsetup2_depends := util-linux popt lvm2 json-c $(musl_dep) -cryptsetup2_version := 2.3.3 +cryptsetup2_version := 2.6.1 cryptsetup2_dir := cryptsetup-$(cryptsetup2_version) cryptsetup2_tar := cryptsetup-$(cryptsetup2_version).tar.xz -cryptsetup2_url := https://www.kernel.org/pub/linux/utils/cryptsetup/v2.3/cryptsetup-$(cryptsetup2_version).tar.xz -cryptsetup2_hash := 3bca4ffe39e2f94cef50f6ea65acb873a6dbce5db34fc6bcefe38b6d095e82df +cryptsetup2_url := https://www.kernel.org/pub/linux/utils/cryptsetup/v2.6/cryptsetup-$(cryptsetup2_version).tar.xz +cryptsetup2_hash := 410ded65a1072ab9c8e41added37b9729c087fef4d2db02bb4ef529ad6da4693 # Use an empty prefix so that the executables will not include the # build path. @@ -16,9 +16,15 @@ cryptsetup2_configure := \ ./configure \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ + --enable-internal-sse-argon2 \ --disable-rpath \ --disable-gcrypt-pbkdf2 \ - --enable-cryptsetup-reencrypt \ + --disable-ssh-token \ + --disable-asciidoc \ + --disable-nls \ + --disable-selinux \ + --disable-udev \ + --disable-external-tokens \ --with-crypto_backend=kernel \ --with-tmpfilesdir=$(INSTALL)/lib/tmpfiles.d @@ -33,7 +39,6 @@ cryptsetup2_target := \ cryptsetup2_output := \ .libs/cryptsetup \ - .libs/cryptsetup-reencrypt \ .libs/veritysetup \ cryptsetup2_libraries := \ diff --git a/modules/dropbear b/modules/dropbear index 285f97bb7..ac32a59ca 100644 --- a/modules/dropbear +++ b/modules/dropbear @@ -11,8 +11,8 @@ dropbear_configure := ./configure \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ - --disable-syslog \ --disable-lastlog \ + --disable-syslog \ --disable-utmp \ --disable-utmpx \ --disable-wtmp \ diff --git a/modules/flashprog b/modules/flashprog new file mode 100644 index 000000000..ef34de70e --- /dev/null +++ b/modules/flashprog @@ -0,0 +1,46 @@ +modules-$(CONFIG_FLASHPROG) += flashprog + +flashprog_depends := pciutils $(musl_dep) + +flashprog_version := eb2c04185f8f471c768b742d66e4c552effdd9cb +flashprog_dir := flashprog-$(flashprog_version) +flashprog_tar := $(flashprog_dir).tar.gz +flashprog_url := https://github.com/SourceArcade/flashprog/archive/$(flashprog_version).tar.gz +flashprog_hash := 0d4186be9f2088d624a9a708c352d0dfafa2264e1436b11ec3cc1a350fd45a77 + +# Default options for flashprog +flashprog_cfg := \ + WARNERROR=no \ + CONFIG_NOTHING=yes \ + CONFIG_INTERNAL=yes \ + CONFIG_INTERNAL_X86=yes \ + +ifeq "$(CONFIG_TARGET_ARCH)" "ppc64" +flashprog_cfg := \ + WARNERROR=no \ + CONFIG_NOTHING=yes \ + CONFIG_LINUX_MTD=yes +endif + +#Only enable AST1100 if requested per board configs +ifeq "$(CONFIG_FLASHPROG_AST1100)" "y" +flashprog_cfg += CONFIG_AST1100=yes +endif + +flashprog_target := \ + $(MAKE_JOBS) \ + CFLAGS="-Os -I$(INSTALL)/include/pci" \ + DESTDIR="$(INSTALL)" \ + INSTALL="$(INSTALL)" \ + LDFLAGS="-L$(INSTALL)/lib" \ + PREFIX="$(INSTALL)" \ + $(CROSS_TOOLS) \ + $(flashprog_cfg) \ + flashprog + +flashprog_output := \ + flashprog + +flashprog_libraries := \ + +flashprog_configure := diff --git a/modules/flashrom b/modules/flashrom index c7ce3e949..63143d9dd 100644 --- a/modules/flashrom +++ b/modules/flashrom @@ -27,10 +27,13 @@ ifeq "$(CONFIG_FLASHROM_AST1100)" "y" flashrom_cfg += CONFIG_AST1100=yes endif - - flashrom_target := \ $(MAKE_JOBS) \ + CFLAGS="-Os -I$(INSTALL)/include/pci" \ + DESTDIR="$(INSTALL)" \ + INSTALL="$(INSTALL)" \ + LDFLAGS="-L$(INSTALL)/lib" \ + PREFIX="$(INSTALL)" \ $(CROSS_TOOLS) \ $(flashrom_cfg) \ flashrom diff --git a/modules/flashtools b/modules/flashtools index edbf136d9..94386ba7c 100644 --- a/modules/flashtools +++ b/modules/flashtools @@ -10,6 +10,7 @@ flashtools_hash := a68cdb4a2e312f96862119a6d829ac900b53d0cbc80caa5632efd43b5b7ee flashtools_target := \ $(CROSS_TOOLS) \ + $(MAKE_JOBS) \ CFLAGS="-Os -I$(INSTALL)/include" \ LDFLAGS="-L$(INSTALL)/lib" \ diff --git a/modules/gpg b/modules/gpg index e6b8f2c52..7bab72e71 100644 --- a/modules/gpg +++ b/modules/gpg @@ -23,20 +23,20 @@ gpg_configure := \ ./configure \ --build $(MUSL_ARCH)-elf-linux \ --host $(MUSL_ARCH)-linux-musl \ - --with-libusb="$(INSTALL)" \ --prefix "/" \ - --enable-card-support \ - --disable-bzip2 \ --disable-asm \ + --disable-bzip2 \ + --disable-dns-cert \ + --disable-dns-srv \ --disable-exec \ - --disable-photo-viewers \ + --disable-finger \ + --disable-hkp \ --disable-keyserver-helpers \ --disable-ldap \ - --disable-hkp \ - --disable-finger \ - --disable-dns-srv \ - --disable-dns-cert \ + --disable-photo-viewers \ --disable-regex \ + --enable-card-support \ + --with-libusb="$(INSTALL)" \ # Run one build to generate the executables with the pre-defined # exec_prefix and datarootdir, then a second make to install the binaries diff --git a/modules/gpg2 b/modules/gpg2 index 141dbeb3b..b121febc8 100644 --- a/modules/gpg2 +++ b/modules/gpg2 @@ -18,35 +18,32 @@ gpg2_configure := \ ./configure \ CPPFLAGS="-I$(INSTALL)/include/libusb-1.0" \ --host $(MUSL_ARCH)-linux-musl \ - --with-libusb="$(INSTALL)" \ - --with-gpg-error-prefix="$(INSTALL)" \ - --with-libgcrypt-prefix="$(INSTALL)" \ - --with-libassuan-prefix="$(INSTALL)" \ - --with-ksba-prefix="$(INSTALL)" \ - --with-npth-prefix="$(INSTALL)" \ --prefix "/" \ --libexecdir "/bin" \ - --enable-scdaemon \ - --enable-ccid-driver \ - --disable-tofu \ - --disable-rpath \ - --disable-regex \ - --disable-doc \ + --disable-all-tests \ --disable-bzip2 \ + --disable-dirmngr \ + --disable-doc \ --disable-exec \ - --disable-photo-viewers \ + --disable-gnutls \ + --disable-gpgsm \ --disable-ldap \ - --disable-regex \ + --disable-libdns \ --disable-nls \ - --disable-all-tests \ - --disable-wks-tools \ - --disable-gnutls \ - --disable-dirmngr \ --disable-ntbtls \ - --disable-libdns \ - --disable-zip \ + --disable-photo-viewers \ + --disable-rpath \ --disable-sqlite \ - --disable-gpgsm \ + --disable-tofu \ + --disable-wks-tools \ + --disable-zip \ + --enable-ccid-driver \ + --enable-scdaemon \ + --with-gpg-error-prefix="$(INSTALL)" \ + --with-ksba-prefix="$(INSTALL)" \ + --with-libassuan-prefix="$(INSTALL)" \ + --with-libgcrypt-prefix="$(INSTALL)" \ + --with-npth-prefix="$(INSTALL)" \ # Run one build to generate the executables with the pre-defined # exec_prefix and datarootdir, then a second make to install the binaries diff --git a/modules/hotp-verification b/modules/hotp-verification index 6085a7680..032c80903 100644 --- a/modules/hotp-verification +++ b/modules/hotp-verification @@ -2,12 +2,12 @@ modules-$(CONFIG_HOTPKEY) += hotp-verification hotp-verification_depends := libusb $(musl_dep) -# v1.5 -hotp-verification_version := 70c04f51387eee8f777e943ba83b6405764a3cd2 +# v1.7 + non-released stuff under 1.7 version bump (Nitrokey will do PR to change this in the future and also fixes to Heads related to regression fixes under Heads) +hotp-verification_version := f4583b701a354dfa50c690075a568bc5cdf160e1 hotp-verification_dir := hotp-verification-$(hotp-verification_version) hotp-verification_tar := nitrokey-hotp-verification-$(hotp-verification_version).tar.gz hotp-verification_url := https://github.com/Nitrokey/nitrokey-hotp-verification/archive/$(hotp-verification_version).tar.gz -hotp-verification_hash := 5244b6b514117f955a03be2363fd51567a125cb8dc904d1bd89351be27eb8bb3 +hotp-verification_hash := 42efeba9a61e4a00df55bf5337c157948bc76c895410fc76d02b87d6cd3b38eb hotp-verification_target := \ $(MAKE_JOBS) \ diff --git a/modules/ioport b/modules/ioport index 2d1c6b352..ab25c9299 100644 --- a/modules/ioport +++ b/modules/ioport @@ -8,8 +8,8 @@ ioport_hash := 7fac1c4b61eb9411275de0e1e7d7a8c3f34166f64f16413f50741e8fce2b8dc0 ioport_configure := CFLAGS=-Os ./configure \ $(CROSS_TOOLS) \ + --host i386-elf-linux \ --prefix "/" \ - --host i386-elf-linux ioport_target := \ $(MAKE_JOBS) $(CROSS_TOOLS) inb && \ diff --git a/modules/iotools b/modules/iotools deleted file mode 100644 index ca0df8164..000000000 --- a/modules/iotools +++ /dev/null @@ -1,22 +0,0 @@ -modules-$(CONFIG_IOTOOLS) += iotools - -iotools_depends := pciutils $(musl_dep) - -iotools_version := 18949fdc4dedb1da3f51ee83a582b112fb9f2c71 -iotools_dir := iotools-$(iotools_version) -iotools_tar := $(iotools_dir).tar.gz -iotools_url := https://github.com/adurbin/iotools/archive/$(iotools_version).tar.gz -iotools_hash := 8df266f55cd8e79328faa0e274edc082de3f6c240617a28ace93abdace324ec2 - -iotools_cfg := \ - -iotools_target := \ - $(MAKE_JOBS) \ - $(CROSS_TOOLS) \ - -iotools_output := \ - iotools - -iotools_libraries := \ - -iotools_configure := diff --git a/modules/json-c b/modules/json-c index 158e320fd..cf310c3cf 100644 --- a/modules/json-c +++ b/modules/json-c @@ -31,7 +31,7 @@ json-c_configure := \ cmake .. -DCMAKE_INSTALL_PREFIX="$(INSTALL)" -DCMAKE_TOOLCHAIN_FILE=../toolchain -DCMAKE_BUILD_TYPE=minsizerel json-c_target := \ - $(CROSS_TOOLS) -C $(build)/$(json-c_dir)/build \ + $(CROSS_TOOLS) $(MAKE_JOBS) -C $(build)/$(json-c_dir)/build \ all install json-c_libraries := build/libjson-c.so.5 diff --git a/modules/kbd b/modules/kbd index f6d3f405a..b9b471f56 100644 --- a/modules/kbd +++ b/modules/kbd @@ -16,11 +16,11 @@ kbd_hash := aaed530a1490d63d041448372e2ad4f38c3179042903251000b71d527c46e945 kbd_configure := CFLAGS=-Os ./configure \ $(CROSS_TOOLS) \ - --prefix "" \ --host i386-elf-linux \ - --disable-optional-progs \ + --prefix "" \ --disable-libkeymap \ --disable-libkfont \ + --disable-optional-progs \ --disable-vlock \ kbd_target := \ @@ -38,3 +38,6 @@ ifeq "$(CONFIG_KBD_EXTRATOOLS)" "y" endif kbd_depends := $(musl_dep) + +kbd_data += \ + $(build)/$(kbd_dir)/data/keymaps|usr/lib/kbd/keymaps diff --git a/modules/libaio b/modules/libaio new file mode 100644 index 000000000..bf83fb90a --- /dev/null +++ b/modules/libaio @@ -0,0 +1,19 @@ +modules-$(CONFIG_LVM2) += libaio + +libaio_version := 0.3.113 +libaio_dir := libaio-$(libaio_version) +libaio_tar := libaio_$(libaio_version).orig.tar.gz +libaio_url := https://deb.debian.org/debian/pool/main/liba/libaio/$(libaio_tar) +libaio_hash := 2c44d1c5fd0d43752287c9ae1eb9c023f04ef848ea8d4aafa46e9aedb678200b + +libaio_target := \ + DESTDIR="$(INSTALL)" \ + prefix="/" \ + $(CROSS_TOOLS) \ + install \ + && mv $(build)/$(libaio_dir)/src/libaio.so.1.0.2 $(build)/$(libaio_dir)/src/libaio.so.1 \ + +libaio_libraries:= src/libaio.so.1 + +libaio_depends := $(musl_dep) + diff --git a/modules/libassuan b/modules/libassuan index a2536be7c..e641854f5 100644 --- a/modules/libassuan +++ b/modules/libassuan @@ -12,8 +12,8 @@ libassuan_configure := \ ./configure \ --host $(MUSL_ARCH)-linux-musl \ --prefix "/" \ - --disable-static \ --disable-doc \ + --disable-static \ --with-gpg-error-prefix="$(INSTALL)" \ libassuan_target := $(MAKE_JOBS) \ diff --git a/modules/libgcrypt b/modules/libgcrypt index c46fe6085..a3ece058b 100644 --- a/modules/libgcrypt +++ b/modules/libgcrypt @@ -12,9 +12,9 @@ libgcrypt_configure := \ ./configure \ --host=$(MUSL_ARCH)-linux-musl \ --prefix "/" \ + --disable-doc \ --disable-static \ --with-gpg-error-prefix="$(INSTALL)" \ - --disable-doc \ libgcrypt_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/libgpg-error b/modules/libgpg-error index 28b01f32b..0c8553560 100644 --- a/modules/libgpg-error +++ b/modules/libgpg-error @@ -10,12 +10,12 @@ libgpg-error_configure := \ $(CROSS_TOOLS) \ CFLAGS="-Os" \ ./configure \ - --prefix "/" \ --host=$(MUSL_ARCH)-linux-musl \ - --disable-static \ - --disable-nls \ - --disable-languages \ + --prefix "/" \ --disable-doc \ + --disable-languages \ + --disable-nls \ + --disable-static \ --disable-tests \ --enable-install-gpg-error-config \ diff --git a/modules/libnitrokey b/modules/libnitrokey index 455680f48..8bdb7116b 100644 --- a/modules/libnitrokey +++ b/modules/libnitrokey @@ -14,20 +14,20 @@ libnitrokey_hash := 4f3382b6193afe69c2001321038fce9490bc28803ed687152a397ccd8914 cmake_cross := "-DCMAKE_AR=$(CROSS)ar" \ -DCMAKE_CXX_COMPILER="$(CROSS)g++" \ - -DCMAKE_C_COMPILER="$(CROSS)gcc" \ + -DCMAKE_CXX_COMPILER_AR="$(CROSS)ar" \ -DCMAKE_CXX_FLAGS="-Os -fdata-sections -ffunction-sections -ffile-prefix-map=$(pwd)=heads -gno-record-gcc-switches -D__MUSL__ -I$(INSTALL)/include -L$(INSTALL)/lib " \ + -DCMAKE_C_COMPILER="$(CROSS)gcc" \ -DCMAKE_LINKER="$(CROSS)ld" - -DCMAKE_SHARED_LINKER_FLAGS="-gc-sections" - -DCMAKE_CXX_COMPILER_AR="$(CROSS)ar" \ -DCMAKE_NM="$(CROSS)nm" \ - -DCMAKE_OBJDUMP="$(CROSS)objdump" \ -DCMAKE_OBCOPY="$(CROSS)obcopy" \ + -DCMAKE_OBJDUMP="$(CROSS)objdump" \ + -DCMAKE_SHARED_LINKER_FLAGS="-gc-sections" -DCMAKE_STRIP="$(CROSS)strip" libnitrokey_configure := \ mkdir build -p && \ cd build && \ - $(CROSS_TOOLS) cmake .. -DNO_LOG=ON -DBUILD_SHARED_LIBS=OFF -DCOMPILE_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/ -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_BUILD_TYPE=MinSizeRel $(cmake_cross) + $(CROSS_TOOLS) cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_PREFIX=/ -DCOMPILE_TESTS=OFF -DNO_LOG=ON $(cmake_cross) # install "by-hand" as INSTALL_PREFIX is not working as expected libnitrokey_target := $(CROSS_TOOLS) $(MAKE_JOBS) -C build DESTDIR="$(INSTALL)" && \ diff --git a/modules/libusb b/modules/libusb index a3d40c563..56dfc044e 100644 --- a/modules/libusb +++ b/modules/libusb @@ -12,11 +12,10 @@ libusb_hash := 7dce9cce9a81194b7065ee912bcd55eeffebab694ea403ffb91b67db66b1824b libusb_configure := \ CFLAGS="-Os" \ ./configure \ - $(CROSS_TOOLS)\ - --host $(MUSL_ARCH)-elf-linux\ - --prefix "/"\ - --disable-udev\ - --disable-tests\ + $(CROSS_TOOLS) \ + --host $(MUSL_ARCH)-elf-linux \ + --prefix "/" \ + --disable-udev \ # Run one build to generate the executables with the pre-defined # exec_prefix and datarootdir, then a second make to install the binaries diff --git a/modules/linux b/modules/linux index afcabf4e5..206ff95f1 100644 --- a/modules/linux +++ b/modules/linux @@ -19,28 +19,27 @@ linux_hash := 9c4ebf21fe949f80fbcfbbd6e7fe181040d325e89475e230ab53ef01f9d55605 else ifeq "$(CONFIG_LINUX_VERSION)" "5.4.69" linux_version := 5.4.69 linux_hash := a8b31d716b397303a183e42ad525ff2871024a43e3ea530d0fdf73b7f9d27da7 -else ifeq "$(CONFIG_LINUX_VERSION)" "5.5-openpower" -linux_version := 5.5 -linux_patch_version := 5.5-openpower -linux_hash := a6fbd4ee903c128367892c2393ee0d9657b6ed3ea90016d4dc6f1f6da20b2330 +else ifeq "$(CONFIG_LINUX_VERSION)" "6.6.16-openpower" +linux_version := 6.6.16 +linux_patch_version := 6.6.16-openpower +linux_hash := b21d5795a3bead4f112916423222faa8a0f519e4201df343e3eb88dc9e4aaa30 # # linuxboot systems should *NOT* use 5.10.5 until a proper review has # been done. This is because `0000-efi_bds.patch` did not cleanly port # from 5.4.69 to 5.10.5 which directly affects linuxboot systems. # -else ifeq "$(CONFIG_LINUX_VERSION)" "5.10.5" -linux_version := 5.10.5 -linux_hash := 3991a9e16a187d78d5f414d89236ae5d7f404a69e60c4c42a9d262ee19612ef4 +else ifeq "$(CONFIG_LINUX_VERSION)" "5.10.214" +linux_version := 5.10.214 +linux_hash := 40f014d53e81f204f6d2a364aae4201ae07970dd1b70dc602d7c66c1a140f558 else ifeq "$(CONFIG_LINUX_VERSION)" "6.1.8" linux_version := 6.1.8 linux_hash := b60bb53ab8ba370a270454b11e93d41af29126fc72bd6ede517673e2e57b816d else $(error "$(BOARD): does not specify linux kernel version under CONFIG_LINUX_VERSION") -endif +endif linux_base_dir := linux-$(linux_version) -# TODO: fixup the patch process # input file in the heads config/ dir # Allow board config to specialize Linux configuration if necessary linux_kconfig := $(or $(CONFIG_LINUX_CONFIG),config/linux.config) @@ -79,6 +78,8 @@ $(INSTALL)/include/linux/limits.h: $(build)/$(linux_base_dir)/.canary KCONFIG_CONFIG="$(pwd)/$(linux_kconfig)" \ headers_install +# Inconditional: add USB keyboard support to all boards (linux_modules-y) +linux_modules-y += drivers/hid/usbhid/usbhid.ko # qemu linux_modules-$(CONFIG_LINUX_E1000) += drivers/net/ethernet/intel/e1000/e1000.ko @@ -122,8 +123,12 @@ linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/host/xhci-hcd.ko linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/host/xhci-pci.ko linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/storage/usb-storage.ko -#USB modules when a USB keyboard is defined in board config -linux_modules-$(CONFIG_USB_KEYBOARD) += drivers/hid/usbhid/usbhid.ko +#USB modules for Mobile USB Tethering (Most Android phones, Librem phone, etc) +linux_modules-$(CONFIG_MOBILE_TETHERING) += drivers/net/mii.ko +linux_modules-$(CONFIG_MOBILE_TETHERING) += drivers/net/usb/usbnet.ko +linux_modules-$(CONFIG_MOBILE_TETHERING) += drivers/net/usb/cdc_ether.ko +linux_modules-$(CONFIG_MOBILE_TETHERING) += drivers/net/usb/cdc_ncm.ko +linux_modules-$(CONFIG_MOBILE_TETHERING) += drivers/net/usb/cdc_eem.ko # NVMe driver for winterfell and other servers linux_modules-$(CONFIG_LINUX_NVME) += drivers/nvme/host/nvme.ko @@ -153,7 +158,7 @@ linux_target := \ $(MAKE_JOBS) \ # We cross compile linux now -linux_depends := musl-cross +linux_depends := musl-cross-make # # Linux kernel module installation @@ -211,9 +216,17 @@ $(build)/$(BOARD)/$(LINUX_IMAGE_FILE).bundled: \ @touch $@ # force a timestamp update @sha256sum "$@" | tee -a "$(HASHES)" +# If loadkeys is shipped, include the actual default keymap used by the kernel, +# so loadkeys --default really resets the keymap to the default state. +ifeq "$(CONFIG_KBD_LOADKEYS)" "y" +$(build)/$(linux_base_dir)/drivers/tty/vt/defkeymap.map: $(build)/$(linux_base_dir)/.canary +linux_data += \ + $(build)/$(linux_base_dir)/drivers/tty/vt/defkeymap.map|share/keymaps/defkeymap.map +endif + # modify_and_save_defconfig_in_place target allows us edit current in tree config # under linux decompressed+patched directory through menuconfig -# and put it back in git tree to check changes with git difftool iteratively +# and put it back in git tree to check changes with git difftool iteratively linux.modify_and_save_defconfig_in_place: cp "$(pwd)/$(linux_kconfig)" "$(build)/$(linux_dir)/.config" && \ $(MAKE) \ @@ -272,14 +285,16 @@ linux.save_in_versioned_defconfig_format: savedefconfig \ && mv "$(build)/$(linux_dir)/defconfig" "$(pwd)/$(linux_kconfig)_defconfig_$(CONFIG_LINUX_VERSION)" -linux.save_in_oldconfig_format_in_place: +# This one can be used in kernel version bump, which will accept all new defconfig options for the new version. +# PLEASE VERIFY CHANGES AND KEEP THINGS MINIMAL IN PRs. +linux.save_in_olddefconfig_format_in_place: mkdir -p "$(build)/$(linux_dir)" \ && cp "$(pwd)/$(linux_kconfig)" "$(build)/$(linux_dir)/.config" \ && $(MAKE) -C "$(build)/$(linux_base_dir)" \ O="$(build)/$(linux_dir)" \ ARCH="$(LINUX_ARCH)" \ CROSS_COMPILE="$(CROSS)" \ - oldconfig \ + olddefconfig \ && mv "$(build)/$(linux_dir)/.config" "$(pwd)/$(linux_kconfig)" linux.save_in_versioned_oldconfig: @@ -289,19 +304,20 @@ linux.save_in_versioned_oldconfig: O="$(build)/$(linux_dir)" \ ARCH="$(LINUX_ARCH)" \ CROSS_COMPILE="$(CROSS)" \ - oldefconfig \ + oldconfig \ && mv "$(build)/$(linux_dir)/.config" "$(pwd)/$(linux_kconfig)_oldconfig_$(CONFIG_LINUX_VERSION)" # Prior of attempting to bump kernel version, call make BOARD=xyz linux.save_in_oldconfig_format_in_place # Then bump board config's CONFIG_LINUX_VERSION. build as usual to extract new linux tarball. # Then call make BOARD=xyz linux.prompt_for_new_config_options_for_kernel_version_bump #The following ask new config choice for all new symbols that should be evaluated prior of creating PR -# Tip: Open a browser at https://www.kernelconfig.io/index.html +# Tip: Open a browser at https://www.kernelconfig.io/index.html linux.prompt_for_new_config_options_for_kernel_version_bump: mkdir -p "$(build)/$(linux_dir)" \ && cp "$(pwd)/$(linux_kconfig)" "$(build)/$(linux_dir)/.config" \ && $(MAKE) -C "$(build)/$(linux_base_dir)" \ O="$(build)/$(linux_dir)" \ ARCH="$(LINUX_ARCH)" \ + CROSS_COMPILE="$(CROSS)" \ oldconfig \ && mv "$(build)/$(linux_dir)/.config" "$(pwd)/$(linux_kconfig)" diff --git a/modules/lvm2 b/modules/lvm2 index 4bf9f172b..0306d56dc 100644 --- a/modules/lvm2 +++ b/modules/lvm2 @@ -1,38 +1,44 @@ modules-$(CONFIG_LVM2) += lvm2 -lvm2_version := 2.02.168 +lvm2_version := 2.03.23 lvm2_dir := lvm2.$(lvm2_version) lvm2_tar := LVM2.$(lvm2_version).tgz lvm2_url := https://mirrors.kernel.org/sourceware/lvm2/$(lvm2_tar) -lvm2_hash := 23a3d1cddd41b3ef51812ebf83e9fa491f502fe74130d4263be327a91914660d +lvm2_hash := 74e794a9e9dee1bcf8a2065f65b9196c44fdf321e22d63b98ed7de8c9aa17a5d # cross compiling test assumes malloc/realloc aren't glibc compat # so we force it via the configure cache. lvm2_configure := \ $(CROSS_TOOLS) \ - CFLAGS="-Os" \ - PKG_CONFIG=/bin/false \ - MODPROBE_CMD=/bin/false \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ ./configure \ --host $(MUSL_ARCH)-elf-linux \ - --prefix "/" \ + --prefix "" \ + --libexecdir "/bin" \ + --with-default-pid-dir=/run \ + --with-default-dm-run-dir=/run \ + --with-default-run-dir=/run/lvm \ + --with-optimisation=-Os \ --enable-devmapper \ --disable-selinux \ - --disable-udev-systemd-background-jobs \ + --without-systemd \ + --disable-lvmimportvdo \ --disable-realtime \ + --disable-dmfilemapd \ --disable-dmeventd \ - --disable-lvmetad \ --disable-lvmpolld \ + --disable-readline \ + --disable-udev_sync \ + --enable-static_link \ --disable-use-lvmlockd \ - --disable-use-lvmetad \ --disable-use-lvmpolld \ - --disable-blkid_wiping \ + --disable-dmfilemapd \ --disable-cmirrord \ --disable-cache_check_needs_check \ --disable-thin_check_needs_check \ --with-cluster=none \ + --with-thin-check= \ # not sure why LIB_SUFFIX is not defined in the cross build lvm2_target := \ @@ -48,10 +54,10 @@ lvm2_target := \ DESTDIR="$(INSTALL)" \ install_device-mapper \ -lvm2_libraries := libdm/libdevmapper.so.1.02 +lvm2_libraries := libdm/ioctl/libdevmapper.so.1.02 lvm2_output := \ - tools/dmsetup \ + ./libdm/dm-tools/dmsetup \ tools/lvm \ -lvm2_depends := util-linux $(musl_dep) +lvm2_depends := util-linux libaio $(musl_dep) diff --git a/modules/msrtools b/modules/msrtools index 8a9b6b5b2..25d2a3bc8 100644 --- a/modules/msrtools +++ b/modules/msrtools @@ -13,6 +13,7 @@ msrtools_url := https://github.com/osresearch/msr-tools/archive/$(msrtools_versi msrtools_hash := 80554790d0a404205fe215c9ae8d2de159e980ec23821d636f201f12550e6ac0 msrtools_target := \ + $(MAKE_JOBS) \ $(CROSS_TOOLS) \ CFLAGS="-I$(INSTALL)/include" \ LDFLAGS="-L$(INSTALL)/lib" \ diff --git a/modules/musl-cross b/modules/musl-cross-make similarity index 51% rename from modules/musl-cross rename to modules/musl-cross-make index 9c601cc45..e4662e8ba 100644 --- a/modules/musl-cross +++ b/modules/musl-cross-make @@ -2,13 +2,13 @@ CONFIG_MUSL ?= y ifeq "$(MUSL_CROSS_ONCE)" "" MUSL_CROSS_ONCE := 1 -modules-$(CONFIG_MUSL) += musl-cross +modules-$(CONFIG_MUSL) += musl-cross-make -musl-cross_version := 38e52db8358c043ae82b346a2e6e66bc86a53bc1 -musl-cross_dir := musl-cross-$(musl-cross_version) -musl-cross_url := https://github.com/richfelker/musl-cross-make/archive/$(musl-cross_version).tar.gz -musl-cross_tar := musl-cross-$(musl-cross_version).tar.gz -musl-cross_hash := b4b85d6d3ddab0f2b8650a53e775673f8c346fa2fb07d652a9880bd206ade100 +musl-cross-make_version := fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c +musl-cross-make_dir := musl-cross-make-$(musl-cross-make_version) +musl-cross-make_url := https://github.com/richfelker/musl-cross-make/archive/$(musl-cross-make_version).tar.gz +musl-cross-make_tar := musl-cross-make-$(musl-cross-make_version).tar.gz +musl-cross-make_hash := 15b8e0a287d738a46e069e90d67a8d96213b357b79aaf3e8cf0cd40e4b230d9e ifneq "$(CROSS)" "" @@ -20,42 +20,42 @@ else $(info Using $(CROSS)gcc) endif -# The cross compiler has already been built, so the musl-cross target +# The cross compiler has already been built, so the musl-cross-make target # is a NOP. We really don't need to check out this code tree, but it is easier # if we have a target for it. -musl-cross_target := --version +musl-cross-make_target := --version # Ask the compiler where to find its own libc.so -musl-cross_libraries := \ +musl-cross-make_libraries := \ $(shell $(CROSS)gcc --print-file-name=libc.so) \ else # Force a full build of the cross compiler for target platform # No need to build i386 for x86 since coreboot uses its own compiler -musl-cross_configure := \ +musl-cross-make_configure := \ echo -e >> Makefile 'musl-target:' ; \ - echo -e >> Makefile '\t$$$$(MAKE) TARGET="$(MUSL_ARCH)-linux-musl" install' ; + echo -e >> Makefile '\t$$(MAKE) TARGET="$(MUSL_ARCH)-linux-musl" install' ; CROSS_PATH ?= $(pwd)/crossgcc/$(CONFIG_TARGET_ARCH) -musl-cross_target := \ +musl-cross-make_target := \ OUTPUT="$(CROSS_PATH)" \ MAKE="$(MAKE)" \ $(MAKE_JOBS) \ "musl-target" CROSS := $(CROSS_PATH)/bin/$(subst -,_,$(MUSL_ARCH))-linux-musl- -musl-cross_libraries := $(CROSS_PATH)/$(subst -,_,$(MUSL_ARCH))-linux-musl/lib/libc.so +musl-cross-make_libraries := $(CROSS_PATH)/$(subst -,_,$(MUSL_ARCH))-linux-musl/lib/libc.so endif -musl-cross_output := $(CROSS)gcc +musl-cross-make_output := $(CROSS)gcc ## Fake a target so that musl will force a header install by the ## Linux kernel sources. -$(build)/$(musl-cross_dir)/.build: $(INSTALL)/include/linux/limits.h +$(build)/$(musl-cross-make_dir)/.build: $(INSTALL)/include/linux/limits.h endif diff --git a/modules/ncurses b/modules/ncurses new file mode 100644 index 000000000..aee73e29e --- /dev/null +++ b/modules/ncurses @@ -0,0 +1,28 @@ +modules-$(CONFIG_NEWT) += ncurses + +ncurses_depends := $(musl_dep) + +ncurses_version := 6.5 +ncurses_dir := ncurses-$(ncurses_version) +ncurses_tar := ncurses-$(ncurses_version).tar.gz +ncurses_url := https://invisible-island.net/archives/ncurses/ncurses-$(ncurses_version).tar.gz +ncurses_hash := 136d91bc269a9a5785e5f9e980bc76ab57428f604ce3e5a5a90cebc767971cc6 + +ncurses_configure := \ + CFLAGS="-Os" ./configure \ + $(CROSS_TOOLS) \ + --host $(MUSL_ARCH)-elf-linux \ + --without-ada \ + --without-cxx \ + --without-cxx-binding \ + --without-manpages \ + --without-shared + +# Build and install ncurses data +ncurses_target := $(MAKE_JOBS) \ + $(CROSS_TOOLS) \ + DESTDIR="$(INSTALL)" \ + install.data + +# Specify terminfo file for data.cpio if ncurses is enabled +ncurses_data += $(INSTALL)/usr/lib/terminfo/l/linux|etc/terminfo/l/linux diff --git a/modules/newt b/modules/newt index 3cd37658e..10fd91be8 100644 --- a/modules/newt +++ b/modules/newt @@ -1,17 +1,16 @@ modules-$(CONFIG_NEWT) += newt -newt_depends := popt slang $(musl_dep) +newt_depends := popt slang ncurses $(musl_dep) -newt_version := 0.52.20 +newt_version := 0.52.24 newt_dir := newt-$(newt_version) newt_tar := newt-$(newt_version).tar.gz newt_url := https://releases.pagure.org/newt/$(newt_tar) -newt_hash := 8d66ba6beffc3f786d4ccfee9d2b43d93484680ef8db9397a4fb70b5adbb6dbc +newt_hash := 5ded7e221f85f642521c49b1826c8de19845aa372baf5d630a51774b544fbdbb newt_target := \ #We remove Makefile passed number of jobs to only pass one job, otherwise fails to build #$(MAKE_JOBS) \ - -j1 \ $(CROSS_TOOLS) \ newt_output := \ @@ -23,6 +22,6 @@ newt_libraries := \ newt_configure := \ ./autogen.sh && CFLAGS="-Os" ./configure \ $(CROSS_TOOLS) \ - --prefix "/" \ --host $(MUSL_ARCH)-elf-linux \ + --prefix "/" \ --without-tcl diff --git a/modules/nitrokey-blobs b/modules/nitrokey-blobs deleted file mode 100644 index eafef4004..000000000 --- a/modules/nitrokey-blobs +++ /dev/null @@ -1,12 +0,0 @@ -modules-$(CONFIG_NITROKEY_BLOBS) += nitrokey-blobs - -nitrokey-blobs_base_dir := nitrokey-blobs -nitrokey-blobs_version := b629bad31046ff2f5f363656326646fe2081d033 -nitrokey-blobs_tar := nitrokey-blobs-${nitrokey-blobs_version}.tar.gz -nitrokey-blobs_tar_opt := --strip 1 -nitrokey-blobs_url := https://github.com/Nitrokey/firmware-blobs/archive/${nitrokey-blobs_version}.tar.gz -nitrokey-blobs_hash := 73daf2180e3ffd070e9dc80c84ccd2573a24f636dc273e3d9fe81aefc7c5d425 - -## there is nothing to be built -nitrokey-blobs_output := .built -nitrokey-blobs_configure := echo -e 'all:\n\ttouch .built' > Makefile diff --git a/modules/npth b/modules/npth index b6bdb79db..1bbec1c03 100644 --- a/modules/npth +++ b/modules/npth @@ -11,7 +11,6 @@ npth_configure := ./configure \ --host $(MUSL_ARCH)-linux-musl \ --prefix "/" \ --disable-static \ - --with-gpg-error-prefix="$(INSTALL)" \ npth_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/openssl b/modules/openssl index 0c4c93f46..8bca5eaf7 100644 --- a/modules/openssl +++ b/modules/openssl @@ -7,18 +7,13 @@ openssl_tar := openssl-$(openssl_version).tar.gz openssl_url := https://www.openssl.org/source/$(openssl_tar) openssl_hash := 6c13d2bf38fdf31eac3ce2a347073673f5d63263398f1f69d0df4a41253e4b3e -# hack to provide path to libgcc -LIBGCC_DIR := $(dir $(shell $(heads_cc) -print-libgcc-file-name)) - # The only optional algorithm that's enabled is SM3. tpm2-tss uses SHA, AES, # and SM3. openssl_configure := \ $(CROSS_TOOLS) \ CFLAGS="-Os" \ - LDFLAGS="-L$(LIBGCC_DIR)" \ ./Configure \ --prefix="/" \ - no-tests \ linux-$(strip $(arch)) \ no-aria \ no-bf \ @@ -46,6 +41,7 @@ openssl_configure := \ no-siv \ no-sm2 \ no-sm4 \ + no-tests \ no-whirlpool \ openssl_target := $(MAKE_JOBS) \ diff --git a/modules/pinentry b/modules/pinentry index 7fa92cdfe..86ab96b6a 100644 --- a/modules/pinentry +++ b/modules/pinentry @@ -19,19 +19,18 @@ pinentry_configure := \ ./configure \ --host $(MUSL_ARCH)-linux-musl \ --prefix "/" \ - --enable-pinentry-tty \ - --disable-libsecret \ --disable-fallback-curses \ + --disable-libsecret \ --disable-pinentry-curses \ - --disable-pinentry-qt \ - --disable-pinentry-gtk2 \ - --disable-pinentry-gnome3 \ - --disable-pinentry-fltk \ --disable-pinentry-emacs \ - --disable-fallback-curses \ + --disable-pinentry-fltk \ + --disable-pinentry-gnome3 \ + --disable-pinentry-gtk2 \ + --disable-pinentry-qt \ --disable-pinentry-qt5 \ - --with-gpg-error-prefix="$(INSTALL)" \ + --enable-pinentry-tty \ --with-libassuan-prefix="$(INSTALL)" \ + --with-libgpg-error-prefix="$(INSTALL)" \ # Run one build to generate the executables with the pre-defined # exec_prefix and datarootdir, then a second make to install the binaries diff --git a/modules/popt b/modules/popt index 9a0ec319b..6e24422d6 100644 --- a/modules/popt +++ b/modules/popt @@ -8,9 +8,8 @@ popt_hash := c25a4838fc8e4c1c8aacb8bd620edb3084a3d63bf8987fdad3ca2758c63240f9 popt_configure := ./configure \ $(CROSS_TOOLS) \ - --prefix "/" \ --host $(MUSL_ARCH)-elf-linux \ - + --prefix "/" \ popt_target := \ $(MAKE_JOBS) \ diff --git a/modules/powerpc-utils b/modules/powerpc-utils index dc19d13f6..5526afd8b 100644 --- a/modules/powerpc-utils +++ b/modules/powerpc-utils @@ -13,8 +13,8 @@ powerpc-utils_configure := \ ./configure \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ + --without-librtas \ --without-systemd \ - --without-librtas powerpc-utils_target := \ $(MAKE_JOBS) \ diff --git a/modules/qrencode b/modules/qrencode index 565b98f64..fbfbb870c 100644 --- a/modules/qrencode +++ b/modules/qrencode @@ -12,9 +12,9 @@ qrencode_configure := \ CFLAGS="-Os" \ ./configure \ $(CROSS_TOOLS) \ + --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ --without-tools \ - --host $(MUSL_ARCH)-elf-linux \ qrencode_target := \ $(MAKE_JOBS) \ diff --git a/modules/slang b/modules/slang index 91c57402d..6a8f5d3c5 100644 --- a/modules/slang +++ b/modules/slang @@ -1,20 +1,21 @@ modules-$(CONFIG_SLANG) += slang -slang_version := 2.3.1a +slang_version := 2.3.3 slang_dir := slang-$(slang_version) slang_tar := slang-$(slang_version).tar.bz2 slang_url := https://www.jedsoft.org/releases/slang/$(slang_tar) -slang_hash := 54f0c3007fde918039c058965dffdfd6c5aec0bad0f4227192cc486021f08c36 +slang_hash := f9145054ae131973c61208ea82486d5dd10e3c5cdad23b7c4a0617743c8f5a18 slang_configure := ./configure \ $(CROSS_TOOLS) \ - ac_cv_path_nc5config=no \ - --prefix "/" \ + ac_cv_path_nc5config=ncurses-config \ --host $(MUSL_ARCH)-elf-linux \ - --with-z=no \ - --with-png=no \ - --with-pcre=no \ + --prefix "/" \ --with-onig=no \ + --with-pcre=no \ + --with-png=no \ + --with-z=no \ + --disable-termcap \ && mkdir -p src/elfobjs # Disable parallel make for the install target diff --git a/modules/tpm2-tools b/modules/tpm2-tools index 98711195a..0051a28a1 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -8,23 +8,30 @@ ifeq "$(CONFIG_TPM2_TOOLS)" "y" export CONFIG_TPM=y endif -tpm2-tools_version := 5.2 -#tpm2-tools_version := 78a7681 -#tpm2-tools_repo := https://github.com/tpm2-software/tpm2-tools.git +tpm2-tools_version := 5.6 tpm2-tools_dir := tpm2-tools-$(tpm2-tools_version) tpm2-tools_tar := tpm2-tools-$(tpm2-tools_version).tar.gz tpm2-tools_url := https://github.com/tpm2-software/tpm2-tools/releases/download/$(tpm2-tools_version)/$(tpm2-tools_tar) -tpm2-tools_hash := c0b402f6a7b3456e8eb2445211e2d41c46c7e769e05fe4d8909ff64119f7a630 +tpm2-tools_hash := 52c8bcbaadca082abfe5eb7ee4967d2d632d84b1677675f2f071b6d2ec22cec3 -# we have ESYS 3.0, but it doesn't figure that out on its own -tpm2-tools_configure := ./bootstrap && ./configure \ +#tpm2-tools 5.6 adds release version based on git, while tarball downloaded doesn't include any .git +# the patch comments out git output to ./VERSION, and we fill it here based on this Makefile's version +#tpm2-tools doesn't play nice with reproducible builds, hardcoding lib paths without providing a configure option to remove rpaths +# We make sure no hardcoding of libdir flags exist in configure script prior of calling the script with sed call +# We pass additional remapping of prefix-map from $INSTALL to local dir +# +# TODO: remove all patches and uniformize with similar sed calls. +tpm2-tools_configure := \ + echo "$(tpm2-tools_version)" > ./VERSION \ + && ./bootstrap \ + && sed -i 's/hardcode_libdir_flag_spec=.*/hardcode_libdir_flag_spec=" "/' configure \ + && ./configure \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ --disable-fapi \ - TSS2_ESYS_3_0_CFLAGS="-I$(INSTALL)/include" \ - TSS2_ESYS_3_0_LIBS="-ltss2-esys" \ + --with-sysroot=$(INSTALL) \ tpm2-tools_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/tpm2-tss b/modules/tpm2-tss index 0fad79ef5..91e1a26cd 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -1,22 +1,33 @@ # TPM2 TSS library modules-$(CONFIG_TPM2_TSS) += tpm2-tss -tpm2-tss_version := 3.2.0 +tpm2-tss_version := 3.2.2 tpm2-tss_dir := tpm2-tss-$(tpm2-tss_version) tpm2-tss_tar := tpm2-tss-$(tpm2-tss_version).tar.gz tpm2-tss_url := https://github.com/tpm2-software/tpm2-tss/releases/download/$(tpm2-tss_version)/$(tpm2-tss_tar) -tpm2-tss_hash := 48305e4144dcf6d10f3b25b7bccf0189fd2d1186feafd8cd68c6b17ecf0d7912 +tpm2-tss_hash := ba9e52117f254f357ff502e7d60fce652b3bfb26327d236bbf5ab634235e40f1 +#Repro checks: +# find build/x86/tpm2-tss-3.2.2/src/*/.libs/libtss2-*so* | while read file; do echo "library $file:"; strings $file|grep heads; done +# Should not return any result + +#NEEDED otherwise output on previous command +#sed -i 's/hardcode_into_libs=yes/hardcode_into_libs=no/g' configure +# needed otherwise library build/x86/tpm2-tss-3.2.2/src/tss2-tcti/.libs/libtss2-tcti-pcap.so.0.0.0: +# contains: /home/user/heads/build/x86/tpm2-tss-3.2.2/src/tss2-tcti/.libs:/home/user/heads/build/x86/tpm2-tss-3.2.2/src/tss2-mu/.libs://lib tpm2-tss_configure := aclocal && automake --add-missing && autoreconf -fi \ + && sed -i 's/hardcode_into_libs=yes/hardcode_into_libs=no/g' configure \ && ./configure \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ + --with-sysroot=$(INSTALL) \ --disable-doxygen-doc \ + --disable-doxygen-html \ --disable-doxygen-man \ --disable-doxygen-rtf \ - --disable-doxygen-html \ --disable-fapi \ + --disable-static \ # Run one build to generate the executables with the pre-defined # exec_prefix and datarootdir, then a second make to install the binaries diff --git a/modules/tpmtotp b/modules/tpmtotp index 57b3c54ae..eb52f03c6 100644 --- a/modules/tpmtotp +++ b/modules/tpmtotp @@ -10,6 +10,7 @@ tpmtotp_hash := eaac1e8f652f1da7f5a1ed6a8cfefb6511f1e5e1dabf93b44db3b29c18c5ae53 tpmtotp_target := \ $(CROSS_TOOLS) \ + $(MAKE_JOBS) \ CFLAGS="-I$(INSTALL)/include -Os" \ LDFLAGS="-L$(INSTALL)/lib" \ diff --git a/modules/util-linux b/modules/util-linux index 804ae56ea..bb359d74d 100644 --- a/modules/util-linux +++ b/modules/util-linux @@ -1,10 +1,10 @@ modules-$(CONFIG_UTIL_LINUX) += util-linux -util-linux_version := 2.29.2 +util-linux_version := 2.39 util-linux_dir := util-linux-$(util-linux_version) util-linux_tar := util-linux-$(util-linux_version).tar.xz -util-linux_url := https://www.kernel.org/pub/linux/utils/util-linux/v2.29/$(util-linux_tar) -util-linux_hash := accea4d678209f97f634f40a93b7e9fcad5915d1f4749f6c47bee6bf110fe8e3 +util-linux_url := https://www.kernel.org/pub/linux/utils/util-linux/v2.39/$(util-linux_tar) +util-linux_hash := 32b30a336cda903182ed61feb3e9b908b762a5e66fe14e43efb88d37162075cb util-linux_configure := \ $(CROSS_TOOLS) \ @@ -13,16 +13,16 @@ util-linux_configure := \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ --oldincludedir "$(INSTALL)/include" \ + --disable-all-programs \ + --disable-bash-completion \ + --enable-agetty \ + --enable-libblkid \ + --enable-libuuid \ --without-ncurses \ --without-ncursesw \ + --without-python \ --without-tinfo \ --without-udev \ - --without-python \ - --disable-bash-completion \ - --disable-all-programs \ - --enable-libuuid \ - --enable-libblkid \ - --enable-agetty \ util-linux_target := \ diff --git a/patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch b/patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch new file mode 100644 index 000000000..7208d5ebc --- /dev/null +++ b/patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch @@ -0,0 +1,111421 @@ +From b598d05d389e137baa10e277a37fca2c363fb295 Mon Sep 17 00:00:00 2001 +From: Nigel Tao +Date: Tue, 13 Aug 2024 22:10:52 +1000 +Subject: [PATCH] vc/wuffs: upgrade to Wuffs 0.4.0-alpha.8 + +We were previously at Wuffs 0.4.0-alpha.2. The C file was copied from +https://github.com/google/wuffs-mirror-release-c and its hash matches +https://github.com/google/wuffs-mirror-release-c/blob/90e4d81a6a8b7b601e8e568da32a105d7f7705e5/sync.txt#L9-L10 + +$ sha256sum src/vendorcode/wuffs/wuffs-v0.4.c +6c22caff4af929112601379a73f72461bc4719a5215366bcc90d599cbc442bb6 src/vendorcode/wuffs/wuffs-v0.4.c + +Change-Id: Ie90d989384e0db2b23d7d1b3d9a57920ac8a95a2 +Signed-off-by: Nigel Tao +Reviewed-on: https://review.coreboot.org/c/coreboot/+/83894 +Reviewed-by: Felix Singer +Reviewed-by: Nico Huber +Tested-by: build bot (Jenkins) +--- + src/vendorcode/wuffs/wuffs-v0.4.c | 101194 ++++++++++++++++----------- + 1 file changed, 58878 insertions(+), 42316 deletions(-) + +diff --git a/src/vendorcode/wuffs/wuffs-v0.4.c b/src/vendorcode/wuffs/wuffs-v0.4.c +index bce9eb9798..0c6616a652 100644 +--- a/src/vendorcode/wuffs/wuffs-v0.4.c ++++ b/src/vendorcode/wuffs/wuffs-v0.4.c +@@ -81,15 +81,43 @@ extern "C" { + // each major.minor branch, the commit count should increase monotonically. + // + // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision +-// ae8531f7f846fbbe3a7340bf88499ad294a1367b committed on 2023-10-07. ++// 5d69840f8e7ca481551b02c7e8d4c5fb69521bb9 committed on 2024-08-12. + #define WUFFS_VERSION 0x000040000 + #define WUFFS_VERSION_MAJOR 0 + #define WUFFS_VERSION_MINOR 4 + #define WUFFS_VERSION_PATCH 0 +-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.2" +-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3603 +-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20231007 +-#define WUFFS_VERSION_STRING "0.4.0-alpha.2+3603.20231007" ++#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.8" ++#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3796 ++#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240812 ++#define WUFFS_VERSION_STRING "0.4.0-alpha.8+3796.20240812" ++ ++// ---------------- Private Implementation Macros Re-definition Check ++ ++// Users (those who #include the "wuffs-vM.N.c" file) should not define any ++// WUFFS_PRIVATE_IMPL__ETC macros, only WUFFS_CONFIG__ETC macros (and ++// WUFFS_IMPLEMENTATION). Mucking about with the private implementation macros ++// is not supported and may break when upgrading to newer Wuffs versions. ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8) ++ ++#if defined(__GNUC__) || defined(__clang__) ++#warning "Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported" ++#elif defined(_MSC_VER) ++#pragma message("Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported") ++#endif ++ ++#endif + + // ---------------- Configuration + +@@ -117,11 +145,11 @@ extern "C" { + // intrinsics. Look for __ARM_FEATURE_CRC32 instead. + #if defined(__ARM_FEATURE_CRC32) + #include +-#define WUFFS_BASE__CPU_ARCH__ARM_CRC32 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32 + #endif // defined(__ARM_FEATURE_CRC32) + #if defined(__ARM_NEON) + #include +-#define WUFFS_BASE__CPU_ARCH__ARM_NEON ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON + #endif // defined(__ARM_NEON) + #endif // defined(__ARM_FEATURE_UNALIGNED) etc + +@@ -129,26 +157,82 @@ extern "C" { + // POPCNT. This is checked at runtime via cpuid, not at compile time. + // + // Likewise, "cpu_arch >= x86_avx2" also requires PCLMUL, POPCNT and SSE4.2. +-#if defined(__i386__) || defined(__x86_64__) ++// ++// ---- ++// ++// Technically, we could use the SSE family on 32-bit x86, not just 64-bit x86. ++// But some intrinsics don't compile in 32-bit mode. It's not worth the hassle. ++// https://github.com/google/wuffs/issues/145 ++#if defined(__x86_64__) + #if !defined(__native_client__) + #include + #include +-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY +-#if defined(__x86_64__) +-#define WUFFS_BASE__CPU_ARCH__X86_64 +-#endif // defined(__x86_64__) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3 + #endif // !defined(__native_client__) +-#endif // defined(__i386__) || defined(__x86_64__) ++#endif // defined(__x86_64__) + + #elif defined(_MSC_VER) // (#if-chain ref AVOID_CPU_ARCH_1) + +-#if defined(_M_IX86) || defined(_M_X64) +-#if defined(__AVX__) || defined(__clang__) ++#if defined(_M_X64) ++ ++// On X86_64, Microsoft Visual C/C++ (MSVC) only supports SSE2 by default. ++// There are /arch:SSE2, /arch:AVX and /arch:AVX2 compiler flags (the AVX2 one ++// is roughly equivalent to X86_64_V3), but there is no /arch:SSE42 compiler ++// flag that's equivalent to X86_64_V2. ++// ++// For getting maximum performance with X86_64 MSVC and Wuffs, pass /arch:AVX2 ++// (and then test on the oldest hardware you intend to support). ++// ++// Absent that compiler flag, either define one of the three macros listed ++// below or else the X86_64 SIMD code will be disabled and you'll get a #pragma ++// message stating this library "performs best with /arch:AVX2". This message ++// is harmless and ignorable, in that the non-SIMD code is still correct and ++// reasonably performant, but is a reminder that when combining Wuffs and MSVC, ++// some compiler configuration is required for maximum performance. ++// ++// - WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY ++// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2 (enables SSE4.2 and below) ++// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3 (enables AVX2 and below) ++// ++// Defining the first one (WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++// or defining none of those three (the default state) are equivalent (in that ++// both disable the SIMD code paths), other than that pragma message. ++// ++// When defining these WUFFS_CONFIG__ENABLE_ETC macros with MSVC, be aware that ++// some users report it leading to ICEs (Internal Compiler Errors), but other ++// users report no problems at all (and improved performance). It's unclear ++// exactly what combination of SIMD code and MSVC configuration lead to ICEs. ++// Do your own testing with your own MSVC version and configuration. ++// ++// https://github.com/google/wuffs/issues/148 ++// https://github.com/google/wuffs/issues/151 ++// https://developercommunity.visualstudio.com/t/fatal--error-C1001:-Internal-compiler-er/10703305 ++// ++// Clang (including clang-cl) and GCC don't need this WUFFS_CONFIG__ETC macro ++// machinery, or having the Wuffs-the-library user to fiddle with compiler ++// flags, because they support "__attribute__((target(arg)))". ++#if defined(__AVX2__) || defined(__clang__) || \ ++ defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3 ++#elif defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#elif !defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++#pragma message("Wuffs with MSVC+X64 performs best with /arch:AVX2") ++#endif // defined(__AVX2__) || defined(__clang__) || etc ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ++ ++#if defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++#error "MSVC_CPU_ARCH simultaneously enabled and disabled" ++#endif + +-// We need for the __cpuid function. + #include +-// That's not enough for X64 SIMD, with clang-cl, if we want to use ++// intrin.h isn't enough for X64 SIMD, with clang-cl, if we want to use + // "__attribute__((target(arg)))" without e.g. "/arch:AVX". + // + // Some web pages suggest that is all you need, as it pulls in +@@ -157,25 +241,9 @@ extern "C" { + #include // AVX, AVX2, FMA, POPCNT + #include // SSE4.2 + #include // AES, PCLMUL +-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY +-#if defined(_M_X64) +-#define WUFFS_BASE__CPU_ARCH__X86_64 +-#endif // defined(_M_X64) +- +-#else // defined(__AVX__) || defined(__clang__) +- +-// clang-cl (which defines both __clang__ and _MSC_VER) supports +-// "__attribute__((target(arg)))". +-// +-// For MSVC's cl.exe (unlike clang or gcc), SIMD capability is a compile-time +-// property of the source file (e.g. a /arch:AVX or -mavx compiler flag), not +-// of individual functions (that can be conditionally selected at runtime). +-#pragma message("Wuffs with MSVC+IX86/X64 needs /arch:AVX for best performance") +- +-#endif // defined(__AVX__) || defined(__clang__) +-#endif // defined(_M_IX86) || defined(_M_X64) + ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ++#endif // defined(_M_X64) + #endif // (#if-chain ref AVOID_CPU_ARCH_1) + #endif // (#if-chain ref AVOID_CPU_ARCH_0) + +@@ -198,20 +266,20 @@ extern "C" { + + static inline bool // + wuffs_base__cpu_arch__have_arm_crc32(void) { +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + return true; + #else + return false; +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + } + + static inline bool // + wuffs_base__cpu_arch__have_arm_neon(void) { +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + return true; + #else + return false; +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + } + + static inline bool // +@@ -220,7 +288,7 @@ wuffs_base__cpu_arch__have_x86_avx2(void) { + defined(__AVX2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_AVX2 = (1 << 5) + const unsigned int avx2_ebx7 = 0x00000020; +@@ -258,9 +326,9 @@ wuffs_base__cpu_arch__have_x86_avx2(void) { + } + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) && + // defined(__AVX2__) +@@ -271,7 +339,7 @@ wuffs_base__cpu_arch__have_x86_bmi2(void) { + #if defined(__BMI2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_BMI2 = (1 << 8) + const unsigned int bmi2_ebx7 = 0x00000100; +@@ -293,9 +361,9 @@ wuffs_base__cpu_arch__have_x86_bmi2(void) { + return true; + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__BMI2__) + } +@@ -305,7 +373,7 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + #if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_PCLMUL = (1 << 1) + // - bit_POPCNT = (1 << 23) +@@ -329,9 +397,9 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + return true; + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) + } +@@ -350,9 +418,15 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + // The "defined(__clang__)" isn't redundant. While vanilla clang defines + // __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. + #if defined(__GNUC__) || defined(__clang__) ++#define WUFFS_BASE__FORCE_INLINE __attribute__((__always_inline__)) + #define WUFFS_BASE__POTENTIALLY_UNUSED __attribute__((unused)) + #define WUFFS_BASE__WARN_UNUSED_RESULT __attribute__((warn_unused_result)) ++#elif defined(_MSC_VER) ++#define WUFFS_BASE__FORCE_INLINE __forceinline ++#define WUFFS_BASE__POTENTIALLY_UNUSED ++#define WUFFS_BASE__WARN_UNUSED_RESULT + #else ++#define WUFFS_BASE__FORCE_INLINE + #define WUFFS_BASE__POTENTIALLY_UNUSED + #define WUFFS_BASE__WARN_UNUSED_RESULT + #endif +@@ -415,6 +489,37 @@ struct wuffs_unique_ptr_deleter { + + // -------- + ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++ ++static inline uint8_t* // ++wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) { ++ return (uint8_t*)ptr; ++} ++ ++static inline uint16_t* // ++wuffs_base__strip_const_from_u16_ptr(const uint16_t* ptr) { ++ return (uint16_t*)ptr; ++} ++ ++static inline uint32_t* // ++wuffs_base__strip_const_from_u32_ptr(const uint32_t* ptr) { ++ return (uint32_t*)ptr; ++} ++ ++static inline uint64_t* // ++wuffs_base__strip_const_from_u64_ptr(const uint64_t* ptr) { ++ return (uint64_t*)ptr; ++} ++ ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ ++// -------- ++ + // wuffs_base__empty_struct is used when a Wuffs function returns an empty + // struct. In C, if a function f returns void, you can't say "x = f()", but in + // Wuffs, if a function g returns empty, you can say "y = g()". +@@ -483,6 +588,7 @@ extern const char wuffs_base__suspension__even_more_information[]; + extern const char wuffs_base__suspension__mispositioned_read[]; + extern const char wuffs_base__suspension__mispositioned_write[]; + extern const char wuffs_base__suspension__short_read[]; ++extern const char wuffs_base__suspension__short_workbuf[]; + extern const char wuffs_base__suspension__short_write[]; + extern const char wuffs_base__error__bad_i_o_position[]; + extern const char wuffs_base__error__bad_argument_length_too_short[]; +@@ -496,9 +602,11 @@ extern const char wuffs_base__error__bad_vtable[]; + extern const char wuffs_base__error__bad_workbuf_length[]; + extern const char wuffs_base__error__bad_wuffs_version[]; + extern const char wuffs_base__error__cannot_return_a_suspension[]; ++extern const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[]; + extern const char wuffs_base__error__disabled_by_previous_error[]; + extern const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[]; + extern const char wuffs_base__error__initialize_not_called[]; ++extern const char wuffs_base__error__insufficient_history[]; + extern const char wuffs_base__error__interleaved_coroutine_calls[]; + extern const char wuffs_base__error__no_more_information[]; + extern const char wuffs_base__error__not_enough_data[]; +@@ -728,6 +836,9 @@ typedef struct wuffs_base__transform__output__struct { + // Lempel–Ziv 4. + #define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420 + ++// Lzip. ++#define WUFFS_BASE__FOURCC__LZIP 0x4C5A4950 ++ + // Lempel–Ziv Markov-chain Algorithm. + #define WUFFS_BASE__FOURCC__LZMA 0x4C5A4D41 + +@@ -839,6 +950,8 @@ typedef struct wuffs_base__transform__output__struct { + + #define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1 + ++#define WUFFS_BASE__QUIRK_QUALITY 2 ++ + // -------- + + // Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a +@@ -1092,6 +1205,96 @@ wuffs_base__multiply_u64(uint64_t x, uint64_t y) { + + // -------- + ++typedef struct wuffs_base__bitvec256__struct { ++ // elements_u64[0] holds the LSBs (least significant bits) and ++ // elements_u64[3] holds the MSBs (most significant bits). ++ uint64_t elements_u64[4]; ++} wuffs_base__bitvec256; ++ ++static inline wuffs_base__bitvec256 // ++wuffs_base__make_bitvec256(uint64_t e00, ++ uint64_t e01, ++ uint64_t e02, ++ uint64_t e03) { ++ wuffs_base__bitvec256 res; ++ res.elements_u64[0] = e00; ++ res.elements_u64[1] = e01; ++ res.elements_u64[2] = e02; ++ res.elements_u64[3] = e03; ++ return res; ++} ++ ++static inline uint64_t // ++wuffs_base__bitvec256__get_u64(const wuffs_base__bitvec256* b, uint32_t i) { ++ return b->elements_u64[i & 3]; ++} ++ ++// -------- ++ ++// wuffs_base__optional_u63 is like a std::optional, but for C (not ++// just C++) and the value can only hold 63 bits (not 64). ++// ++// Do not manipulate repr directly; it is a private implementation detail. ++typedef struct wuffs_base__optional_u63__struct { ++ uint64_t repr; ++ ++#ifdef __cplusplus ++ inline bool has_value() const; ++ inline uint64_t value() const; ++ inline uint64_t value_or(uint64_t default_value) const; ++#endif // __cplusplus ++ ++} wuffs_base__optional_u63; ++ ++// wuffs_base__make_optional_u63 ignores value when has_value is false. ++// ++// Preconditions: ++// - value < (1 << 63). ++static inline wuffs_base__optional_u63 // ++wuffs_base__make_optional_u63(bool has_value, uint64_t value) { ++ wuffs_base__optional_u63 res; ++ res.repr = has_value ? ((value << 1u) | 1u) : 0u; ++ return res; ++} ++ ++static inline bool // ++wuffs_base__optional_u63__has_value(const wuffs_base__optional_u63* o) { ++ return o->repr; ++} ++ ++// wuffs_base__optional_u63__value returns zero when o does not have a value. ++static inline uint64_t // ++wuffs_base__optional_u63__value(const wuffs_base__optional_u63* o) { ++ return o->repr >> 1u; ++} ++ ++static inline uint64_t // ++wuffs_base__optional_u63__value_or(const wuffs_base__optional_u63* o, ++ uint64_t default_value) { ++ return o->repr ? (o->repr >> 1u) : default_value; ++} ++ ++#ifdef __cplusplus ++ ++inline bool // ++wuffs_base__optional_u63::has_value() const { ++ return wuffs_base__optional_u63__has_value(this); ++} ++ ++inline uint64_t // ++wuffs_base__optional_u63::value() const { ++ return wuffs_base__optional_u63__value(this); ++} ++ ++inline uint64_t // ++wuffs_base__optional_u63::value_or(uint64_t default_value) const { ++ return wuffs_base__optional_u63__value_or(this, default_value); ++} ++ ++#endif // __cplusplus ++ ++// -------- ++ + // The "defined(__clang__)" isn't redundant. While vanilla clang defines + // __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. + #if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8) +@@ -1529,7 +1732,7 @@ wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) { + static inline wuffs_base__slice_u8 // + wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u8 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1537,7 +1740,7 @@ wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u16 // + wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u16 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1545,7 +1748,7 @@ wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u32 // + wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u32 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1553,7 +1756,7 @@ wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u64 // + wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u64 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1696,7 +1899,7 @@ wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) { + if ((i <= SIZE_MAX) && (i <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i))); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__slice_u8__subslice_j returns s[:j]. +@@ -1707,7 +1910,7 @@ wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) { + if ((j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr, ((size_t)j)); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__slice_u8__subslice_ij returns s[i:j]. +@@ -1720,7 +1923,7 @@ wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s, + if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i))); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy]. +@@ -1814,6 +2017,20 @@ WUFFS_BASE__MAYBE_STATIC int32_t // + wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, + bool prefix_closed); + ++// ---------------- Quirk Values ++ ++// These constants are the value half of a key-value pair, where the key is ++// WUFFS_BASE__QUIRK_QUALITY. ++// ++// In the Wuffs API, set_quirk takes a u64 value. These macro definitions are ++// likewise unsigned values (uint64_t) but for this particular key, they are ++// best interpreted as signed values (int64_t). "Lower-than-default quality" ++// and "higher-than-default quality", as signed values, are -1 and +1. ++// ++// See doc/note/quirks.md for some more discussion about trade-offs. ++#define WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY UINT64_MAX ++#define WUFFS_BASE__QUIRK_QUALITY__VALUE__HIGHER_QUALITY ((uint64_t)1) ++ + // ---------------- Ranges and Rects + + // See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md +@@ -3011,7 +3228,8 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { + // wuffs_base__io_buffer__compact_retaining moves any written but unread bytes + // closer to the start of the buffer. It retains H bytes of history (the most + // recently read bytes), where H is min(buf->meta.ri, history_retain_length). +-// A postcondition is that buf->meta.ri == H. ++// It is therefore a no-op if history_retain_length is UINT64_MAX. A ++// postcondition is that buf->meta.ri == H. + // + // wuffs_base__io_buffer__compact_retaining(0) is equivalent to + // wuffs_base__io_buffer__compact(). +@@ -3056,7 +3274,7 @@ wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) { + + static inline uint8_t* // + wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) { +- return buf ? (buf->data.ptr + buf->meta.ri) : NULL; ++ return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.ri) : NULL; + } + + static inline uint64_t // +@@ -3066,7 +3284,8 @@ wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) { + + static inline wuffs_base__slice_u8 // + wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) { +- return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri, ++ return (buf && buf->data.ptr) ++ ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri, + buf->meta.wi - buf->meta.ri) + : wuffs_base__empty_slice_u8(); + } +@@ -3078,7 +3297,7 @@ wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) { + + static inline uint8_t* // + wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) { +- return buf ? (buf->data.ptr + buf->meta.wi) : NULL; ++ return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.wi) : NULL; + } + + static inline uint64_t // +@@ -3088,7 +3307,8 @@ wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) { + + static inline wuffs_base__slice_u8 // + wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) { +- return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi, ++ return (buf && buf->data.ptr) ++ ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi, + buf->data.len - buf->meta.wi) + : wuffs_base__empty_slice_u8(); + } +@@ -3183,49 +3403,53 @@ wuffs_base__make_token(uint64_t repr) { + + // -------- + ++// clang-format off ++ ++// -------- ++ + #define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF + +-#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17 +-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17 +-#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42 +-#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42 ++#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17 + #define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38 +-#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17 +-#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16 +-#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0 ++#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17 ++#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16 ++#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0 + +-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46 ++#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBC__FILLER 0 +-#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1 +-#define WUFFS_BASE__TOKEN__VBC__STRING 2 +-#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3 +-#define WUFFS_BASE__TOKEN__VBC__LITERAL 4 +-#define WUFFS_BASE__TOKEN__VBC__NUMBER 5 +-#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6 ++#define WUFFS_BASE__TOKEN__VBC__FILLER 0 ++#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1 ++#define WUFFS_BASE__TOKEN__VBC__STRING 2 ++#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3 ++#define WUFFS_BASE__TOKEN__VBC__LITERAL 4 ++#define WUFFS_BASE__TOKEN__VBC__NUMBER 5 ++#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6 + #define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001 + #define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002 +-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004 + + // COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE. +-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000 + + // -------- + +@@ -3245,11 +3469,11 @@ wuffs_base__make_token(uint64_t repr) { + // + // The lack of any particular bit is conservative: it is valid for all-ASCII + // strings, in a single- or multi-token chain, to have none of these bits set. +-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002 + #define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004 +-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020 ++#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020 + #define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040 + + // CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded) +@@ -3264,22 +3488,22 @@ wuffs_base__make_token(uint64_t repr) { + // When src is the empty string, multiple conversion algorithms are applicable + // (so these bits are not necessarily mutually exclusive), all producing the + // same empty dst string. +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000 + + // -------- + + #define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008 + + // -------- + +@@ -3292,8 +3516,8 @@ wuffs_base__make_token(uint64_t repr) { + // For a source string of "+123" or "-0x9A", only the first two are valid. + // + // For a source string of "123.", only the first one is valid. +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002 + #define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004 + + #define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010 +@@ -3305,11 +3529,15 @@ wuffs_base__make_token(uint64_t repr) { + // "300", which are big-endian, little-endian or text. For binary formats, the + // token length (after adjusting for FORMAT_IGNORE_ETC) discriminates + // e.g. u16 little-endian vs u32 little-endian. +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100 + #define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200 +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400 ++ ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000 ++ ++// -------- + +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000 ++// clang-format on + + // -------- + +@@ -3421,6 +3649,22 @@ wuffs_base__token::length() const { + + // -------- + ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++ ++static inline wuffs_base__token* // ++wuffs_base__strip_const_from_token_ptr(const wuffs_base__token* ptr) { ++ return (wuffs_base__token*)ptr; ++} ++ ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ ++// -------- ++ + typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token; + + static inline wuffs_base__slice_token // +@@ -3574,7 +3818,8 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { + // wuffs_base__token_buffer__compact_retaining moves any written but unread + // tokens closer to the start of the buffer. It retains H tokens of history + // (the most recently read tokens), where H is min(buf->meta.ri, +-// history_retain_length). A postcondition is that buf->meta.ri == H. ++// history_retain_length). It is therefore a no-op if history_retain_length is ++// UINT64_MAX. A postcondition is that buf->meta.ri == H. + // + // wuffs_base__token_buffer__compact_retaining(0) is equivalent to + // wuffs_base__token_buffer__compact(). +@@ -3730,51 +3975,51 @@ wuffs_base__token_buffer::writer_token_position() const { + // + // You can pass the C stdlib's malloc as the malloc_func. + // +-// It returns an empty slice (containing a NULL ptr field) if (num_uxx * +-// sizeof(uintxx_t)) would overflow SIZE_MAX. ++// It returns an empty slice (containing a NULL ptr field) if num_uxx is zero ++// or if (num_uxx * sizeof(uintxx_t)) would overflow SIZE_MAX. + + static inline wuffs_base__slice_u8 // + wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) { +- if (malloc_func && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) { ++ if (malloc_func && num_u8 && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) { + void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t))); + if (p) { + return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8); + } + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + static inline wuffs_base__slice_u16 // + wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) { +- if (malloc_func && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) { ++ if (malloc_func && num_u16 && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) { + void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t))); + if (p) { + return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16); + } + } +- return wuffs_base__make_slice_u16(NULL, 0); ++ return wuffs_base__empty_slice_u16(); + } + + static inline wuffs_base__slice_u32 // + wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) { +- if (malloc_func && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) { ++ if (malloc_func && num_u32 && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) { + void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t))); + if (p) { + return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32); + } + } +- return wuffs_base__make_slice_u32(NULL, 0); ++ return wuffs_base__empty_slice_u32(); + } + + static inline wuffs_base__slice_u64 // + wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) { +- if (malloc_func && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) { ++ if (malloc_func && num_u64 && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) { + void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t))); + if (p) { + return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64); + } + } +- return wuffs_base__make_slice_u64(NULL, 0); ++ return wuffs_base__empty_slice_u64(); + } + + // ---------------- Images +@@ -3838,6 +4083,26 @@ wuffs_base__color_u32_argb_premul__as__color_u8_gray( + return (uint8_t)(weighted_average >> 24); + } + ++static inline uint16_t // ++wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul( ++ wuffs_base__color_u32_argb_premul c) { ++ uint32_t a = 0xFF & (c >> 24); ++ if (a == 0) { ++ return 0; ++ } ++ uint32_t a16 = a * 0x101; ++ ++ uint32_t cr = 0xFF & (c >> 16); ++ cr = (cr * (0x101 * 0xFFFF)) / a16; ++ uint32_t cg = 0xFF & (c >> 8); ++ cg = (cg * (0x101 * 0xFFFF)) / a16; ++ uint32_t cb = 0xFF & (c >> 0); ++ cb = (cb * (0x101 * 0xFFFF)) / a16; ++ ++ uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768; ++ return (uint16_t)((a16 & 0xFF00) | (weighted_average >> 24)); ++} ++ + static inline uint16_t // + wuffs_base__color_u32_argb_premul__as__color_u16_gray( + wuffs_base__color_u32_argb_premul c) { +@@ -4114,49 +4379,53 @@ wuffs_base__make_pixel_format(uint32_t repr) { + // Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid + // wuffs_base__pixel_format values are present. + +-#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000 ++// clang-format off ++ ++#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000 + +-#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008 ++#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008 + +-#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008 +-#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B +-#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B +-#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000008 +-#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000008 ++#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008 ++#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B ++#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B ++#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000088 ++#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000088 + +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888 + +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888 + +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008 +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008 +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008 + +-#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565 +-#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565 ++#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888 + +-#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888 + +-#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888 +-#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888 ++#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888 ++#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888 + +-extern const uint32_t wuffs_base__pixel_format__bits_per_channel[16]; ++// clang-format on ++ ++extern const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16]; + + static inline bool // + wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) { +@@ -4170,10 +4439,14 @@ wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) { + if (((f->repr >> 16) & 0x03) != 0) { + return 0; + } +- return wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 0)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 4)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 8)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 12)]; ++ return wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 0)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 4)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 8)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 12)]; + } + + static inline bool // +@@ -4391,15 +4664,20 @@ wuffs_base__pixel_config__set(wuffs_base__pixel_config* c, + return; + } + if (pixfmt_repr) { +- uint64_t wh = ((uint64_t)width) * ((uint64_t)height); +- // TODO: handle things other than 1 byte per pixel. +- if (wh <= ((uint64_t)SIZE_MAX)) { ++ do { ++#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull ++ uint64_t wh = ((uint64_t)width) * ((uint64_t)height); ++ // TODO: handle things other than 1 byte per pixel. ++ if (wh > ((uint64_t)SIZE_MAX)) { ++ break; ++ } ++#endif + c->private_impl.pixfmt.repr = pixfmt_repr; + c->private_impl.pixsub.repr = pixsub_repr; + c->private_impl.width = width; + c->private_impl.height = height; + return; +- } ++ } while (0); + } + + c->private_impl.pixfmt.repr = 0; +@@ -5117,7 +5395,7 @@ wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) { + tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH); + } + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + static inline wuffs_base__slice_u8 // +@@ -6202,6 +6480,113 @@ struct wuffs_base__hasher_u64__struct { + + // -------- + ++extern const char wuffs_base__hasher_bitvec256__vtable_name[]; ++ ++typedef struct wuffs_base__hasher_bitvec256__func_ptrs__struct { ++ wuffs_base__bitvec256 (*checksum_bitvec256)( ++ const void* self); ++ uint64_t (*get_quirk)( ++ const void* self, ++ uint32_t a_key); ++ wuffs_base__status (*set_quirk)( ++ void* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ wuffs_base__empty_struct (*update)( ++ void* self, ++ wuffs_base__slice_u8 a_x); ++ wuffs_base__bitvec256 (*update_bitvec256)( ++ void* self, ++ wuffs_base__slice_u8 a_x); ++} wuffs_base__hasher_bitvec256__func_ptrs; ++ ++typedef struct wuffs_base__hasher_bitvec256__struct wuffs_base__hasher_bitvec256; ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__checksum_bitvec256( ++ const wuffs_base__hasher_bitvec256* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_bitvec256__get_quirk( ++ const wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_bitvec256__set_quirk( ++ wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_bitvec256__update( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__update_bitvec256( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x); ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_base__hasher_bitvec256__struct { ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable first_vtable; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++#endif ++ ++ inline wuffs_base__bitvec256 ++ checksum_bitvec256() const { ++ return wuffs_base__hasher_bitvec256__checksum_bitvec256(this); ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_base__hasher_bitvec256__get_quirk( ++ this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_base__hasher_bitvec256__set_quirk( ++ this, a_key, a_value); ++ } ++ ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_base__hasher_bitvec256__update( ++ this, a_x); ++ } ++ ++ inline wuffs_base__bitvec256 ++ update_bitvec256( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_base__hasher_bitvec256__update_bitvec256( ++ this, a_x); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_base__hasher_bitvec256__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++// -------- ++ + extern const char wuffs_base__image_decoder__vtable_name[]; + + typedef struct wuffs_base__image_decoder__func_ptrs__struct { +@@ -6225,8 +6610,6 @@ typedef struct wuffs_base__image_decoder__func_ptrs__struct { + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + uint32_t (*num_animation_loops)( + const void* self); + uint64_t (*num_decoded_frame_configs)( +@@ -6291,11 +6674,6 @@ wuffs_base__image_decoder__get_quirk( + const wuffs_base__image_decoder* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__history_retain_length( +- const wuffs_base__image_decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t + wuffs_base__image_decoder__num_animation_loops( +@@ -6398,11 +6776,6 @@ struct wuffs_base__image_decoder__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__image_decoder__history_retain_length(this); +- } +- + inline uint32_t + num_animation_loops() const { + return wuffs_base__image_decoder__num_animation_loops(this); +@@ -6466,11 +6839,11 @@ struct wuffs_base__image_decoder__struct { + extern const char wuffs_base__io_transformer__vtable_name[]; + + typedef struct wuffs_base__io_transformer__func_ptrs__struct { ++ wuffs_base__optional_u63 (*dst_history_retain_length)( ++ const void* self); + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + wuffs_base__status (*set_quirk)( + void* self, + uint32_t a_key, +@@ -6486,17 +6859,17 @@ typedef struct wuffs_base__io_transformer__func_ptrs__struct { + + typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer; + ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_base__io_transformer__dst_history_retain_length( ++ const wuffs_base__io_transformer* self); ++ + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t + wuffs_base__io_transformer__get_quirk( + const wuffs_base__io_transformer* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__history_retain_length( +- const wuffs_base__io_transformer* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status + wuffs_base__io_transformer__set_quirk( +@@ -6531,6 +6904,11 @@ struct wuffs_base__io_transformer__struct { + using unique_ptr = std::unique_ptr; + #endif + ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_base__io_transformer__dst_history_retain_length(this); ++ } ++ + inline uint64_t + get_quirk( + uint32_t a_key) const { +@@ -6538,11 +6916,6 @@ struct wuffs_base__io_transformer__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__io_transformer__history_retain_length(this); +- } +- + inline wuffs_base__status + set_quirk( + uint32_t a_key, +@@ -6583,8 +6956,6 @@ typedef struct wuffs_base__token_decoder__func_ptrs__struct { + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + wuffs_base__status (*set_quirk)( + void* self, + uint32_t a_key, +@@ -6609,11 +6980,6 @@ wuffs_base__token_decoder__get_quirk( + const wuffs_base__token_decoder* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__history_retain_length( +- const wuffs_base__token_decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status + wuffs_base__token_decoder__set_quirk( +@@ -6656,11 +7022,6 @@ struct wuffs_base__token_decoder__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__token_decoder__history_retain_length(this); +- } +- + inline wuffs_base__status + set_quirk( + uint32_t a_key, +@@ -6918,9 +7279,7 @@ extern const char wuffs_bmp__error__unsupported_bmp_file[]; + + // ---------------- Public Consts + +-#define WUFFS_BMP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +@@ -7053,11 +7412,6 @@ wuffs_bmp__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__history_retain_length( +- const wuffs_bmp__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_bmp__decoder__workbuf_len( +@@ -7116,14 +7470,14 @@ struct wuffs_bmp__decoder__struct { + bool f_rle_padded; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_read_palette[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_tell_me_more; ++ uint32_t p_read_palette; + } private_impl; + + struct { +@@ -7132,14 +7486,14 @@ struct wuffs_bmp__decoder__struct { + + struct { + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_read_palette[1]; ++ } s_read_palette; + } private_data; + + #ifdef __cplusplus +@@ -7283,11 +7637,6 @@ struct wuffs_bmp__decoder__struct { + return wuffs_bmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_bmp__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_bmp__decoder__workbuf_len(this); +@@ -7316,9 +7665,9 @@ extern const char wuffs_bzip2__error__unsupported_block_randomization[]; + + // ---------------- Public Consts + +-#define WUFFS_BZIP2__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BZIP2__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +@@ -7386,8 +7735,8 @@ wuffs_bzip2__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_bzip2__decoder__dst_history_retain_length( + const wuffs_bzip2__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -7452,12 +7801,12 @@ struct wuffs_bzip2__decoder__struct { + uint32_t f_num_sections; + uint32_t f_code_lengths_bitmask; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; +- uint32_t p_prepare_block[1]; +- uint32_t p_read_code_lengths[1]; +- uint32_t p_flush_slow[1]; +- uint32_t p_decode_huffman_slow[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_prepare_block; ++ uint32_t p_read_code_lengths; ++ uint32_t p_flush_slow; ++ uint32_t p_decode_huffman_slow; + } private_impl; + + struct { +@@ -7474,15 +7823,15 @@ struct wuffs_bzip2__decoder__struct { + uint32_t v_i; + uint64_t v_tag; + uint32_t v_final_checksum_want; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + struct { + uint32_t v_i; + uint32_t v_selector; +- } s_prepare_block[1]; ++ } s_prepare_block; + struct { + uint32_t v_i; + uint32_t v_code_length; +- } s_read_code_lengths[1]; ++ } s_read_code_lengths; + struct { + uint32_t v_flush_pointer; + uint32_t v_flush_repeat_count; +@@ -7491,10 +7840,10 @@ struct wuffs_bzip2__decoder__struct { + uint32_t v_block_size; + uint8_t v_curr; + uint64_t scratch; +- } s_flush_slow[1]; ++ } s_flush_slow; + struct { + uint32_t v_node_index; +- } s_decode_huffman_slow[1]; ++ } s_decode_huffman_slow; + } private_data; + + #ifdef __cplusplus +@@ -7572,9 +7921,9 @@ struct wuffs_bzip2__decoder__struct { + return wuffs_bzip2__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_bzip2__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_bzip2__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -7606,25 +7955,23 @@ extern const char wuffs_cbor__error__unsupported_recursion_depth[]; + + // ---------------- Public Consts + +-#define WUFFS_CBOR__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024u + +-#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024 ++#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2u + +-#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2 ++#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9u + +-#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9 ++#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 787997u + +-#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 787997 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608 +- +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304u + + // ---------------- Struct Declarations + +@@ -7691,11 +8038,6 @@ wuffs_cbor__decoder__set_quirk( + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__history_retain_length( +- const wuffs_cbor__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_cbor__decoder__workbuf_len( +@@ -7738,7 +8080,7 @@ struct wuffs_cbor__decoder__struct { + + bool f_end_of_data; + +- uint32_t p_decode_tokens[1]; ++ uint32_t p_decode_tokens; + } private_impl; + + struct { +@@ -7750,7 +8092,7 @@ struct wuffs_cbor__decoder__struct { + uint32_t v_depth; + bool v_tagged; + uint8_t v_indefinite_string_major_type; +- } s_decode_tokens[1]; ++ } s_decode_tokens; + } private_data; + + #ifdef __cplusplus +@@ -7828,11 +8170,6 @@ struct wuffs_cbor__decoder__struct { + return wuffs_cbor__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_cbor__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_cbor__decoder__workbuf_len(this); +@@ -8074,6 +8411,227 @@ struct wuffs_crc32__ieee_hasher__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC) + ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++// ---------------- Public Consts ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_crc64__ecma_hasher__struct wuffs_crc64__ecma_hasher; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_crc64__ecma_hasher__initialize( ++ wuffs_crc64__ecma_hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_crc64__ecma_hasher(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_crc64__ecma_hasher* ++wuffs_crc64__ecma_hasher__alloc(void); ++ ++static inline wuffs_base__hasher_u64* ++wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64(void) { ++ return (wuffs_base__hasher_u64*)(wuffs_crc64__ecma_hasher__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__hasher_u64* ++wuffs_crc64__ecma_hasher__upcast_as__wuffs_base__hasher_u64( ++ wuffs_crc64__ecma_hasher* p) { ++ return (wuffs_base__hasher_u64*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__get_quirk( ++ const wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_crc64__ecma_hasher__set_quirk( ++ wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__update( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__update_u64( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__checksum_u64( ++ const wuffs_crc64__ecma_hasher* self); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_crc64__ecma_hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; ++ wuffs_base__vtable null_vtable; ++ ++ uint64_t f_state; ++ ++ wuffs_base__empty_struct (*choosy_up)( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_crc64__ecma_hasher__alloc()); ++ } ++ ++ static inline wuffs_base__hasher_u64::unique_ptr ++ alloc_as__wuffs_base__hasher_u64() { ++ return wuffs_base__hasher_u64::unique_ptr( ++ wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_crc64__ecma_hasher__struct() = delete; ++ wuffs_crc64__ecma_hasher__struct(const wuffs_crc64__ecma_hasher__struct&) = delete; ++ wuffs_crc64__ecma_hasher__struct& operator=( ++ const wuffs_crc64__ecma_hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_crc64__ecma_hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__hasher_u64* ++ upcast_as__wuffs_base__hasher_u64() { ++ return (wuffs_base__hasher_u64*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_crc64__ecma_hasher__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_crc64__ecma_hasher__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_crc64__ecma_hasher__update(this, a_x); ++ } ++ ++ inline uint64_t ++ update_u64( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_crc64__ecma_hasher__update_u64(this, a_x); ++ } ++ ++ inline uint64_t ++ checksum_u64() const { ++ return wuffs_crc64__ecma_hasher__checksum_u64(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_crc64__ecma_hasher__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC) ++ + #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes +@@ -8095,9 +8653,9 @@ extern const char wuffs_deflate__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_DEFLATE__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_DEFLATE__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u + + // ---------------- Struct Declarations + +@@ -8171,8 +8729,8 @@ wuffs_deflate__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_deflate__decoder__dst_history_retain_length( + const wuffs_deflate__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -8222,16 +8780,16 @@ struct wuffs_deflate__decoder__struct { + uint32_t f_n_huffs_bits[2]; + bool f_end_of_block; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; +- uint32_t p_decode_blocks[1]; +- uint32_t p_decode_uncompressed[1]; +- uint32_t p_init_dynamic_huffman[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_blocks; ++ uint32_t p_decode_uncompressed; ++ uint32_t p_init_dynamic_huffman; + wuffs_base__status (*choosy_decode_huffman_fast64)( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); +- uint32_t p_decode_huffman_slow[1]; ++ uint32_t p_decode_huffman_slow; + } private_impl; + + struct { +@@ -8241,11 +8799,11 @@ struct wuffs_deflate__decoder__struct { + + struct { + uint32_t v_final; +- } s_decode_blocks[1]; ++ } s_decode_blocks; + struct { + uint32_t v_length; + uint64_t scratch; +- } s_decode_uncompressed[1]; ++ } s_decode_uncompressed; + struct { + uint32_t v_bits; + uint32_t v_n_bits; +@@ -8257,7 +8815,7 @@ struct wuffs_deflate__decoder__struct { + uint32_t v_n_extra_bits; + uint8_t v_rep_symbol; + uint32_t v_rep_count; +- } s_init_dynamic_huffman[1]; ++ } s_init_dynamic_huffman; + struct { + uint32_t v_bits; + uint32_t v_n_bits; +@@ -8269,7 +8827,7 @@ struct wuffs_deflate__decoder__struct { + uint32_t v_length; + uint32_t v_dist_minus_1; + uint64_t scratch; +- } s_decode_huffman_slow[1]; ++ } s_decode_huffman_slow; + } private_data; + + #ifdef __cplusplus +@@ -8353,9 +8911,9 @@ struct wuffs_deflate__decoder__struct { + return wuffs_deflate__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_deflate__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_deflate__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -8393,23 +8951,21 @@ extern const char wuffs_gif__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_GIF__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 1041635328u + +-#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 1041635328 ++#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 1041635329u + +-#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 1041635329 ++#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 1041635330u + +-#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 1041635330 ++#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 1041635331u + +-#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 1041635331 ++#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 1041635332u + +-#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 1041635332 ++#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 1041635333u + +-#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 1041635333 +- +-#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 1041635334 ++#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 1041635334u + + // ---------------- Struct Declarations + +@@ -8518,11 +9074,6 @@ WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 + wuffs_gif__decoder__frame_dirty_rect( + const wuffs_gif__decoder* self); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__history_retain_length( +- const wuffs_gif__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_gif__decoder__workbuf_len( +@@ -8627,25 +9178,25 @@ struct wuffs_gif__decoder__struct { + uint32_t f_lzw_read_from_return_value; + uint16_t f_lzw_prefixes[4096]; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_do_tell_me_more[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_skip_frame[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_up_to_id_part1[1]; +- uint32_t p_decode_header[1]; +- uint32_t p_decode_lsd[1]; +- uint32_t p_decode_extension[1]; +- uint32_t p_skip_blocks[1]; +- uint32_t p_decode_ae[1]; +- uint32_t p_decode_gc[1]; +- uint32_t p_decode_id_part0[1]; +- uint32_t p_decode_id_part1[1]; +- uint32_t p_decode_id_part2[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_tell_me_more; ++ uint32_t p_do_tell_me_more; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_skip_frame; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_up_to_id_part1; ++ uint32_t p_decode_header; ++ uint32_t p_decode_lsd; ++ uint32_t p_decode_extension; ++ uint32_t p_skip_blocks; ++ uint32_t p_decode_ae; ++ uint32_t p_decode_gc; ++ uint32_t p_decode_id_part0; ++ uint32_t p_decode_id_part1; ++ uint32_t p_decode_id_part2; + } private_impl; + + struct { +@@ -8658,24 +9209,23 @@ struct wuffs_gif__decoder__struct { + + struct { + uint32_t v_background_color; +- } s_do_decode_frame_config[1]; ++ } s_do_decode_frame_config; + struct { + uint64_t scratch; +- } s_skip_frame[1]; ++ } s_skip_frame; + struct { +- uint8_t v_c[6]; +- uint32_t v_i; +- } s_decode_header[1]; ++ uint64_t scratch; ++ } s_decode_header; + struct { + uint8_t v_flags; + uint8_t v_background_color_index; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_lsd[1]; ++ } s_decode_lsd; + struct { + uint64_t scratch; +- } s_skip_blocks[1]; ++ } s_skip_blocks; + struct { + uint8_t v_block_size; + bool v_is_animexts; +@@ -8683,24 +9233,24 @@ struct wuffs_gif__decoder__struct { + bool v_is_iccp; + bool v_is_xmp; + uint64_t scratch; +- } s_decode_ae[1]; ++ } s_decode_ae; + struct { + uint64_t scratch; +- } s_decode_gc[1]; ++ } s_decode_gc; + struct { + uint64_t scratch; +- } s_decode_id_part0[1]; ++ } s_decode_id_part0; + struct { + uint8_t v_which_palette; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_id_part1[1]; ++ } s_decode_id_part1; + struct { + uint64_t v_block_size; + bool v_need_block_size; + uint64_t scratch; +- } s_decode_id_part2[1]; ++ } s_decode_id_part2; + } private_data; + + #ifdef __cplusplus +@@ -8820,11 +9370,6 @@ struct wuffs_gif__decoder__struct { + return wuffs_gif__decoder__frame_dirty_rect(this); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_gif__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_gif__decoder__workbuf_len(this); +@@ -8873,9 +9418,9 @@ extern const char wuffs_gzip__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_GZIP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u + + // ---------------- Struct Declarations + +@@ -8943,8 +9488,8 @@ wuffs_gzip__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_gzip__decoder__dst_history_retain_length( + const wuffs_gzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -8989,8 +9534,8 @@ struct wuffs_gzip__decoder__struct { + + bool f_ignore_checksum; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + + struct { +@@ -8999,11 +9544,11 @@ struct wuffs_gzip__decoder__struct { + + struct { + uint8_t v_flags; +- uint32_t v_checksum_got; +- uint32_t v_decoded_length_got; ++ uint32_t v_checksum_have; ++ uint32_t v_decoded_length_have; + uint32_t v_checksum_want; + uint64_t scratch; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus +@@ -9081,9 +9626,9 @@ struct wuffs_gzip__decoder__struct { + return wuffs_gzip__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_gzip__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_gzip__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -9117,8 +9662,10 @@ extern const char wuffs_jpeg__error__bad_sof_marker[]; + extern const char wuffs_jpeg__error__bad_sos_marker[]; + extern const char wuffs_jpeg__error__bad_header[]; + extern const char wuffs_jpeg__error__bad_marker[]; ++extern const char wuffs_jpeg__error__bad_scan_count[]; + extern const char wuffs_jpeg__error__missing_huffman_table[]; + extern const char wuffs_jpeg__error__missing_quantization_table[]; ++extern const char wuffs_jpeg__error__rejected_progressive_jpeg[]; + extern const char wuffs_jpeg__error__truncated_input[]; + extern const char wuffs_jpeg__error__unsupported_arithmetic_coding[]; + extern const char wuffs_jpeg__error__unsupported_color_model[]; +@@ -9134,9 +9681,9 @@ extern const char wuffs_jpeg__error__unsupported_scan_count[]; + + // ---------------- Public Consts + +-#define WUFFS_JPEG__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232u + +-#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232 ++#define WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS 1220532224u + + // ---------------- Struct Declarations + +@@ -9269,11 +9816,6 @@ wuffs_jpeg__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__history_retain_length( +- const wuffs_jpeg__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_jpeg__decoder__workbuf_len( +@@ -9368,6 +9910,13 @@ struct wuffs_jpeg__decoder__struct { + uint32_t f_bitstream_ri; + uint32_t f_bitstream_wi; + bool f_bitstream_is_closed; ++ bool f_expect_multiple_scans; ++ bool f_use_lower_quality; ++ bool f_reject_progressive_jpegs; ++ bool f_swizzle_immediately; ++ wuffs_base__status f_swizzle_immediately_status; ++ uint32_t f_swizzle_immediately_b_offsets[10]; ++ uint32_t f_swizzle_immediately_c_offsets[5]; + uint32_t f_bitstream_padding; + uint16_t f_quant_tables[4][64]; + uint16_t f_saved_quant_tables[4][64]; +@@ -9381,28 +9930,29 @@ struct wuffs_jpeg__decoder__struct { + wuffs_base__slice_u8 a_dst_buffer, + uint64_t a_dst_stride, + uint32_t a_q); +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_dqt[1]; +- uint32_t p_decode_dri[1]; +- uint32_t p_decode_appn[1]; +- uint32_t p_decode_sof[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_dht[1]; +- uint32_t p_decode_sos[1]; +- uint32_t p_prepare_scan[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_dqt; ++ uint32_t p_decode_dri; ++ uint32_t p_decode_appn; ++ uint32_t p_decode_sof; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_dht; ++ uint32_t p_decode_sos; ++ uint32_t p_prepare_scan; + wuffs_base__empty_struct (*choosy_load_mcu_blocks_for_single_component)( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, + uint32_t a_csel); +- uint32_t p_skip_past_the_next_restart_marker[1]; ++ uint32_t p_skip_past_the_next_restart_marker; + uint32_t (*choosy_decode_mcu)( + wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf, + uint32_t a_mx, + uint32_t a_my); +@@ -9411,6 +9961,7 @@ struct wuffs_jpeg__decoder__struct { + struct { + uint8_t f_bitstream_buffer[2048]; + uint16_t f_mcu_blocks[10][64]; ++ uint8_t f_swizzle_immediately_buffer[640]; + uint8_t f_swizzle_ycck_scratch_buffer_2k[2048]; + uint8_t f_dht_temp_counts[16]; + uint8_t f_dht_temp_bit_lengths[256]; +@@ -9420,38 +9971,38 @@ struct wuffs_jpeg__decoder__struct { + struct { + uint8_t v_marker; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint8_t v_q; + uint32_t v_i; +- } s_decode_dqt[1]; ++ } s_decode_dqt; + struct { + uint64_t scratch; +- } s_decode_dri[1]; ++ } s_decode_dri; + struct { + uint64_t scratch; +- } s_decode_appn[1]; ++ } s_decode_appn; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_decode_sof[1]; ++ } s_decode_sof; + struct { + uint8_t v_marker; + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint8_t v_tc4_th; + uint32_t v_total_count; + uint32_t v_i; +- } s_decode_dht[1]; ++ } s_decode_dht; + struct { + uint32_t v_my; + uint32_t v_mx; +- } s_decode_sos[1]; ++ } s_decode_sos; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_prepare_scan[1]; ++ } s_prepare_scan; + } private_data; + + #ifdef __cplusplus +@@ -9595,11 +10146,6 @@ struct wuffs_jpeg__decoder__struct { + return wuffs_jpeg__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_jpeg__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_jpeg__decoder__workbuf_len(this); +@@ -9627,55 +10173,53 @@ extern const char wuffs_json__error__unsupported_recursion_depth[]; + + // ---------------- Public Consts + +-#define WUFFS_JSON__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024 ++#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024u + +-#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1 ++#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1u + +-#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100 ++#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100u + +-#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1225364480 ++#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1225364480u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1225364481 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1225364481u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1225364482 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1225364482u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1225364483 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1225364483u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1225364484 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1225364484u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1225364485 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1225364485u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1225364486 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1225364486u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1225364487 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1225364487u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1225364489 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1225364489u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1225364490 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1225364490u + +-#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1225364491 ++#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1225364491u + +-#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1225364492 ++#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1225364492u + +-#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1225364493 ++#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1225364493u + +-#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1225364494 ++#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1225364494u + +-#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1225364495 ++#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1225364495u + +-#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496 ++#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496u + +-#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1225364497 ++#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1225364497u + +-#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1225364498 ++#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1225364498u + +-#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1225364499 ++#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1225364499u + +-#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500 ++#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500u + + // ---------------- Struct Declarations + +@@ -9742,11 +10286,6 @@ wuffs_json__decoder__set_quirk( + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__history_retain_length( +- const wuffs_json__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_json__decoder__workbuf_len( +@@ -9794,11 +10333,11 @@ struct wuffs_json__decoder__struct { + uint8_t f_trailer_stop; + uint8_t f_comment_type; + +- uint32_t p_decode_tokens[1]; +- uint32_t p_decode_leading[1]; +- uint32_t p_decode_comment[1]; +- uint32_t p_decode_inf_nan[1]; +- uint32_t p_decode_trailer[1]; ++ uint32_t p_decode_tokens; ++ uint32_t p_decode_leading; ++ uint32_t p_decode_comment; ++ uint32_t p_decode_inf_nan; ++ uint32_t p_decode_trailer; + } private_impl; + + struct { +@@ -9808,7 +10347,7 @@ struct wuffs_json__decoder__struct { + uint32_t v_depth; + uint32_t v_expect; + uint32_t v_expect_after_value; +- } s_decode_tokens[1]; ++ } s_decode_tokens; + } private_data; + + #ifdef __cplusplus +@@ -9886,11 +10425,6 @@ struct wuffs_json__decoder__struct { + return wuffs_json__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_json__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_json__decoder__workbuf_len(this); +@@ -9911,24 +10445,33 @@ struct wuffs_json__decoder__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_lzw__error__bad_code[]; +-extern const char wuffs_lzw__error__truncated_input[]; ++extern const char wuffs_lzma__error__bad_lzma2_header[]; ++extern const char wuffs_lzma__error__bad_bitstream_trailer[]; ++extern const char wuffs_lzma__error__bad_code[]; ++extern const char wuffs_lzma__error__bad_decoded_length[]; ++extern const char wuffs_lzma__error__bad_distance[]; ++extern const char wuffs_lzma__error__bad_header[]; ++extern const char wuffs_lzma__error__truncated_input[]; ++extern const char wuffs_lzma__error__unsupported_decoded_length[]; ++extern const char wuffs_lzma__error__unsupported_properties[]; + + // ---------------- Public Consts + +-#define WUFFS_LZW__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZMA__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZMA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + +-#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1348378624 ++#define WUFFS_LZMA__QUIRK_ALLOW_NON_ZERO_INITIAL_BYTE 1348001792u ++ ++#define WUFFS_LZMA__QUIRK_FORMAT_EXTENSION 1348001793u + + // ---------------- Struct Declarations + +-typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder; ++typedef struct wuffs_lzma__decoder__struct wuffs_lzma__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -9943,14 +10486,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_lzw__decoder__initialize( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__initialize( ++ wuffs_lzma__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_lzw__decoder(void); ++sizeof__wuffs_lzma__decoder(void); + + // ---------------- Allocs + +@@ -9960,19 +10503,19 @@ sizeof__wuffs_lzw__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_lzw__decoder* +-wuffs_lzw__decoder__alloc(void); ++wuffs_lzma__decoder* ++wuffs_lzma__decoder__alloc(void); + + static inline wuffs_base__io_transformer* +-wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) { +- return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc()); ++wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzma__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__io_transformer* +-wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( +- wuffs_lzw__decoder* p) { ++wuffs_lzma__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzma__decoder* p) { + return (wuffs_base__io_transformer*)p; + } + +@@ -9980,40 +10523,35 @@ wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__get_quirk( +- const wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__get_quirk( ++ const wuffs_lzma__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__set_quirk( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__set_quirk( ++ wuffs_lzma__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__history_retain_length( +- const wuffs_lzw__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzma__decoder__dst_history_retain_length( ++ const wuffs_lzma__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_lzw__decoder__workbuf_len( +- const wuffs_lzw__decoder* self); ++wuffs_lzma__decoder__workbuf_len( ++ const wuffs_lzma__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__transform_io( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__transform_io( ++ wuffs_lzma__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +-wuffs_lzw__decoder__flush( +- wuffs_lzw__decoder* self); +- + #ifdef __cplusplus + } // extern "C" + #endif +@@ -10027,7 +10565,7 @@ wuffs_lzw__decoder__flush( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_lzw__decoder__struct { ++struct wuffs_lzma__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10041,45 +10579,113 @@ struct wuffs_lzw__decoder__struct { + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + +- uint32_t f_pending_literal_width_plus_one; +- uint32_t f_literal_width; +- uint32_t f_clear_code; +- uint32_t f_end_code; +- uint32_t f_save_code; +- uint32_t f_prev_code; +- uint32_t f_width; +- uint32_t f_bits; +- uint32_t f_n_bits; +- uint32_t f_output_ri; +- uint32_t f_output_wi; +- uint32_t f_read_from_return_value; +- uint16_t f_prefixes[4096]; +- +- uint32_t p_transform_io[1]; +- uint32_t p_write_to[1]; ++ uint32_t f_lc; ++ uint32_t f_lp; ++ uint32_t f_pb; ++ uint32_t f_format_extension; ++ uint32_t f_dict_size; ++ uint32_t f_dict_workbuf_index; ++ uint32_t f_dict_seen; ++ uint64_t f_decoded_length; ++ uint64_t f_lzma2_encoded_length_have; ++ uint64_t f_lzma2_encoded_length_want; ++ bool f_lzma2_need_prob_reset; ++ bool f_lzma2_need_properties; ++ bool f_lzma2_need_dict_reset; ++ bool f_prev_lzma2_chunk_was_uncompressed; ++ bool f_allow_non_zero_initial_byte; ++ bool f_end_of_chunk; ++ uint8_t f_stashed_bytes[2]; ++ uint32_t f_stashed_bits; ++ uint32_t f_stashed_range; ++ uint32_t f_stashed_state; ++ uint32_t f_stashed_rep0; ++ uint32_t f_stashed_rep1; ++ uint32_t f_stashed_rep2; ++ uint32_t f_stashed_rep3; ++ uint64_t f_stashed_pos; ++ uint64_t f_stashed_pos_end; ++ ++ uint32_t p_decode_bitstream_slow; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_bitstream; ++ uint32_t p_update_stashed_bytes; ++ uint32_t p_decode_optional_end_of_stream; + } private_impl; + + struct { +- uint8_t f_suffixes[4096][8]; +- uint16_t f_lm1s[4096]; +- uint8_t f_output[8199]; ++ uint16_t f_probs_ao00[192]; ++ uint16_t f_probs_ao20[12]; ++ uint16_t f_probs_ao40[12]; ++ uint16_t f_probs_ao41[192]; ++ uint16_t f_probs_ao60[12]; ++ uint16_t f_probs_ao63[12]; ++ uint16_t f_probs_match_len_low[16][8]; ++ uint16_t f_probs_match_len_mid[16][8]; ++ uint16_t f_probs_match_len_high[1][256]; ++ uint16_t f_probs_longrep_len_low[16][8]; ++ uint16_t f_probs_longrep_len_mid[16][8]; ++ uint16_t f_probs_longrep_len_high[1][256]; ++ uint16_t f_probs_slot[4][64]; ++ uint16_t f_probs_small_dist[128]; ++ uint16_t f_probs_large_dist[16]; ++ uint16_t f_probs_lit[16][768]; ++ ++ struct { ++ uint32_t v_bits; ++ uint32_t v_range; ++ uint32_t v_state; ++ uint32_t v_rep0; ++ uint32_t v_rep1; ++ uint32_t v_rep2; ++ uint32_t v_rep3; ++ uint32_t v_rep; ++ uint64_t v_pos; ++ uint64_t v_pos_end; ++ uint32_t v_lc; ++ uint64_t v_lp_mask; ++ uint64_t v_pb_mask; ++ uint32_t v_tree_node; ++ uint8_t v_prev_byte; ++ uint32_t v_match_byte; ++ uint32_t v_len_state; ++ uint32_t v_slot; ++ uint32_t v_len; ++ uint32_t v_lanl_offset; ++ uint32_t v_num_extra_bits; ++ uint32_t v_dist_extra_bits; ++ uint32_t v_i; ++ uint32_t v_index_lit; ++ uint32_t v_index_len; ++ uint32_t v_index_small_dist_base; ++ uint32_t v_index_small_dist_extra; ++ uint32_t v_index_large_dist; ++ uint32_t v_dist; ++ uint64_t scratch; ++ } s_decode_bitstream_slow; ++ struct { ++ uint8_t v_header_byte; ++ uint32_t v_length; ++ uint64_t scratch; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_lzw__decoder__alloc()); ++ return unique_ptr(wuffs_lzma__decoder__alloc()); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( +- wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer()); ++ wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10095,10 +10701,10 @@ struct wuffs_lzw__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_lzw__decoder__struct() = delete; +- wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete; +- wuffs_lzw__decoder__struct& operator=( +- const wuffs_lzw__decoder__struct&) = delete; ++ wuffs_lzma__decoder__struct() = delete; ++ wuffs_lzma__decoder__struct(const wuffs_lzma__decoder__struct&) = delete; ++ wuffs_lzma__decoder__struct& operator=( ++ const wuffs_lzma__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10118,7 +10724,7 @@ struct wuffs_lzw__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_lzw__decoder__initialize( ++ return wuffs_lzma__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -10130,24 +10736,24 @@ struct wuffs_lzw__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_lzw__decoder__get_quirk(this, a_key); ++ return wuffs_lzma__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_lzw__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_lzma__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_lzw__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzma__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_lzw__decoder__workbuf_len(this); ++ return wuffs_lzma__decoder__workbuf_len(this); + } + + inline wuffs_base__status +@@ -10155,38 +10761,34 @@ struct wuffs_lzw__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { +- return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf); +- } +- +- inline wuffs_base__slice_u8 +- flush() { +- return wuffs_lzw__decoder__flush(this); ++ return wuffs_lzma__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + + #endif // __cplusplus +-}; // struct wuffs_lzw__decoder__struct ++}; // struct wuffs_lzma__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_netpbm__error__bad_header[]; +-extern const char wuffs_netpbm__error__truncated_input[]; +-extern const char wuffs_netpbm__error__unsupported_netpbm_file[]; ++extern const char wuffs_lzip__error__bad_checksum[]; ++extern const char wuffs_lzip__error__bad_footer[]; ++extern const char wuffs_lzip__error__bad_header[]; ++extern const char wuffs_lzip__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_NETPBM__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + + // ---------------- Struct Declarations + +-typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder; ++typedef struct wuffs_lzip__decoder__struct wuffs_lzip__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10201,14 +10803,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_netpbm__decoder__initialize( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__initialize( ++ wuffs_lzip__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_netpbm__decoder(void); ++sizeof__wuffs_lzip__decoder(void); + + // ---------------- Allocs + +@@ -10218,112 +10820,54 @@ sizeof__wuffs_netpbm__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_netpbm__decoder* +-wuffs_netpbm__decoder__alloc(void); ++wuffs_lzip__decoder* ++wuffs_lzip__decoder__alloc(void); + +-static inline wuffs_base__image_decoder* +-wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc()); ++static inline wuffs_base__io_transformer* ++wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzip__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__image_decoder* +-wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_netpbm__decoder* p) { +- return (wuffs_base__image_decoder*)p; ++static inline wuffs_base__io_transformer* ++wuffs_lzip__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzip__decoder* p) { ++ return (wuffs_base__io_transformer*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__get_quirk( +- const wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__get_quirk( ++ const wuffs_lzip__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__set_quirk( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__set_quirk( ++ wuffs_lzip__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_netpbm__decoder__frame_dirty_rect( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_netpbm__decoder__num_animation_loops( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frame_configs( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frames( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__restart_frame( +- wuffs_netpbm__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzip__decoder__dst_history_retain_length( ++ const wuffs_lzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_netpbm__decoder__set_report_metadata( +- wuffs_netpbm__decoder* self, +- uint32_t a_fourcc, +- bool a_report); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzip__decoder__workbuf_len( ++ const wuffs_lzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__tell_me_more( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__transform_io( ++ wuffs_lzip__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__history_retain_length( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_netpbm__decoder__workbuf_len( +- const wuffs_netpbm__decoder* self); ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + + #ifdef __cplusplus + } // extern "C" +@@ -10338,7 +10882,7 @@ wuffs_netpbm__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_netpbm__decoder__struct { ++struct wuffs_lzip__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10349,42 +10893,41 @@ struct wuffs_netpbm__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + +- uint32_t f_pixfmt; +- uint32_t f_width; +- uint32_t f_height; +- uint32_t f_max_value; +- uint8_t f_call_sequence; +- uint64_t f_frame_config_io_position; +- uint32_t f_dst_x; +- uint32_t f_dst_y; +- wuffs_base__pixel_swizzler f_swizzler; ++ bool f_ignore_checksum; ++ uint64_t f_dsize_have; ++ uint64_t f_ssize_have; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + ++ struct { ++ wuffs_crc32__ieee_hasher f_crc32; ++ wuffs_lzma__decoder f_lzma; ++ ++ struct { ++ uint64_t scratch; ++ } s_do_transform_io; ++ } private_data; ++ + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_netpbm__decoder__alloc()); ++ return unique_ptr(wuffs_lzip__decoder__alloc()); + } + +- static inline wuffs_base__image_decoder::unique_ptr +- alloc_as__wuffs_base__image_decoder() { +- return wuffs_base__image_decoder::unique_ptr( +- wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder()); ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10400,10 +10943,10 @@ struct wuffs_netpbm__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_netpbm__decoder__struct() = delete; +- wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete; +- wuffs_netpbm__decoder__struct& operator=( +- const wuffs_netpbm__decoder__struct&) = delete; ++ wuffs_lzip__decoder__struct() = delete; ++ wuffs_lzip__decoder__struct(const wuffs_lzip__decoder__struct&) = delete; ++ wuffs_lzip__decoder__struct& operator=( ++ const wuffs_lzip__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10423,128 +10966,327 @@ struct wuffs_netpbm__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_netpbm__decoder__initialize( ++ return wuffs_lzip__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__image_decoder* +- upcast_as__wuffs_base__image_decoder() { +- return (wuffs_base__image_decoder*)this; ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_netpbm__decoder__get_quirk(this, a_key); ++ return wuffs_lzip__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_lzip__decoder__set_quirk(this, a_key, a_value); + } + +- inline wuffs_base__status +- decode_image_config( +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzip__decoder__dst_history_retain_length(this); + } + +- inline wuffs_base__status +- decode_frame_config( +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src); ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_lzip__decoder__workbuf_len(this); + } + + inline wuffs_base__status +- decode_frame( +- wuffs_base__pixel_buffer* a_dst, ++ transform_io( ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } +- +- inline wuffs_base__rect_ie_u32 +- frame_dirty_rect() const { +- return wuffs_netpbm__decoder__frame_dirty_rect(this); ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_lzip__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +- inline uint32_t +- num_animation_loops() const { +- return wuffs_netpbm__decoder__num_animation_loops(this); +- } ++#endif // __cplusplus ++}; // struct wuffs_lzip__decoder__struct + +- inline uint64_t +- num_decoded_frame_configs() const { +- return wuffs_netpbm__decoder__num_decoded_frame_configs(this); +- } ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- inline uint64_t +- num_decoded_frames() const { +- return wuffs_netpbm__decoder__num_decoded_frames(this); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__status +- restart_frame( +- uint64_t a_index, +- uint64_t a_io_position) { +- return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__empty_struct +- set_report_metadata( +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report); +- } ++// ---------------- Status Codes + +- inline wuffs_base__status +- tell_me_more( +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } ++extern const char wuffs_lzw__error__bad_code[]; ++extern const char wuffs_lzw__error__truncated_input[]; + +- inline uint64_t +- history_retain_length() const { +- return wuffs_netpbm__decoder__history_retain_length(this); +- } ++// ---------------- Public Consts + +- inline wuffs_base__range_ii_u64 +- workbuf_len() const { +- return wuffs_netpbm__decoder__workbuf_len(this); +- } ++#define WUFFS_LZW__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#endif // __cplusplus +-}; // struct wuffs_netpbm__decoder__struct ++#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1348378624u + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++// ---------------- Struct Declarations + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder; + +-// ---------------- Status Codes ++#ifdef __cplusplus ++extern "C" { ++#endif + +-extern const char wuffs_nie__error__bad_header[]; +-extern const char wuffs_nie__error__truncated_input[]; +-extern const char wuffs_nie__error__unsupported_nie_file[]; ++// ---------------- Public Initializer Prototypes + +-// ---------------- Public Consts ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzw__decoder__initialize( ++ wuffs_lzw__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_lzw__decoder(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_lzw__decoder* ++wuffs_lzw__decoder__alloc(void); ++ ++static inline wuffs_base__io_transformer* ++wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__io_transformer* ++wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzw__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzw__decoder__get_quirk( ++ const wuffs_lzw__decoder* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__set_quirk( ++ wuffs_lzw__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzw__decoder__dst_history_retain_length( ++ const wuffs_lzw__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzw__decoder__workbuf_len( ++ const wuffs_lzw__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__transform_io( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 ++wuffs_lzw__decoder__flush( ++ wuffs_lzw__decoder* self); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_lzw__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; ++ ++ uint32_t f_pending_literal_width_plus_one; ++ uint32_t f_literal_width; ++ uint32_t f_clear_code; ++ uint32_t f_end_code; ++ uint32_t f_save_code; ++ uint32_t f_prev_code; ++ uint32_t f_width; ++ uint32_t f_bits; ++ uint32_t f_n_bits; ++ uint32_t f_output_ri; ++ uint32_t f_output_wi; ++ uint32_t f_read_from_return_value; ++ uint16_t f_prefixes[4096]; ++ ++ uint32_t p_transform_io; ++ uint32_t p_write_to; ++ } private_impl; ++ ++ struct { ++ uint8_t f_suffixes[4096][8]; ++ uint16_t f_lm1s[4096]; ++ uint8_t f_output[8199]; ++ } private_data; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_lzw__decoder__alloc()); ++ } ++ ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_lzw__decoder__struct() = delete; ++ wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete; ++ wuffs_lzw__decoder__struct& operator=( ++ const wuffs_lzw__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_lzw__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_lzw__decoder__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_lzw__decoder__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzw__decoder__dst_history_retain_length(this); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_lzw__decoder__workbuf_len(this); ++ } ++ ++ inline wuffs_base__status ++ transform_io( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf); ++ } ++ ++ inline wuffs_base__slice_u8 ++ flush() { ++ return wuffs_lzw__decoder__flush(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_lzw__decoder__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++extern const char wuffs_netpbm__error__bad_header[]; ++extern const char wuffs_netpbm__error__truncated_input[]; ++extern const char wuffs_netpbm__error__unsupported_netpbm_file[]; + +-#define WUFFS_NIE__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++// ---------------- Public Consts + +-#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder; ++typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10559,14 +11301,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_nie__decoder__initialize( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__initialize( ++ wuffs_netpbm__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_nie__decoder(void); ++sizeof__wuffs_netpbm__decoder(void); + + // ---------------- Allocs + +@@ -10576,19 +11318,19 @@ sizeof__wuffs_nie__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_nie__decoder* +-wuffs_nie__decoder__alloc(void); ++wuffs_netpbm__decoder* ++wuffs_netpbm__decoder__alloc(void); + + static inline wuffs_base__image_decoder* +-wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc()); ++wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__image_decoder* +-wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_nie__decoder* p) { ++wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_netpbm__decoder* p) { + return (wuffs_base__image_decoder*)p; + } + +@@ -10596,35 +11338,35 @@ wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__get_quirk( +- const wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__get_quirk( ++ const wuffs_netpbm__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__set_quirk( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__set_quirk( ++ wuffs_netpbm__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_image_config( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_image_config( ++ wuffs_netpbm__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame_config( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_frame_config( ++ wuffs_netpbm__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_frame( ++ wuffs_netpbm__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -10633,55 +11375,50 @@ wuffs_nie__decoder__decode_frame( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_nie__decoder__frame_dirty_rect( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__frame_dirty_rect( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_nie__decoder__num_animation_loops( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_animation_loops( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frame_configs( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_decoded_frame_configs( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frames( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_decoded_frames( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__restart_frame( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__restart_frame( ++ wuffs_netpbm__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_nie__decoder__set_report_metadata( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__set_report_metadata( ++ wuffs_netpbm__decoder* self, + uint32_t a_fourcc, + bool a_report); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__tell_me_more( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__tell_me_more( ++ wuffs_netpbm__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__history_retain_length( +- const wuffs_nie__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_nie__decoder__workbuf_len( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__workbuf_len( ++ const wuffs_netpbm__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -10696,7 +11433,7 @@ wuffs_nie__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_nie__decoder__struct { ++struct wuffs_netpbm__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10713,40 +11450,36 @@ struct wuffs_nie__decoder__struct { + uint32_t f_pixfmt; + uint32_t f_width; + uint32_t f_height; ++ uint32_t f_max_value; + uint8_t f_call_sequence; ++ uint64_t f_frame_config_io_position; + uint32_t f_dst_x; + uint32_t f_dst_y; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; + } private_impl; + +- struct { +- struct { +- uint64_t scratch; +- } s_do_decode_image_config[1]; +- } private_data; +- + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_nie__decoder__alloc()); ++ return unique_ptr(wuffs_netpbm__decoder__alloc()); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( +- wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder()); ++ wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10762,10 +11495,10 @@ struct wuffs_nie__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_nie__decoder__struct() = delete; +- wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete; +- wuffs_nie__decoder__struct& operator=( +- const wuffs_nie__decoder__struct&) = delete; ++ wuffs_netpbm__decoder__struct() = delete; ++ wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete; ++ wuffs_netpbm__decoder__struct& operator=( ++ const wuffs_netpbm__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10785,7 +11518,7 @@ struct wuffs_nie__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_nie__decoder__initialize( ++ return wuffs_netpbm__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -10797,28 +11530,28 @@ struct wuffs_nie__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_nie__decoder__get_quirk(this, a_key); ++ return wuffs_netpbm__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_nie__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src); ++ return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src); ++ return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status +@@ -10828,41 +11561,41 @@ struct wuffs_nie__decoder__struct { + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { +- return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { +- return wuffs_nie__decoder__frame_dirty_rect(this); ++ return wuffs_netpbm__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { +- return wuffs_nie__decoder__num_animation_loops(this); ++ return wuffs_netpbm__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { +- return wuffs_nie__decoder__num_decoded_frame_configs(this); ++ return wuffs_netpbm__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { +- return wuffs_nie__decoder__num_decoded_frames(this); ++ return wuffs_netpbm__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { +- return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { +- return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report); ++ return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status +@@ -10870,49 +11603,36 @@ struct wuffs_nie__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } +- +- inline uint64_t +- history_retain_length() const { +- return wuffs_nie__decoder__history_retain_length(this); ++ return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_nie__decoder__workbuf_len(this); ++ return wuffs_netpbm__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_nie__decoder__struct ++}; // struct wuffs_netpbm__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_zlib__note__dictionary_required[]; +-extern const char wuffs_zlib__error__bad_checksum[]; +-extern const char wuffs_zlib__error__bad_compression_method[]; +-extern const char wuffs_zlib__error__bad_compression_window_size[]; +-extern const char wuffs_zlib__error__bad_parity_check[]; +-extern const char wuffs_zlib__error__incorrect_dictionary[]; +-extern const char wuffs_zlib__error__truncated_input[]; ++extern const char wuffs_nie__error__bad_header[]; ++extern const char wuffs_nie__error__truncated_input[]; ++extern const char wuffs_nie__error__unsupported_nie_file[]; + + // ---------------- Public Consts + +-#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976 +- +-#define WUFFS_ZLIB__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder; ++typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10927,14 +11647,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_zlib__decoder__initialize( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__initialize( ++ wuffs_nie__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_zlib__decoder(void); ++sizeof__wuffs_nie__decoder(void); + + // ---------------- Allocs + +@@ -10944,65 +11664,107 @@ sizeof__wuffs_zlib__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_zlib__decoder* +-wuffs_zlib__decoder__alloc(void); ++wuffs_nie__decoder* ++wuffs_nie__decoder__alloc(void); + +-static inline wuffs_base__io_transformer* +-wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) { +- return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc()); ++static inline wuffs_base__image_decoder* ++wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__io_transformer* +-wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer( +- wuffs_zlib__decoder* p) { +- return (wuffs_base__io_transformer*)p; ++static inline wuffs_base__image_decoder* ++wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_nie__decoder* p) { ++ return (wuffs_base__image_decoder*)p; + } + + // ---------------- Public Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_zlib__decoder__dictionary_id( +- const wuffs_zlib__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_zlib__decoder__add_dictionary( +- wuffs_zlib__decoder* self, +- wuffs_base__slice_u8 a_dict); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__get_quirk( +- const wuffs_zlib__decoder* self, ++wuffs_nie__decoder__get_quirk( ++ const wuffs_nie__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__set_quirk( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__set_quirk( ++ wuffs_nie__decoder* self, + uint32_t a_key, + uint64_t a_value); + ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_nie__decoder__frame_dirty_rect( ++ const wuffs_nie__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_nie__decoder__num_animation_loops( ++ const wuffs_nie__decoder* self); ++ + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__history_retain_length( +- const wuffs_zlib__decoder* self); ++wuffs_nie__decoder__num_decoded_frame_configs( ++ const wuffs_nie__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_zlib__decoder__workbuf_len( +- const wuffs_zlib__decoder* self); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frames( ++ const wuffs_nie__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__transform_io( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__restart_frame( ++ wuffs_nie__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_nie__decoder__set_report_metadata( ++ wuffs_nie__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__tell_me_more( ++ wuffs_nie__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_nie__decoder__workbuf_len( ++ const wuffs_nie__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -11017,7 +11779,7 @@ wuffs_zlib__decoder__transform_io( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_zlib__decoder__struct { ++struct wuffs_nie__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -11028,20 +11790,336 @@ struct wuffs_zlib__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + +- bool f_bad_call_sequence; +- bool f_header_complete; ++ uint32_t f_pixfmt; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint32_t f_dst_x; ++ uint32_t f_dst_y; ++ wuffs_base__pixel_swizzler f_swizzler; ++ ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ } private_impl; ++ ++ struct { ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ } private_data; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_nie__decoder__alloc()); ++ } ++ ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_nie__decoder__struct() = delete; ++ wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete; ++ wuffs_nie__decoder__struct& operator=( ++ const wuffs_nie__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_nie__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_nie__decoder__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_nie__decoder__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } ++ ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_nie__decoder__frame_dirty_rect(this); ++ } ++ ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_nie__decoder__num_animation_loops(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_nie__decoder__num_decoded_frame_configs(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_nie__decoder__num_decoded_frames(this); ++ } ++ ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position); ++ } ++ ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } ++ ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_nie__decoder__workbuf_len(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_nie__decoder__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++extern const char wuffs_zlib__note__dictionary_required[]; ++extern const char wuffs_zlib__error__bad_checksum[]; ++extern const char wuffs_zlib__error__bad_compression_method[]; ++extern const char wuffs_zlib__error__bad_compression_window_size[]; ++extern const char wuffs_zlib__error__bad_parity_check[]; ++extern const char wuffs_zlib__error__incorrect_dictionary[]; ++extern const char wuffs_zlib__error__truncated_input[]; ++ ++// ---------------- Public Consts ++ ++#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976u ++ ++#define WUFFS_ZLIB__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u ++ ++#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_zlib__decoder__initialize( ++ wuffs_zlib__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_zlib__decoder(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_zlib__decoder* ++wuffs_zlib__decoder__alloc(void); ++ ++static inline wuffs_base__io_transformer* ++wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__io_transformer* ++wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_zlib__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_zlib__decoder__dictionary_id( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_zlib__decoder__add_dictionary( ++ wuffs_zlib__decoder* self, ++ wuffs_base__slice_u8 a_dict); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_zlib__decoder__get_quirk( ++ const wuffs_zlib__decoder* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__set_quirk( ++ wuffs_zlib__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_zlib__decoder__dst_history_retain_length( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_zlib__decoder__workbuf_len( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_zlib__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; ++ ++ bool f_bad_call_sequence; ++ bool f_header_complete; + bool f_got_dictionary; + bool f_want_dictionary; + bool f_quirks[1]; + bool f_ignore_checksum; +- uint32_t f_dict_id_got; ++ uint32_t f_dict_id_have; + uint32_t f_dict_id_want; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + + struct { +@@ -11050,9 +12128,9 @@ struct wuffs_zlib__decoder__struct { + wuffs_deflate__decoder f_flate; + + struct { +- uint32_t v_checksum_got; ++ uint32_t v_checksum_have; + uint64_t scratch; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus +@@ -11141,9 +12219,9 @@ struct wuffs_zlib__decoder__struct { + return wuffs_zlib__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_zlib__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_zlib__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -11184,11 +12262,9 @@ extern const char wuffs_png__error__unsupported_png_file[]; + + // ---------------- Public Consts + +-#define WUFFS_PNG__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015u + +-#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015 +- +-#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8 ++#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8u + + // ---------------- Struct Declarations + +@@ -11321,11 +12397,6 @@ wuffs_png__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__history_retain_length( +- const wuffs_png__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_png__decoder__workbuf_len( +@@ -11438,26 +12509,26 @@ struct wuffs_png__decoder__struct { + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_ihdr[1]; +- uint32_t p_decode_other_chunk[1]; +- uint32_t p_decode_actl[1]; +- uint32_t p_decode_chrm[1]; +- uint32_t p_decode_fctl[1]; +- uint32_t p_decode_gama[1]; +- uint32_t p_decode_iccp[1]; +- uint32_t p_decode_plte[1]; +- uint32_t p_decode_srgb[1]; +- uint32_t p_decode_trns[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_skip_frame[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_pass[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_do_tell_me_more[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_ihdr; ++ uint32_t p_decode_other_chunk; ++ uint32_t p_decode_actl; ++ uint32_t p_decode_chrm; ++ uint32_t p_decode_fctl; ++ uint32_t p_decode_gama; ++ uint32_t p_decode_iccp; ++ uint32_t p_decode_plte; ++ uint32_t p_decode_srgb; ++ uint32_t p_decode_trns; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_skip_frame; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_pass; ++ uint32_t p_tell_me_more; ++ uint32_t p_do_tell_me_more; + wuffs_base__status (*choosy_filter_and_swizzle)( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, +@@ -11473,54 +12544,54 @@ struct wuffs_png__decoder__struct { + struct { + uint32_t v_checksum_have; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint64_t scratch; +- } s_decode_ihdr[1]; ++ } s_decode_ihdr; + struct { + uint64_t scratch; +- } s_decode_other_chunk[1]; ++ } s_decode_other_chunk; + struct { + uint64_t scratch; +- } s_decode_actl[1]; ++ } s_decode_actl; + struct { + uint64_t scratch; +- } s_decode_chrm[1]; ++ } s_decode_chrm; + struct { + uint32_t v_x0; + uint32_t v_x1; + uint32_t v_y1; + uint64_t scratch; +- } s_decode_fctl[1]; ++ } s_decode_fctl; + struct { + uint64_t scratch; +- } s_decode_gama[1]; ++ } s_decode_gama; + struct { + uint32_t v_num_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_plte[1]; ++ } s_decode_plte; + struct { + uint32_t v_i; + uint32_t v_n; + uint64_t scratch; +- } s_decode_trns[1]; ++ } s_decode_trns; + struct { + uint64_t scratch; +- } s_do_decode_frame_config[1]; ++ } s_do_decode_frame_config; + struct { + uint64_t scratch; +- } s_skip_frame[1]; ++ } s_skip_frame; + struct { + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint64_t scratch; +- } s_decode_pass[1]; ++ } s_decode_pass; + struct { + wuffs_base__status v_zlib_status; + uint64_t scratch; +- } s_do_tell_me_more[1]; ++ } s_do_tell_me_more; + } private_data; + + #ifdef __cplusplus +@@ -11664,11 +12735,6 @@ struct wuffs_png__decoder__struct { + return wuffs_png__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_png__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_png__decoder__workbuf_len(this); +@@ -11681,24 +12747,21 @@ struct wuffs_png__decoder__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_tga__error__bad_header[]; +-extern const char wuffs_tga__error__bad_run_length_encoding[]; +-extern const char wuffs_tga__error__truncated_input[]; +-extern const char wuffs_tga__error__unsupported_tga_file[]; ++extern const char wuffs_qoi__error__bad_footer[]; ++extern const char wuffs_qoi__error__bad_header[]; ++extern const char wuffs_qoi__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_TGA__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_TGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_QOI__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_tga__decoder__struct wuffs_tga__decoder; ++typedef struct wuffs_qoi__decoder__struct wuffs_qoi__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -11713,14 +12776,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_tga__decoder__initialize( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__initialize( ++ wuffs_qoi__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_tga__decoder(void); ++sizeof__wuffs_qoi__decoder(void); + + // ---------------- Allocs + +@@ -11730,19 +12793,19 @@ sizeof__wuffs_tga__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_tga__decoder* +-wuffs_tga__decoder__alloc(void); ++wuffs_qoi__decoder* ++wuffs_qoi__decoder__alloc(void); + + static inline wuffs_base__image_decoder* +-wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_tga__decoder__alloc()); ++wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_qoi__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__image_decoder* +-wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_tga__decoder* p) { ++wuffs_qoi__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_qoi__decoder* p) { + return (wuffs_base__image_decoder*)p; + } + +@@ -11750,35 +12813,35 @@ wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__get_quirk( +- const wuffs_tga__decoder* self, ++wuffs_qoi__decoder__get_quirk( ++ const wuffs_qoi__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__set_quirk( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__set_quirk( ++ wuffs_qoi__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_image_config( ++ wuffs_qoi__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_frame_config( ++ wuffs_qoi__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_frame( ++ wuffs_qoi__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -11787,55 +12850,50 @@ wuffs_tga__decoder__decode_frame( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_tga__decoder__frame_dirty_rect( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__frame_dirty_rect( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_tga__decoder__num_animation_loops( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_animation_loops( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frame_configs( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_decoded_frame_configs( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frames( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_decoded_frames( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__restart_frame( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__restart_frame( ++ wuffs_qoi__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_tga__decoder__set_report_metadata( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__set_report_metadata( ++ wuffs_qoi__decoder* self, + uint32_t a_fourcc, + bool a_report); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__tell_me_more( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__tell_me_more( ++ wuffs_qoi__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__history_retain_length( +- const wuffs_tga__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_tga__decoder__workbuf_len( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__workbuf_len( ++ const wuffs_qoi__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -11850,7 +12908,7 @@ wuffs_tga__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_tga__decoder__struct { ++struct wuffs_qoi__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -11864,69 +12922,58 @@ struct wuffs_tga__decoder__struct { + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + ++ uint32_t f_pixfmt; + uint32_t f_width; + uint32_t f_height; ++ uint64_t f_remaining_pixels_times_4; + uint8_t f_call_sequence; +- uint8_t f_header_id_length; +- uint8_t f_header_color_map_type; +- uint8_t f_header_image_type; +- uint16_t f_header_color_map_first_entry_index; +- uint16_t f_header_color_map_length; +- uint8_t f_header_color_map_entry_size; +- uint8_t f_header_pixel_depth; +- uint8_t f_header_image_descriptor; +- bool f_opaque; +- uint32_t f_scratch_bytes_per_pixel; +- uint32_t f_src_bytes_per_pixel; +- uint32_t f_src_pixfmt; +- uint64_t f_frame_config_io_position; ++ uint32_t f_buffer_index; ++ uint32_t f_dst_x; ++ uint32_t f_dst_y; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_from_src_to_buffer; + } private_impl; + + struct { +- uint8_t f_dst_palette[1024]; +- uint8_t f_src_palette[1024]; +- uint8_t f_scratch[4]; ++ uint8_t f_pixel[4]; ++ uint8_t f_cache[256]; ++ uint8_t f_buffer[8196]; + + struct { +- uint32_t v_i; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { +- uint64_t v_dst_bytes_per_pixel; +- uint32_t v_dst_x; +- uint32_t v_dst_y; +- uint64_t v_mark; +- uint32_t v_num_pixels32; +- uint32_t v_lit_length; +- uint32_t v_run_length; +- uint64_t v_num_dst_bytes; + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; ++ struct { ++ uint8_t v_dg; ++ uint32_t v_bi; ++ uint32_t v_bk; ++ } s_from_src_to_buffer; + } private_data; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_tga__decoder__alloc()); ++ return unique_ptr(wuffs_qoi__decoder__alloc()); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( +- wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder()); ++ wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -11942,10 +12989,10 @@ struct wuffs_tga__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_tga__decoder__struct() = delete; +- wuffs_tga__decoder__struct(const wuffs_tga__decoder__struct&) = delete; +- wuffs_tga__decoder__struct& operator=( +- const wuffs_tga__decoder__struct&) = delete; ++ wuffs_qoi__decoder__struct() = delete; ++ wuffs_qoi__decoder__struct(const wuffs_qoi__decoder__struct&) = delete; ++ wuffs_qoi__decoder__struct& operator=( ++ const wuffs_qoi__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -11965,7 +13012,7 @@ struct wuffs_tga__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_tga__decoder__initialize( ++ return wuffs_qoi__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -11977,28 +13024,28 @@ struct wuffs_tga__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_tga__decoder__get_quirk(this, a_key); ++ return wuffs_qoi__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_tga__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_qoi__decoder__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__decode_image_config(this, a_dst, a_src); ++ return wuffs_qoi__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__decode_frame_config(this, a_dst, a_src); ++ return wuffs_qoi__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status +@@ -12008,41 +13055,41 @@ struct wuffs_tga__decoder__struct { + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { +- return wuffs_tga__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ return wuffs_qoi__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { +- return wuffs_tga__decoder__frame_dirty_rect(this); ++ return wuffs_qoi__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { +- return wuffs_tga__decoder__num_animation_loops(this); ++ return wuffs_qoi__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { +- return wuffs_tga__decoder__num_decoded_frame_configs(this); ++ return wuffs_qoi__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { +- return wuffs_tga__decoder__num_decoded_frames(this); ++ return wuffs_qoi__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { +- return wuffs_tga__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_qoi__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { +- return wuffs_tga__decoder__set_report_metadata(this, a_fourcc, a_report); ++ return wuffs_qoi__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status +@@ -12050,42 +13097,30 @@ struct wuffs_tga__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } +- +- inline uint64_t +- history_retain_length() const { +- return wuffs_tga__decoder__history_retain_length(this); ++ return wuffs_qoi__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_tga__decoder__workbuf_len(this); ++ return wuffs_qoi__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_tga__decoder__struct ++}; // struct wuffs_qoi__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_wbmp__error__bad_header[]; +-extern const char wuffs_wbmp__error__truncated_input[]; +- + // ---------------- Public Consts + +-#define WUFFS_WBMP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 +- + // ---------------- Struct Declarations + +-typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder; ++typedef struct wuffs_sha256__hasher__struct wuffs_sha256__hasher; + + #ifdef __cplusplus + extern "C" { +@@ -12100,14 +13135,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_wbmp__decoder__initialize( +- wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__initialize( ++ wuffs_sha256__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_wbmp__decoder(void); ++sizeof__wuffs_sha256__hasher(void); + + // ---------------- Allocs + +@@ -12117,112 +13152,53 @@ sizeof__wuffs_wbmp__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_wbmp__decoder* +-wuffs_wbmp__decoder__alloc(void); ++wuffs_sha256__hasher* ++wuffs_sha256__hasher__alloc(void); + +-static inline wuffs_base__image_decoder* +-wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc()); ++static inline wuffs_base__hasher_bitvec256* ++wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256(void) { ++ return (wuffs_base__hasher_bitvec256*)(wuffs_sha256__hasher__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__image_decoder* +-wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_wbmp__decoder* p) { +- return (wuffs_base__image_decoder*)p; ++static inline wuffs_base__hasher_bitvec256* ++wuffs_sha256__hasher__upcast_as__wuffs_base__hasher_bitvec256( ++ wuffs_sha256__hasher* p) { ++ return (wuffs_base__hasher_bitvec256*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__get_quirk( +- const wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__get_quirk( ++ const wuffs_sha256__hasher* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__set_quirk( +- wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__set_quirk( ++ wuffs_sha256__hasher* self, + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_wbmp__decoder__frame_dirty_rect( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_wbmp__decoder__num_animation_loops( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frame_configs( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frames( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__restart_frame( +- wuffs_wbmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_wbmp__decoder__set_report_metadata( +- wuffs_wbmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__tell_me_more( +- wuffs_wbmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++wuffs_sha256__hasher__update( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__history_retain_length( +- const wuffs_wbmp__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__update_bitvec256( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_wbmp__decoder__workbuf_len( +- const wuffs_wbmp__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__checksum_bitvec256( ++ const wuffs_sha256__hasher* self); + + #ifdef __cplusplus + } // extern "C" +@@ -12237,7 +13213,7 @@ wuffs_wbmp__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_wbmp__decoder__struct { ++struct wuffs_sha256__hasher__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12248,52 +13224,41 @@ struct wuffs_wbmp__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_bitvec256; + wuffs_base__vtable null_vtable; + +- uint32_t f_width; +- uint32_t f_height; +- uint8_t f_call_sequence; +- uint64_t f_frame_config_io_position; +- wuffs_base__pixel_swizzler f_swizzler; +- +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint64_t f_length_modulo_u64; ++ bool f_length_overflows_u64; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_padding2; ++ uint32_t f_buf_len; ++ uint8_t f_buf_data[64]; ++ uint32_t f_h0; ++ uint32_t f_h1; ++ uint32_t f_h2; ++ uint32_t f_h3; ++ uint32_t f_h4; ++ uint32_t f_h5; ++ uint32_t f_h6; ++ uint32_t f_h7; + } private_impl; + +- struct { +- struct { +- uint32_t v_i; +- uint32_t v_p; +- } s_do_decode_image_config[1]; +- struct { +- uint64_t v_dst_bytes_per_pixel; +- uint32_t v_dst_x; +- uint32_t v_dst_y; +- uint8_t v_src[1]; +- uint8_t v_c; +- } s_do_decode_frame[1]; +- } private_data; +- + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_wbmp__decoder__alloc()); ++ return unique_ptr(wuffs_sha256__hasher__alloc()); + } + +- static inline wuffs_base__image_decoder::unique_ptr +- alloc_as__wuffs_base__image_decoder() { +- return wuffs_base__image_decoder::unique_ptr( +- wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder()); ++ static inline wuffs_base__hasher_bitvec256::unique_ptr ++ alloc_as__wuffs_base__hasher_bitvec256() { ++ return wuffs_base__hasher_bitvec256::unique_ptr( ++ wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12309,10 +13274,10 @@ struct wuffs_wbmp__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_wbmp__decoder__struct() = delete; +- wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete; +- wuffs_wbmp__decoder__struct& operator=( +- const wuffs_wbmp__decoder__struct&) = delete; ++ wuffs_sha256__hasher__struct() = delete; ++ wuffs_sha256__hasher__struct(const wuffs_sha256__hasher__struct&) = delete; ++ wuffs_sha256__hasher__struct& operator=( ++ const wuffs_sha256__hasher__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12332,120 +13297,68 @@ struct wuffs_wbmp__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_wbmp__decoder__initialize( ++ return wuffs_sha256__hasher__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__image_decoder* +- upcast_as__wuffs_base__image_decoder() { +- return (wuffs_base__image_decoder*)this; ++ inline wuffs_base__hasher_bitvec256* ++ upcast_as__wuffs_base__hasher_bitvec256() { ++ return (wuffs_base__hasher_bitvec256*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_wbmp__decoder__get_quirk(this, a_key); ++ return wuffs_sha256__hasher__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value); +- } +- +- inline wuffs_base__status +- decode_image_config( +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src); +- } +- +- inline wuffs_base__status +- decode_frame_config( +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src); +- } +- +- inline wuffs_base__status +- decode_frame( +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } +- +- inline wuffs_base__rect_ie_u32 +- frame_dirty_rect() const { +- return wuffs_wbmp__decoder__frame_dirty_rect(this); +- } +- +- inline uint32_t +- num_animation_loops() const { +- return wuffs_wbmp__decoder__num_animation_loops(this); +- } +- +- inline uint64_t +- num_decoded_frame_configs() const { +- return wuffs_wbmp__decoder__num_decoded_frame_configs(this); +- } +- +- inline uint64_t +- num_decoded_frames() const { +- return wuffs_wbmp__decoder__num_decoded_frames(this); +- } +- +- inline wuffs_base__status +- restart_frame( +- uint64_t a_index, +- uint64_t a_io_position) { +- return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_sha256__hasher__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__empty_struct +- set_report_metadata( +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report); +- } +- +- inline wuffs_base__status +- tell_me_more( +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_sha256__hasher__update(this, a_x); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_wbmp__decoder__history_retain_length(this); ++ inline wuffs_base__bitvec256 ++ update_bitvec256( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_sha256__hasher__update_bitvec256(this, a_x); + } + +- inline wuffs_base__range_ii_u64 +- workbuf_len() const { +- return wuffs_wbmp__decoder__workbuf_len(this); ++ inline wuffs_base__bitvec256 ++ checksum_bitvec256() const { ++ return wuffs_sha256__hasher__checksum_bitvec256(this); + } + + #endif // __cplusplus +-}; // struct wuffs_wbmp__decoder__struct ++}; // struct wuffs_sha256__hasher__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + ++extern const char wuffs_tga__error__bad_header[]; ++extern const char wuffs_tga__error__bad_run_length_encoding[]; ++extern const char wuffs_tga__error__truncated_input[]; ++extern const char wuffs_tga__error__unsupported_tga_file[]; ++ + // ---------------- Public Consts + ++#define WUFFS_TGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u ++ + // ---------------- Struct Declarations + +-typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher; ++typedef struct wuffs_tga__decoder__struct wuffs_tga__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -12460,14 +13373,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash32__hasher__initialize( +- wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__initialize( ++ wuffs_tga__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_xxhash32__hasher(void); ++sizeof__wuffs_tga__decoder(void); + + // ---------------- Allocs + +@@ -12477,53 +13390,107 @@ sizeof__wuffs_xxhash32__hasher(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_xxhash32__hasher* +-wuffs_xxhash32__hasher__alloc(void); ++wuffs_tga__decoder* ++wuffs_tga__decoder__alloc(void); + +-static inline wuffs_base__hasher_u32* +-wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) { +- return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc()); ++static inline wuffs_base__image_decoder* ++wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_tga__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__hasher_u32* +-wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32( +- wuffs_xxhash32__hasher* p) { +- return (wuffs_base__hasher_u32*)p; ++static inline wuffs_base__image_decoder* ++wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_tga__decoder* p) { ++ return (wuffs_base__image_decoder*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash32__hasher__get_quirk( +- const wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__get_quirk( ++ const wuffs_tga__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash32__hasher__set_quirk( +- wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__set_quirk( ++ wuffs_tga__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash32__hasher__update( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__update_u32( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_tga__decoder__frame_dirty_rect( ++ const wuffs_tga__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__checksum_u32( +- const wuffs_xxhash32__hasher* self); ++wuffs_tga__decoder__num_animation_loops( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frame_configs( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frames( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__restart_frame( ++ wuffs_tga__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_tga__decoder__set_report_metadata( ++ wuffs_tga__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__tell_me_more( ++ wuffs_tga__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_tga__decoder__workbuf_len( ++ const wuffs_tga__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -12538,7 +13505,7 @@ wuffs_xxhash32__hasher__checksum_u32( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_xxhash32__hasher__struct { ++struct wuffs_tga__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12549,36 +13516,72 @@ struct wuffs_xxhash32__hasher__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + +- uint32_t f_length_modulo_u32; +- bool f_length_overflows_u32; +- uint8_t f_padding0; +- uint8_t f_padding1; +- uint8_t f_buf_len; +- uint8_t f_buf_data[16]; +- uint32_t f_v0; +- uint32_t f_v1; +- uint32_t f_v2; +- uint32_t f_v3; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint8_t f_header_id_length; ++ uint8_t f_header_color_map_type; ++ uint8_t f_header_image_type; ++ uint16_t f_header_color_map_first_entry_index; ++ uint16_t f_header_color_map_length; ++ uint8_t f_header_color_map_entry_size; ++ uint8_t f_header_pixel_depth; ++ uint8_t f_header_image_descriptor; ++ bool f_opaque; ++ uint32_t f_scratch_bytes_per_pixel; ++ uint32_t f_src_bytes_per_pixel; ++ uint32_t f_src_pixfmt; ++ uint64_t f_frame_config_io_position; ++ wuffs_base__pixel_swizzler f_swizzler; ++ ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; + } private_impl; + ++ struct { ++ uint8_t f_dst_palette[1024]; ++ uint8_t f_src_palette[1024]; ++ uint8_t f_scratch[4]; ++ ++ struct { ++ uint32_t v_i; ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t v_dst_bytes_per_pixel; ++ uint32_t v_dst_x; ++ uint32_t v_dst_y; ++ uint64_t v_mark; ++ uint32_t v_num_pixels32; ++ uint32_t v_lit_length; ++ uint32_t v_run_length; ++ uint64_t v_num_dst_bytes; ++ uint64_t scratch; ++ } s_do_decode_frame; ++ } private_data; ++ + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_xxhash32__hasher__alloc()); ++ return unique_ptr(wuffs_tga__decoder__alloc()); + } + +- static inline wuffs_base__hasher_u32::unique_ptr +- alloc_as__wuffs_base__hasher_u32() { +- return wuffs_base__hasher_u32::unique_ptr( +- wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32()); ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12594,10 +13597,10 @@ struct wuffs_xxhash32__hasher__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_xxhash32__hasher__struct() = delete; +- wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete; +- wuffs_xxhash32__hasher__struct& operator=( +- const wuffs_xxhash32__hasher__struct&) = delete; ++ wuffs_tga__decoder__struct() = delete; ++ wuffs_tga__decoder__struct(const wuffs_tga__decoder__struct&) = delete; ++ wuffs_tga__decoder__struct& operator=( ++ const wuffs_tga__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12617,53 +13620,107 @@ struct wuffs_xxhash32__hasher__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_xxhash32__hasher__initialize( ++ return wuffs_tga__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__hasher_u32* +- upcast_as__wuffs_base__hasher_u32() { +- return (wuffs_base__hasher_u32*)this; ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_xxhash32__hasher__get_quirk(this, a_key); ++ return wuffs_tga__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value); ++ return wuffs_tga__decoder__set_quirk(this, a_key, a_value); + } + +- inline wuffs_base__empty_struct +- update( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash32__hasher__update(this, a_x); ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__decode_image_config(this, a_dst, a_src); + } + +- inline uint32_t +- update_u32( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash32__hasher__update_u32(this, a_x); ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__decode_frame_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_tga__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } ++ ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_tga__decoder__frame_dirty_rect(this); + } + + inline uint32_t +- checksum_u32() const { +- return wuffs_xxhash32__hasher__checksum_u32(this); ++ num_animation_loops() const { ++ return wuffs_tga__decoder__num_animation_loops(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_tga__decoder__num_decoded_frame_configs(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_tga__decoder__num_decoded_frames(this); ++ } ++ ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_tga__decoder__restart_frame(this, a_index, a_io_position); ++ } ++ ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_tga__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } ++ ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_tga__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_xxhash32__hasher__struct ++}; // struct wuffs_tga__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +@@ -12671,7 +13728,7 @@ struct wuffs_xxhash32__hasher__struct { + + // ---------------- Struct Declarations + +-typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher; ++typedef struct wuffs_vp8__placeholder__struct wuffs_vp8__placeholder; + + #ifdef __cplusplus + extern "C" { +@@ -12686,14 +13743,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash64__hasher__initialize( +- wuffs_xxhash64__hasher* self, ++wuffs_vp8__placeholder__initialize( ++ wuffs_vp8__placeholder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_xxhash64__hasher(void); ++sizeof__wuffs_vp8__placeholder(void); + + // ---------------- Allocs + +@@ -12703,54 +13760,13 @@ sizeof__wuffs_xxhash64__hasher(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_xxhash64__hasher* +-wuffs_xxhash64__hasher__alloc(void); +- +-static inline wuffs_base__hasher_u64* +-wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) { +- return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc()); +-} ++wuffs_vp8__placeholder* ++wuffs_vp8__placeholder__alloc(void); + + // ---------------- Upcasts + +-static inline wuffs_base__hasher_u64* +-wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64( +- wuffs_xxhash64__hasher* p) { +- return (wuffs_base__hasher_u64*)p; +-} +- + // ---------------- Public Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__get_quirk( +- const wuffs_xxhash64__hasher* self, +- uint32_t a_key); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash64__hasher__set_quirk( +- wuffs_xxhash64__hasher* self, +- uint32_t a_key, +- uint64_t a_value); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash64__hasher__update( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__update_u64( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__checksum_u64( +- const wuffs_xxhash64__hasher* self); +- + #ifdef __cplusplus + } // extern "C" + #endif +@@ -12764,7 +13780,7 @@ wuffs_xxhash64__hasher__checksum_u64( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_xxhash64__hasher__struct { ++struct wuffs_vp8__placeholder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12775,37 +13791,20 @@ struct wuffs_xxhash64__hasher__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; + wuffs_base__vtable null_vtable; + +- uint64_t f_length_modulo_u64; +- bool f_length_overflows_u64; +- uint8_t f_padding0; +- uint8_t f_padding1; +- uint8_t f_padding2; +- uint32_t f_buf_len; +- uint8_t f_buf_data[32]; +- uint64_t f_v0; +- uint64_t f_v1; +- uint64_t f_v2; +- uint64_t f_v3; ++ uint32_t f_placeholder; + } private_impl; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_xxhash64__hasher__alloc()); +- } +- +- static inline wuffs_base__hasher_u64::unique_ptr +- alloc_as__wuffs_base__hasher_u64() { +- return wuffs_base__hasher_u64::unique_ptr( +- wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64()); ++ return unique_ptr(wuffs_vp8__placeholder__alloc()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12821,10 +13820,10 @@ struct wuffs_xxhash64__hasher__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_xxhash64__hasher__struct() = delete; +- wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete; +- wuffs_xxhash64__hasher__struct& operator=( +- const wuffs_xxhash64__hasher__struct&) = delete; ++ wuffs_vp8__placeholder__struct() = delete; ++ wuffs_vp8__placeholder__struct(const wuffs_vp8__placeholder__struct&) = delete; ++ wuffs_vp8__placeholder__struct& operator=( ++ const wuffs_vp8__placeholder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12844,9372 +13843,9377 @@ struct wuffs_xxhash64__hasher__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_xxhash64__hasher__initialize( ++ return wuffs_vp8__placeholder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__hasher_u64* +- upcast_as__wuffs_base__hasher_u64() { +- return (wuffs_base__hasher_u64*)this; +- } ++#endif // __cplusplus ++}; // struct wuffs_vp8__placeholder__struct + +- inline uint64_t +- get_quirk( +- uint32_t a_key) const { +- return wuffs_xxhash64__hasher__get_quirk(this, a_key); +- } ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- inline wuffs_base__status +- set_quirk( +- uint32_t a_key, +- uint64_t a_value) { +- return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__empty_struct +- update( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash64__hasher__update(this, a_x); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +- inline uint64_t +- update_u64( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash64__hasher__update_u64(this, a_x); +- } ++// ---------------- Status Codes + +- inline uint64_t +- checksum_u64() const { +- return wuffs_xxhash64__hasher__checksum_u64(this); +- } ++extern const char wuffs_wbmp__error__bad_header[]; ++extern const char wuffs_wbmp__error__truncated_input[]; + +-#endif // __cplusplus +-}; // struct wuffs_xxhash64__hasher__struct ++// ---------------- Public Consts + +-#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) ++// ---------------- Struct Declarations + +-#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder; + +-// ---------------- Auxiliary - Base ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// Auxiliary code is discussed at +-// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md ++// ---------------- Public Initializer Prototypes + +-#include ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-#include ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_wbmp__decoder__initialize( ++ wuffs_wbmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-namespace wuffs_aux { ++size_t ++sizeof__wuffs_wbmp__decoder(void); + +-using IOBuffer = wuffs_base__io_buffer; ++// ---------------- Allocs + +-// MemOwner represents ownership of some memory. Dynamically allocated memory +-// (e.g. from malloc or new) is typically paired with free or delete, invoked +-// when the std::unique_ptr is destroyed. Statically allocated memory might use +-// MemOwner(nullptr, &free), even if that statically allocated memory is not +-// nullptr, since calling free(nullptr) is a no-op. +-using MemOwner = std::unique_ptr; ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-namespace sync_io { ++wuffs_wbmp__decoder* ++wuffs_wbmp__decoder__alloc(void); + +-// -------- ++static inline wuffs_base__image_decoder* ++wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc()); ++} + +-// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array. +-// It owns that backing array and will free it in its destructor. +-// +-// The array size can be explicitly extended (by calling the grow method) but, +-// unlike a C++ std::vector, there is no implicit extension (e.g. by calling +-// std::vector::insert) and its maximum size is capped by the max_incl +-// constructor argument. +-// +-// It contains an IOBuffer-typed field whose reader side provides access to +-// previously written bytes and whose writer side provides access to the +-// allocated but not-yet-written-to slack space. For Go programmers, this slack +-// space is roughly analogous to the s[len(s):cap(s)] space of a slice s. +-class DynIOBuffer { +- public: +- enum GrowResult { +- OK = 0, +- FailedMaxInclExceeded = 1, +- FailedOutOfMemory = 2, +- }; ++// ---------------- Upcasts + +- // m_buf holds the dynamically sized byte array and its read/write indexes: +- // - m_buf.meta.wi is roughly analogous to a Go slice's length. +- // - m_buf.data.len is roughly analogous to a Go slice's capacity. It is +- // also equal to the m_buf.data.ptr malloc/realloc size. +- // +- // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as +- // they are conceptually private to this class), but they can modify the +- // bytes referenced by that pointer-length pair (e.g. compactions). +- IOBuffer m_buf; ++static inline wuffs_base__image_decoder* ++wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_wbmp__decoder* p) { ++ return (wuffs_base__image_decoder*)p; ++} + +- // m_max_incl is an inclusive upper bound on the backing array size. +- const uint64_t m_max_incl; ++// ---------------- Public Function Prototypes + +- // Constructor and destructor. +- explicit DynIOBuffer(uint64_t max_incl); +- ~DynIOBuffer(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__get_quirk( ++ const wuffs_wbmp__decoder* self, ++ uint32_t a_key); + +- // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be +- // used after a drop call. It just restarts from zero. +- void drop(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__set_quirk( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +- // grow ensures that the byte array size is at least min_incl and at most +- // max_incl. It returns FailedMaxInclExceeded if that would require +- // allocating more than max_incl bytes, including the case where (min_incl > +- // max_incl). It returns FailedOutOfMemory if memory allocation failed. +- GrowResult grow(uint64_t min_incl); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- private: +- // Delete the copy and assign constructors. +- DynIOBuffer(const DynIOBuffer&) = delete; +- DynIOBuffer& operator=(const DynIOBuffer&) = delete; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- static uint64_t round_up(uint64_t min_incl, uint64_t max_incl); +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_wbmp__decoder__frame_dirty_rect( ++ const wuffs_wbmp__decoder* self); + +-class Input { +- public: +- virtual ~Input(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_wbmp__decoder__num_animation_loops( ++ const wuffs_wbmp__decoder* self); + +- virtual IOBuffer* BringsItsOwnIOBuffer(); +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length) = 0; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__num_decoded_frame_configs( ++ const wuffs_wbmp__decoder* self); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__num_decoded_frames( ++ const wuffs_wbmp__decoder* self); + +-// FileInput is an Input that reads from a file source. +-// +-// It does not take responsibility for closing the file when done. +-class FileInput : public Input { +- public: +- FileInput(FILE* f); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__restart_frame( ++ wuffs_wbmp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); + +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_wbmp__decoder__set_report_metadata( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); + +- private: +- FILE* m_f; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__tell_me_more( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); + +- // Delete the copy and assign constructors. +- FileInput(const FileInput&) = delete; +- FileInput& operator=(const FileInput&) = delete; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_wbmp__decoder__workbuf_len( ++ const wuffs_wbmp__decoder* self); + +-// -------- ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-// MemoryInput is an Input that reads from an in-memory source. ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. + // +-// It does not take responsibility for freeing the memory when done. +-class MemoryInput : public Input { +- public: +- MemoryInput(const char* ptr, size_t len); +- MemoryInput(const uint8_t* ptr, size_t len); ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- virtual IOBuffer* BringsItsOwnIOBuffer(); +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length); ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- private: +- IOBuffer m_io; ++struct wuffs_wbmp__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +- // Delete the copy and assign constructors. +- MemoryInput(const MemoryInput&) = delete; +- MemoryInput& operator=(const MemoryInput&) = delete; +-}; ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable null_vtable; + +-// -------- ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint64_t f_frame_config_io_position; ++ wuffs_base__pixel_swizzler f_swizzler; + +-} // namespace sync_io ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ } private_impl; + +-} // namespace wuffs_aux ++ struct { ++ struct { ++ uint32_t v_i; ++ uint32_t v_p; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t v_dst_bytes_per_pixel; ++ uint32_t v_dst_x; ++ uint32_t v_dst_y; ++ uint8_t v_src[1]; ++ uint8_t v_c8; ++ } s_do_decode_frame; ++ } private_data; + +-// ---------------- Auxiliary - CBOR ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +-namespace wuffs_aux { ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-struct DecodeCborResult { +- DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0); ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_wbmp__decoder__alloc()); ++ } + +- std::string error_message; +- uint64_t cursor_position; +-}; ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-class DecodeCborCallbacks { +- public: +- virtual ~DecodeCborCallbacks(); ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_wbmp__decoder__struct() = delete; ++ wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete; ++ wuffs_wbmp__decoder__struct& operator=( ++ const wuffs_wbmp__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +- // AppendXxx are called for leaf nodes: literals, numbers, strings, etc. ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +- virtual std::string AppendNull() = 0; +- virtual std::string AppendUndefined() = 0; +- virtual std::string AppendBool(bool val) = 0; +- virtual std::string AppendF64(double val) = 0; +- virtual std::string AppendI64(int64_t val) = 0; +- virtual std::string AppendU64(uint64_t val) = 0; +- virtual std::string AppendByteString(std::string&& val) = 0; +- virtual std::string AppendTextString(std::string&& val) = 0; +- virtual std::string AppendMinus1MinusX(uint64_t val) = 0; +- virtual std::string AppendCborSimpleValue(uint8_t val) = 0; +- virtual std::string AppendCborTag(uint64_t val) = 0; ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_wbmp__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } + +- // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR +- // maps (dictionaries). +- // +- // The flags bits combine exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT +- // and exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } + +- virtual std::string Push(uint32_t flags) = 0; +- virtual std::string Pop(uint32_t flags) = 0; ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_wbmp__decoder__get_quirk(this, a_key); ++ } + +- // Done is always the last Callback method called by DecodeCbor, whether or +- // not parsing the input as CBOR encountered an error. Even when successful, +- // trailing data may remain in input and buffer. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeCbor may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op. +- virtual void // +- Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer); +-}; ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value); ++ } + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src); ++ } + +-// DecodeCborArgQuirks wraps an optional argument to DecodeCbor. +-struct DecodeCborArgQuirks { +- explicit DecodeCborArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeCborArgQuirks(uint32_t* ptr, size_t len); ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src); ++ } + +- // DefaultValue returns an empty slice. +- static DecodeCborArgQuirks DefaultValue(); ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } + +- wuffs_base__slice_u32 repr; +-}; ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_wbmp__decoder__frame_dirty_rect(this); ++ } + +-// DecodeCbor calls callbacks based on the CBOR-formatted data in input. +-// +-// On success, the returned error_message is empty and cursor_position counts +-// the number of bytes consumed. On failure, error_message is non-empty and +-// cursor_position is the location of the error. That error may be a content +-// error (invalid CBOR) or an input error (e.g. network failure). +-DecodeCborResult // +-DecodeCbor(DecodeCborCallbacks& callbacks, +- sync_io::Input& input, +- DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue()); ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_wbmp__decoder__num_animation_loops(this); ++ } + +-} // namespace wuffs_aux ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_wbmp__decoder__num_decoded_frame_configs(this); ++ } + +-// ---------------- Auxiliary - Image ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_wbmp__decoder__num_decoded_frames(this); ++ } + +-namespace wuffs_aux { ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position); ++ } + +-struct DecodeImageResult { +- DecodeImageResult(MemOwner&& pixbuf_mem_owner0, +- wuffs_base__pixel_buffer pixbuf0, +- std::string&& error_message0); +- DecodeImageResult(std::string&& error_message0); ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } + +- MemOwner pixbuf_mem_owner; +- wuffs_base__pixel_buffer pixbuf; +- std::string error_message; +-}; ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } + +-// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always +-// called in this order: +-// 1. SelectDecoder +-// 2. HandleMetadata +-// 3. SelectPixfmt +-// 4. AllocPixbuf +-// 5. AllocWorkbuf +-// 6. Done +-// +-// It may return early - the third callback might not be invoked if the second +-// one fails - but the final callback (Done) is always invoked. +-class DecodeImageCallbacks { +- public: +- // AllocPixbufResult holds a memory allocation (the result of malloc or new, +- // a statically allocated pointer, etc), or an error message. The memory is +- // de-allocated when mem_owner goes out of scope and is destroyed. +- struct AllocPixbufResult { +- AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0); +- AllocPixbufResult(std::string&& error_message0); ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_wbmp__decoder__workbuf_len(this); ++ } + +- MemOwner mem_owner; +- wuffs_base__pixel_buffer pixbuf; +- std::string error_message; +- }; ++#endif // __cplusplus ++}; // struct wuffs_wbmp__decoder__struct + +- // AllocWorkbufResult holds a memory allocation (the result of malloc or new, +- // a statically allocated pointer, etc), or an error message. The memory is +- // de-allocated when mem_owner goes out of scope and is destroyed. +- struct AllocWorkbufResult { +- AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0); +- AllocWorkbufResult(std::string&& error_message0); ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- MemOwner mem_owner; +- wuffs_base__slice_u8 workbuf; +- std::string error_message; +- }; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +- virtual ~DecodeImageCallbacks(); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC) + +- // SelectDecoder returns the image decoder for the input data's file format. +- // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat). +- // +- // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF], +- // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs' +- // standard library did not recognize the image format but if SelectDecoder +- // was overridden, it may examine the input data's starting bytes and still +- // provide its own image decoder, e.g. for an exotic image file format that's +- // not in Wuffs' standard library. The prefix_etc fields have the same +- // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder +- // implementations should not modify prefix_data's contents. +- // +- // SelectDecoder might be called more than once, since some image file +- // formats can wrap others. For example, a nominal BMP file can actually +- // contain a JPEG or a PNG. +- // +- // The default SelectDecoder accepts the FOURCC codes listed below. For +- // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance +- // of the ETC file format is optional (for each value of ETC) and depends on +- // the corresponding module to be enabled at compile time (i.e. #define'ing +- // WUFFS_CONFIG__MODULE__ETC). +- // - WUFFS_BASE__FOURCC__BMP +- // - WUFFS_BASE__FOURCC__GIF +- // - WUFFS_BASE__FOURCC__JPEG +- // - WUFFS_BASE__FOURCC__NIE +- // - WUFFS_BASE__FOURCC__NPBM +- // - WUFFS_BASE__FOURCC__PNG +- // - WUFFS_BASE__FOURCC__TGA +- // - WUFFS_BASE__FOURCC__WBMP +- virtual wuffs_base__image_decoder::unique_ptr // +- SelectDecoder(uint32_t fourcc, +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed); +- +- // HandleMetadata acknowledges image metadata. minfo.flavor will be one of: +- // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH +- // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED +- // If it is ETC__METADATA_RAW_ETC then raw contains the metadata bytes. Those +- // bytes should not be retained beyond the the HandleMetadata call. +- // +- // minfo.metadata__fourcc() will typically match one of the +- // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM | +- // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC +- // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA. +- // +- // It returns an error message, or an empty string on success. +- virtual std::string // +- HandleMetadata(const wuffs_base__more_information& minfo, +- wuffs_base__slice_u8 raw); +- +- // SelectPixfmt returns the destination pixel format for AllocPixbuf. It +- // should return wuffs_base__make_pixel_format(etc) called with one of: +- // - WUFFS_BASE__PIXEL_FORMAT__BGR_565 +- // - WUFFS_BASE__PIXEL_FORMAT__BGR +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__RGB +- // - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL +- // or return image_config.pixcfg.pixel_format(). The latter means to use the +- // image file's natural pixel format. For example, GIF images' natural pixel +- // format is an indexed one. +- // +- // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat). +- // +- // The default SelectPixfmt implementation returns +- // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which +- // is 4 bytes per pixel (8 bits per channel × 4 channels). +- virtual wuffs_base__pixel_format // +- SelectPixfmt(const wuffs_base__image_config& image_config); ++// ---------------- Status Codes + +- // AllocPixbuf allocates the pixel buffer. +- // +- // allow_uninitialized_memory will be true if a valid background_color was +- // passed to DecodeImage, since the pixel buffer's contents will be +- // overwritten with that color after AllocPixbuf returns. +- // +- // The default AllocPixbuf implementation allocates either uninitialized or +- // zeroed memory. Zeroed memory typically corresponds to filling with opaque +- // black or transparent black, depending on the pixel format. +- virtual AllocPixbufResult // +- AllocPixbuf(const wuffs_base__image_config& image_config, +- bool allow_uninitialized_memory); ++extern const char wuffs_webp__error__bad_huffman_code_over_subscribed[]; ++extern const char wuffs_webp__error__bad_huffman_code_under_subscribed[]; ++extern const char wuffs_webp__error__bad_huffman_code[]; ++extern const char wuffs_webp__error__bad_back_reference[]; ++extern const char wuffs_webp__error__bad_color_cache[]; ++extern const char wuffs_webp__error__bad_header[]; ++extern const char wuffs_webp__error__bad_transform[]; ++extern const char wuffs_webp__error__short_chunk[]; ++extern const char wuffs_webp__error__truncated_input[]; ++extern const char wuffs_webp__error__unsupported_number_of_huffman_groups[]; ++extern const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[]; ++extern const char wuffs_webp__error__unsupported_webp_file[]; + +- // AllocWorkbuf allocates the work buffer. The allocated buffer's length +- // should be at least len_range.min_incl, but larger allocations (up to +- // len_range.max_incl) may have better performance (by using more memory). +- // +- // The default AllocWorkbuf implementation allocates len_range.max_incl bytes +- // of either uninitialized or zeroed memory. +- virtual AllocWorkbufResult // +- AllocWorkbuf(wuffs_base__range_ii_u64 len_range, +- bool allow_uninitialized_memory); ++// ---------------- Public Consts + +- // Done is always the last Callback method called by DecodeImage, whether or +- // not parsing the input encountered an error. Even when successful, trailing +- // data may remain in input and buffer. +- // +- // The image_decoder is the one returned by SelectDecoder (if SelectDecoder +- // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr, +- // ownership moves to the Done implementation. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeImage may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op, other than running the +- // image_decoder unique_ptr destructor. +- virtual void // +- Done(DecodeImageResult& result, +- sync_io::Input& input, +- IOBuffer& buffer, +- wuffs_base__image_decoder::unique_ptr image_decoder); +-}; ++#define WUFFS_WEBP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-extern const char DecodeImage_BufferIsTooShort[]; +-extern const char DecodeImage_MaxInclDimensionExceeded[]; +-extern const char DecodeImage_MaxInclMetadataLengthExceeded[]; +-extern const char DecodeImage_OutOfMemory[]; +-extern const char DecodeImage_UnexpectedEndOfFile[]; +-extern const char DecodeImage_UnsupportedImageFormat[]; +-extern const char DecodeImage_UnsupportedMetadata[]; +-extern const char DecodeImage_UnsupportedPixelBlend[]; +-extern const char DecodeImage_UnsupportedPixelConfiguration[]; +-extern const char DecodeImage_UnsupportedPixelFormat[]; ++// ---------------- Struct Declarations + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++typedef struct wuffs_webp__decoder__struct wuffs_webp__decoder; + +-// DecodeImageArgQuirks wraps an optional argument to DecodeImage. +-struct DecodeImageArgQuirks { +- explicit DecodeImageArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeImageArgQuirks(uint32_t* ptr, size_t len); ++#ifdef __cplusplus ++extern "C" { ++#endif + +- // DefaultValue returns an empty slice. +- static DecodeImageArgQuirks DefaultValue(); ++// ---------------- Public Initializer Prototypes + +- wuffs_base__slice_u32 repr; +-}; ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// DecodeImageArgFlags wraps an optional argument to DecodeImage. +-struct DecodeImageArgFlags { +- explicit DecodeImageArgFlags(uint64_t repr0); ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_webp__decoder__initialize( ++ wuffs_webp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +- // DefaultValue returns 0. +- static DecodeImageArgFlags DefaultValue(); ++size_t ++sizeof__wuffs_webp__decoder(void); + +- // TODO: support all of the REPORT_METADATA_ETC flags, not just CHRM, EXIF, +- // GAMA, ICCP, KVP, SRGB and XMP. ++// ---------------- Allocs + +- // Background Color. +- static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001; +- // Primary Chromaticities and White Point. +- static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002; +- // Exchangeable Image File Format. +- static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004; +- // Gamma Correction. +- static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008; +- // International Color Consortium Profile. +- static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010; +- // Key-Value Pair. +- // +- // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the +- // HandleMetadata callback, the raw argument contains UTF-8 strings. +- static constexpr uint64_t REPORT_METADATA_KVP = 0x0020; +- // Modification Time. +- static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040; +- // Offset (2-Dimensional). +- static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080; +- // Physical Dimensions. +- static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100; +- // Standard Red Green Blue (Rendering Intent). +- static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200; +- // Extensible Metadata Platform. +- static constexpr uint64_t REPORT_METADATA_XMP = 0x0400; ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +- uint64_t repr; +-}; ++wuffs_webp__decoder* ++wuffs_webp__decoder__alloc(void); + +-// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage. +-struct DecodeImageArgPixelBlend { +- explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0); ++static inline wuffs_base__image_decoder* ++wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_webp__decoder__alloc()); ++} + +- // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC. +- static DecodeImageArgPixelBlend DefaultValue(); ++// ---------------- Upcasts + +- wuffs_base__pixel_blend repr; +-}; ++static inline wuffs_base__image_decoder* ++wuffs_webp__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_webp__decoder* p) { ++ return (wuffs_base__image_decoder*)p; ++} + +-// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage. +-struct DecodeImageArgBackgroundColor { +- explicit DecodeImageArgBackgroundColor( +- wuffs_base__color_u32_argb_premul repr0); ++// ---------------- Public Function Prototypes + +- // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul. +- static DecodeImageArgBackgroundColor DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__get_quirk( ++ const wuffs_webp__decoder* self, ++ uint32_t a_key); + +- wuffs_base__color_u32_argb_premul repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__set_quirk( ++ wuffs_webp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage. +-struct DecodeImageArgMaxInclDimension { +- explicit DecodeImageArgMaxInclDimension(uint32_t repr0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_image_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels. +- static DecodeImageArgMaxInclDimension DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_frame_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- uint32_t repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +-// DecodeImageArgMaxInclMetadataLength wraps an optional argument to +-// DecodeImage. +-struct DecodeImageArgMaxInclMetadataLength { +- explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_webp__decoder__frame_dirty_rect( ++ const wuffs_webp__decoder* self); + +- // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB. +- static DecodeImageArgMaxInclMetadataLength DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_webp__decoder__num_animation_loops( ++ const wuffs_webp__decoder* self); + +- uint64_t repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__num_decoded_frame_configs( ++ const wuffs_webp__decoder* self); + +-// DecodeImage decodes the image data in input. A variety of image file formats +-// can be decoded, depending on what callbacks.SelectDecoder returns. +-// +-// For animated formats, only the first frame is returned, since the API is +-// simpler for synchronous I/O and having DecodeImage only return when +-// completely done, but rendering animation often involves handling other +-// events in between animation frames. To decode multiple frames of animated +-// images, or for asynchronous I/O (e.g. when decoding an image streamed over +-// the network), use Wuffs' lower level C API instead of its higher level, +-// simplified C++ API (the wuffs_aux API). +-// +-// The DecodeImageResult's fields depend on whether decoding succeeded: +-// - On total success, the error_message is empty and pixbuf.pixcfg.is_valid() +-// is true. +-// - On partial success (e.g. the input file was truncated but we are still +-// able to decode some of the pixels), error_message is non-empty but +-// pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to +-// accept or reject partial success. +-// - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid() +-// is false. +-// +-// The callbacks allocate the pixel buffer memory and work buffer memory. On +-// success, pixel buffer memory ownership is passed to the DecodeImage caller +-// as the returned pixbuf_mem_owner. Regardless of success or failure, the work +-// buffer memory is deleted. +-// +-// The pixel_blend (one of the constants listed below) determines how to +-// composite the decoded image over the pixel buffer's original pixels (as +-// returned by callbacks.AllocPixbuf): +-// - WUFFS_BASE__PIXEL_BLEND__SRC +-// - WUFFS_BASE__PIXEL_BLEND__SRC_OVER +-// +-// The background_color is used to fill the pixel buffer after +-// callbacks.AllocPixbuf returns, if it is valid in the +-// wuffs_base__color_u32_argb_premul__is_valid sense. The default value, +-// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater +-// than its Alpha channel value (0x00). A valid background_color will typically +-// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might +-// still be visible on partial (not total) success or when pixel_blend is +-// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque. +-// +-// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's +-// width or height is greater than max_incl_dimension or if any opted-in (via +-// flags bits) metadata is longer than max_incl_metadata_length. +-DecodeImageResult // +-DecodeImage(DecodeImageCallbacks& callbacks, +- sync_io::Input& input, +- DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(), +- DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(), +- DecodeImageArgPixelBlend pixel_blend = +- DecodeImageArgPixelBlend::DefaultValue(), +- DecodeImageArgBackgroundColor background_color = +- DecodeImageArgBackgroundColor::DefaultValue(), +- DecodeImageArgMaxInclDimension max_incl_dimension = +- DecodeImageArgMaxInclDimension::DefaultValue(), +- DecodeImageArgMaxInclMetadataLength max_incl_metadata_length = +- DecodeImageArgMaxInclMetadataLength::DefaultValue()); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__num_decoded_frames( ++ const wuffs_webp__decoder* self); + +-} // namespace wuffs_aux ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__restart_frame( ++ wuffs_webp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); + +-// ---------------- Auxiliary - JSON ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_webp__decoder__set_report_metadata( ++ wuffs_webp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); + +-namespace wuffs_aux { ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__tell_me_more( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); + +-struct DecodeJsonResult { +- DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_webp__decoder__workbuf_len( ++ const wuffs_webp__decoder* self); + +- std::string error_message; +- uint64_t cursor_position; +-}; ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-class DecodeJsonCallbacks { +- public: +- virtual ~DecodeJsonCallbacks(); ++// ---------------- Struct Definitions + +- // AppendXxx are called for leaf nodes: literals, numbers and strings. For +- // strings, the Callbacks implementation is responsible for tracking map keys +- // versus other values. ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- virtual std::string AppendNull() = 0; +- virtual std::string AppendBool(bool val) = 0; +- virtual std::string AppendF64(double val) = 0; +- virtual std::string AppendI64(int64_t val) = 0; +- virtual std::string AppendTextString(std::string&& val) = 0; ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- // Push and Pop are called for container nodes: JSON arrays (lists) and JSON +- // objects (dictionaries). ++struct wuffs_webp__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. + // +- // The flags bits combine exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT +- // and exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +- virtual std::string Push(uint32_t flags) = 0; +- virtual std::string Pop(uint32_t flags) = 0; ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable null_vtable; + +- // Done is always the last Callback method called by DecodeJson, whether or +- // not parsing the input as JSON encountered an error. Even when successful, +- // trailing data may remain in input and buffer. See "Unintuitive JSON +- // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON +- // parsing and when it stops. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeJson may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op. +- virtual void // +- Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer); +-}; ++ uint32_t f_pixfmt; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint8_t f_code_length_code_lengths[19]; ++ bool f_sub_chunk_has_padding; ++ uint64_t f_frame_config_io_position; ++ uint32_t f_riff_chunk_length; ++ uint32_t f_sub_chunk_length; ++ uint32_t f_bits; ++ uint32_t f_n_bits; ++ bool f_seen_transform[4]; ++ uint8_t f_transform_type[4]; ++ uint8_t f_transform_tile_size_log2[4]; ++ uint32_t f_n_transforms; ++ uint32_t f_color_cache_bits; ++ uint32_t f_overall_color_cache_bits; ++ uint32_t f_overall_tile_size_log2; ++ uint32_t f_overall_n_huffman_groups; ++ uint32_t f_ht_n_symbols; ++ uint32_t f_ht_code_lengths_remaining; ++ uint32_t f_color_indexing_palette_size; ++ uint32_t f_color_indexing_width; ++ uint32_t f_workbuf_offset_for_transform[4]; ++ uint32_t f_workbuf_offset_for_color_indexing; ++ wuffs_base__pixel_swizzler f_swizzler; + +-extern const char DecodeJson_BadJsonPointer[]; +-extern const char DecodeJson_NoMatch[]; ++ uint32_t p_decode_huffman_groups; ++ uint32_t p_decode_huffman_tree; ++ uint32_t p_decode_huffman_tree_simple; ++ uint32_t p_decode_code_length_code_lengths; ++ uint32_t p_build_code_lengths; ++ uint32_t p_decode_pixels_slow; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_do_decode_image_config_limited; ++ uint32_t p_do_decode_image_config_limited_vp8l; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_transform; ++ uint32_t p_decode_color_cache_parameters; ++ uint32_t p_decode_hg_table; ++ uint32_t p_decode_pixels; ++ } private_impl; + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++ struct { ++ uint8_t f_palette[1024]; ++ uint32_t f_color_cache[2048]; ++ uint16_t f_codes[2328]; ++ uint16_t f_code_lengths[2328]; ++ uint16_t f_code_lengths_huffman_nodes[37]; ++ uint16_t f_huffman_nodes[256][6267]; + +-// DecodeJsonArgQuirks wraps an optional argument to DecodeJson. +-struct DecodeJsonArgQuirks { +- explicit DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeJsonArgQuirks(uint32_t* ptr, size_t len); ++ struct { ++ uint32_t v_hg; ++ uint32_t v_ht; ++ } s_decode_huffman_groups; ++ struct { ++ uint32_t v_use_second_symbol; ++ uint32_t v_first_symbol_n_bits; ++ uint32_t v_symbol0; ++ uint32_t v_base_offset; ++ } s_decode_huffman_tree_simple; ++ struct { ++ uint32_t v_n_codes; ++ uint32_t v_i; ++ } s_decode_code_length_code_lengths; ++ struct { ++ uint32_t v_length_n_bits; ++ uint16_t v_prev_code_length; ++ uint32_t v_s; ++ uint32_t v_s_max; ++ uint16_t v_node; ++ uint16_t v_repeat_value; ++ uint32_t v_repeat_n_bits; ++ } s_build_code_lengths; ++ struct { ++ uint64_t v_p; ++ uint64_t v_p_max; ++ uint32_t v_tile_size_log2; ++ uint32_t v_width_in_tiles; ++ uint32_t v_x; ++ uint32_t v_y; ++ uint32_t v_hg; ++ uint16_t v_node; ++ uint32_t v_color; ++ uint32_t v_back_ref_len_n_bits; ++ uint32_t v_back_ref_len_minus_1; ++ uint32_t v_back_ref_dist_n_bits; ++ uint32_t v_back_ref_dist_premap_minus_1; ++ uint64_t v_color_cache_p; ++ } s_decode_pixels_slow; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config_limited; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config_limited_vp8l; ++ struct { ++ uint32_t v_width; ++ } s_do_decode_frame; ++ struct { ++ uint32_t v_transform_type; ++ uint32_t v_tile_size_log2; ++ } s_decode_transform; ++ struct { ++ uint32_t v_tile_size_log2; ++ } s_decode_hg_table; ++ } private_data; + +- // DefaultValue returns an empty slice. +- static DecodeJsonArgQuirks DefaultValue(); ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +- wuffs_base__slice_u32 repr; +-}; ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson. +-struct DecodeJsonArgJsonPointer { +- explicit DecodeJsonArgJsonPointer(std::string repr0); ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_webp__decoder__alloc()); ++ } + +- // DefaultValue returns an empty string. +- static DecodeJsonArgJsonPointer DefaultValue(); ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- std::string repr; +-}; ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_webp__decoder__struct() = delete; ++ wuffs_webp__decoder__struct(const wuffs_webp__decoder__struct&) = delete; ++ wuffs_webp__decoder__struct& operator=( ++ const wuffs_webp__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +-// DecodeJson calls callbacks based on the JSON-formatted data in input. +-// +-// On success, the returned error_message is empty and cursor_position counts +-// the number of bytes consumed. On failure, error_message is non-empty and +-// cursor_position is the location of the error. That error may be a content +-// error (invalid JSON) or an input error (e.g. network failure). +-// +-// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks +-// run for the input's sub-node that matches the query. DecodeJson_NoMatch is +-// returned if no matching sub-node was found. The empty query matches the +-// input's root node, consistent with JSON Pointer semantics. +-// +-// The JSON Pointer implementation is greedy: duplicate keys are not rejected +-// but only the first match for each '/'-separated fragment is followed. +-DecodeJsonResult // +-DecodeJson(DecodeJsonCallbacks& callbacks, +- sync_io::Input& input, +- DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(), +- DecodeJsonArgJsonPointer json_pointer = +- DecodeJsonArgJsonPointer::DefaultValue()); ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +-} // namespace wuffs_aux ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_webp__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } + +-#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } + +-// ‼ WUFFS C HEADER ENDS HERE. +-#ifdef WUFFS_IMPLEMENTATION ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_webp__decoder__get_quirk(this, a_key); ++ } + +-#ifdef __cplusplus +-extern "C" { +-#endif ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_webp__decoder__set_quirk(this, a_key, a_value); ++ } + +-// ---------------- Fundamentals ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__decode_image_config(this, a_dst, a_src); ++ } + +-// WUFFS_BASE__MAGIC is a magic number to check that initializers are called. +-// It's not foolproof, given C doesn't automatically zero memory before use, +-// but it should catch 99.99% of cases. +-// +-// Its (non-zero) value is arbitrary, based on md5sum("wuffs"). +-#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__decode_frame_config(this, a_dst, a_src); ++ } + +-// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable +-// error was previously encountered. +-// +-// Its (non-zero) value is arbitrary, based on md5sum("disabled"). +-#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2) ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_webp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } + +-// Use switch cases for coroutine suspension points, similar to the technique +-// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html +-// +-// The implicit fallthrough is intentional. +-// +-// We use trivial macros instead of an explicit assignment and case statement +-// so that clang-format doesn't get confused by the unusual "case"s. +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ +- coro_susp_point = n; \ +- case n:; ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_webp__decoder__frame_dirty_rect(this); ++ } + +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ +- if (!status.repr) { \ +- goto ok; \ +- } else if (*status.repr != '$') { \ +- goto exit; \ +- } \ +- coro_susp_point = n; \ +- goto suspend; \ +- case n:; ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_webp__decoder__num_animation_loops(this); ++ } + +-// The "defined(__clang__)" isn't redundant. While vanilla clang defines +-// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +-#if defined(__GNUC__) || defined(__clang__) +-#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) +-#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) +-#else +-#define WUFFS_BASE__LIKELY(expr) (expr) +-#define WUFFS_BASE__UNLIKELY(expr) (expr) +-#endif ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_webp__decoder__num_decoded_frame_configs(this); ++ } + +-// -------- ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_webp__decoder__num_decoded_frames(this); ++ } + +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wcast-qual" +-#endif +-static inline uint8_t* // +-wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) { +- return (uint8_t*)ptr; +-} +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_webp__decoder__restart_frame(this, a_index, a_io_position); ++ } + +-// -------- ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_webp__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } + +-static inline wuffs_base__empty_struct // +-wuffs_base__ignore_status(wuffs_base__status z) { +- return wuffs_base__make_empty_struct(); +-} ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } + +-static inline wuffs_base__status // +-wuffs_base__status__ensure_not_a_suspension(wuffs_base__status z) { +- if (z.repr && (*z.repr == '$')) { +- z.repr = wuffs_base__error__cannot_return_a_suspension; ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_webp__decoder__workbuf_len(this); + } +- return z; +-} + +-// -------- ++#endif // __cplusplus ++}; // struct wuffs_webp__decoder__struct + +-// wuffs_base__iterate_total_advance returns the exclusive pointer-offset at +-// which iteration should stop. The overall slice has length total_len, each +-// iteration's sub-slice has length iter_len and are placed iter_advance apart. +-// +-// The iter_advance may not be larger than iter_len. The iter_advance may be +-// smaller than iter_len, in which case the sub-slices will overlap. +-// +-// The return value r satisfies ((0 <= r) && (r <= total_len)). +-// +-// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are +-// four iterations at offsets 0, 3, 6 and 9. This function returns 12. +-// +-// 0123456789012345 +-// [....] +-// [....] +-// [....] +-// [....] +-// $ +-// 0123456789012345 +-// +-// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are +-// three iterations at offsets 0, 5 and 10. This function returns 15. ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++// ---------------- Public Consts ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". + // +-// 0123456789012345 +-// [....] +-// [....] +-// [....] +-// $ +-// 0123456789012345 +-static inline size_t // +-wuffs_base__iterate_total_advance(size_t total_len, +- size_t iter_len, +- size_t iter_advance) { +- if (total_len >= iter_len) { +- size_t n = total_len - iter_len; +- return ((n / iter_advance) * iter_advance) + iter_advance; +- } +- return 0; +-} ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// ---------------- Numeric Types ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash32__hasher__initialize( ++ wuffs_xxhash32__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-extern const uint8_t wuffs_base__low_bits_mask__u8[8]; +-extern const uint16_t wuffs_base__low_bits_mask__u16[16]; +-extern const uint32_t wuffs_base__low_bits_mask__u32[32]; +-extern const uint64_t wuffs_base__low_bits_mask__u64[64]; ++size_t ++sizeof__wuffs_xxhash32__hasher(void); + +-#define WUFFS_BASE__LOW_BITS_MASK__U8(n) (wuffs_base__low_bits_mask__u8[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U16(n) (wuffs_base__low_bits_mask__u16[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U32(n) (wuffs_base__low_bits_mask__u32[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U64(n) (wuffs_base__low_bits_mask__u64[n]) ++// ---------------- Allocs + +-// -------- ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-static inline void // +-wuffs_base__u8__sat_add_indirect(uint8_t* x, uint8_t y) { +- *x = wuffs_base__u8__sat_add(*x, y); +-} ++wuffs_xxhash32__hasher* ++wuffs_xxhash32__hasher__alloc(void); + +-static inline void // +-wuffs_base__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { +- *x = wuffs_base__u8__sat_sub(*x, y); ++static inline wuffs_base__hasher_u32* ++wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) { ++ return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc()); + } + +-static inline void // +-wuffs_base__u16__sat_add_indirect(uint16_t* x, uint16_t y) { +- *x = wuffs_base__u16__sat_add(*x, y); +-} ++// ---------------- Upcasts + +-static inline void // +-wuffs_base__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { +- *x = wuffs_base__u16__sat_sub(*x, y); ++static inline wuffs_base__hasher_u32* ++wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32( ++ wuffs_xxhash32__hasher* p) { ++ return (wuffs_base__hasher_u32*)p; + } + +-static inline void // +-wuffs_base__u32__sat_add_indirect(uint32_t* x, uint32_t y) { +- *x = wuffs_base__u32__sat_add(*x, y); +-} ++// ---------------- Public Function Prototypes + +-static inline void // +-wuffs_base__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { +- *x = wuffs_base__u32__sat_sub(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash32__hasher__get_quirk( ++ const wuffs_xxhash32__hasher* self, ++ uint32_t a_key); + +-static inline void // +-wuffs_base__u64__sat_add_indirect(uint64_t* x, uint64_t y) { +- *x = wuffs_base__u64__sat_add(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xxhash32__hasher__set_quirk( ++ wuffs_xxhash32__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-static inline void // +-wuffs_base__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { +- *x = wuffs_base__u64__sat_sub(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash32__hasher__update( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-// ---------------- Numeric Types (Utility) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__update_u32( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \ +- ((uint32_t)(int32_t)(int16_t)(a)) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__checksum_u32( ++ const wuffs_xxhash32__hasher* self); + +-#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \ +- ((uint32_t)(((int32_t)(a)) >> (n))) ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \ +- ((uint64_t)(((int64_t)(a)) >> (n))) ++// ---------------- Struct Definitions + +-// ---------------- Slices and Tables ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +-// wuffs_base__slice_u8__prefix returns up to the first up_to bytes of s. +-static inline wuffs_base__slice_u8 // +-wuffs_base__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) { +- if (((uint64_t)(s.len)) > up_to) { +- s.len = ((size_t)up_to); ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_xxhash32__hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; ++ wuffs_base__vtable null_vtable; ++ ++ uint32_t f_length_modulo_u32; ++ bool f_length_overflows_u32; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_buf_len; ++ uint8_t f_buf_data[16]; ++ uint32_t f_v0; ++ uint32_t f_v1; ++ uint32_t f_v2; ++ uint32_t f_v3; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xxhash32__hasher__alloc()); + } +- return s; +-} + +-// wuffs_base__slice_u8__suffix returns up to the last up_to bytes of s. +-static inline wuffs_base__slice_u8 // +-wuffs_base__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) { +- if (((uint64_t)(s.len)) > up_to) { +- s.ptr += ((uint64_t)(s.len)) - up_to; +- s.len = ((size_t)up_to); ++ static inline wuffs_base__hasher_u32::unique_ptr ++ alloc_as__wuffs_base__hasher_u32() { ++ return wuffs_base__hasher_u32::unique_ptr( ++ wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32()); + } +- return s; +-} ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// wuffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr, len) +-// where len is the minimum of dst.len and src.len. +-// +-// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty +-// slice) is valid and results in a no-op. +-static inline uint64_t // +-wuffs_base__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src) { +- size_t len = dst.len < src.len ? dst.len : src.len; +- if (len > 0) { +- memmove(dst.ptr, src.ptr, len); ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xxhash32__hasher__struct() = delete; ++ wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete; ++ wuffs_xxhash32__hasher__struct& operator=( ++ const wuffs_xxhash32__hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xxhash32__hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } +- return len; +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_load_host_endian(void* ptr, +- size_t len, +- wuffs_base__slice_u8 src) { +- if (len && (len <= src.len)) { +- memmove(ptr, src.ptr, len); ++ inline wuffs_base__hasher_u32* ++ upcast_as__wuffs_base__hasher_u32() { ++ return (wuffs_base__hasher_u32*)this; + } +- return wuffs_base__make_empty_struct(); +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_memset(void* ptr, size_t len, uint8_t byte_value) { +- if (len) { +- memset(ptr, byte_value, len); ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xxhash32__hasher__get_quirk(this, a_key); + } +- return wuffs_base__make_empty_struct(); +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_save_host_endian(void* ptr, +- size_t len, +- wuffs_base__slice_u8 dst) { +- if (len && (len <= dst.len)) { +- memmove(dst.ptr, ptr, len); ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value); + } +- return wuffs_base__make_empty_struct(); +-} + +-// -------- ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash32__hasher__update(this, a_x); ++ } + +-static inline wuffs_base__slice_u8 // +-wuffs_base__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) { +- if (y < t.height) { +- return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width); ++ inline uint32_t ++ update_u32( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash32__hasher__update_u32(this, a_x); + } +- return wuffs_base__make_slice_u8(NULL, 0); +-} + +-// ---------------- Slices and Tables (Utility) ++ inline uint32_t ++ checksum_u32() const { ++ return wuffs_xxhash32__hasher__checksum_u32(this); ++ } + +-#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8 ++#endif // __cplusplus ++}; // struct wuffs_xxhash32__hasher__struct + +-// ---------------- Ranges and Rects ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-static inline uint32_t // +-wuffs_base__range_ii_u32__get_min_incl(const wuffs_base__range_ii_u32* r) { +- return r->min_incl; +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) + +-static inline uint32_t // +-wuffs_base__range_ii_u32__get_max_incl(const wuffs_base__range_ii_u32* r) { +- return r->max_incl; +-} ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) + +-static inline uint32_t // +-wuffs_base__range_ie_u32__get_min_incl(const wuffs_base__range_ie_u32* r) { +- return r->min_incl; +-} ++// ---------------- Status Codes + +-static inline uint32_t // +-wuffs_base__range_ie_u32__get_max_excl(const wuffs_base__range_ie_u32* r) { +- return r->max_excl; +-} ++// ---------------- Public Consts + +-static inline uint64_t // +-wuffs_base__range_ii_u64__get_min_incl(const wuffs_base__range_ii_u64* r) { +- return r->min_incl; +-} ++// ---------------- Struct Declarations + +-static inline uint64_t // +-wuffs_base__range_ii_u64__get_max_incl(const wuffs_base__range_ii_u64* r) { +- return r->max_incl; +-} ++typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher; + +-static inline uint64_t // +-wuffs_base__range_ie_u64__get_min_incl(const wuffs_base__range_ie_u64* r) { +- return r->min_incl; +-} ++#ifdef __cplusplus ++extern "C" { ++#endif + +-static inline uint64_t // +-wuffs_base__range_ie_u64__get_max_excl(const wuffs_base__range_ie_u64* r) { +- return r->max_excl; +-} ++// ---------------- Public Initializer Prototypes + +-// ---------------- Ranges and Rects (Utility) ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32 +-#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32 +-#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64 +-#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64 +-#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32 +-#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32 +-#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32 +-#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32 +-#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64 +-#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64 +-#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32 +-#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32 ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash64__hasher__initialize( ++ wuffs_xxhash64__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-// ---------------- I/O ++size_t ++sizeof__wuffs_xxhash64__hasher(void); + +-static inline uint64_t // +-wuffs_base__io__count_since(uint64_t mark, uint64_t index) { +- if (index >= mark) { +- return index - mark; +- } +- return 0; +-} ++// ---------------- Allocs + +-// TODO: drop the "const" in "const uint8_t* ptr". Some though required about +-// the base.io_reader.since method returning a mutable "slice base.u8". +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wcast-qual" +-#endif +-static inline wuffs_base__slice_u8 // +-wuffs_base__io__since(uint64_t mark, uint64_t index, const uint8_t* ptr) { +- if (index >= mark) { +- return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark, +- ((size_t)(index - mark))); +- } +- return wuffs_base__make_slice_u8(NULL, 0); +-} +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-// -------- ++wuffs_xxhash64__hasher* ++wuffs_xxhash64__hasher__alloc(void); + +-static inline void // +-wuffs_base__io_reader__limit(const uint8_t** ptr_io2_r, +- const uint8_t* iop_r, +- uint64_t limit) { +- if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) { +- *ptr_io2_r = iop_r + limit; +- } ++static inline wuffs_base__hasher_u64* ++wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) { ++ return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc()); + } + +-static inline uint32_t // +-wuffs_base__io_reader__limited_copy_u32_to_slice(const uint8_t** ptr_iop_r, +- const uint8_t* io2_r, +- uint32_t length, +- wuffs_base__slice_u8 dst) { +- const uint8_t* iop_r = *ptr_iop_r; +- size_t n = dst.len; +- if (n > length) { +- n = length; +- } +- if (n > ((size_t)(io2_r - iop_r))) { +- n = (size_t)(io2_r - iop_r); +- } +- if (n > 0) { +- memmove(dst.ptr, iop_r, n); +- *ptr_iop_r += n; +- } +- return (uint32_t)(n); ++// ---------------- Upcasts ++ ++static inline wuffs_base__hasher_u64* ++wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64( ++ wuffs_xxhash64__hasher* p) { ++ return (wuffs_base__hasher_u64*)p; + } + +-// wuffs_base__io_reader__match7 returns whether the io_reader's upcoming bytes +-// start with the given prefix (up to 7 bytes long). It is peek-like, not +-// read-like, in that there are no side-effects. +-// +-// The low 3 bits of a hold the prefix length, n. +-// +-// The high 56 bits of a hold the prefix itself, in little-endian order. The +-// first prefix byte is in bits 8..=15, the second prefix byte is in bits +-// 16..=23, etc. The high (8 * (7 - n)) bits are ignored. +-// +-// There are three possible return values: +-// - 0 means success. +-// - 1 means inconclusive, equivalent to "$short read". +-// - 2 means failure. +-static inline uint32_t // +-wuffs_base__io_reader__match7(const uint8_t* iop_r, +- const uint8_t* io2_r, +- wuffs_base__io_buffer* r, +- uint64_t a) { +- uint32_t n = a & 7; +- a >>= 8; +- if ((io2_r - iop_r) >= 8) { +- uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r); +- uint32_t shift = 8 * (8 - n); +- return ((a << shift) == (x << shift)) ? 0 : 2; +- } +- for (; n > 0; n--) { +- if (iop_r >= io2_r) { +- return (r && r->meta.closed) ? 2 : 1; +- } else if (*iop_r != ((uint8_t)(a))) { +- return 2; +- } +- iop_r++; +- a >>= 8; +- } +- return 0; +-} ++// ---------------- Public Function Prototypes + +-static inline wuffs_base__io_buffer* // +-wuffs_base__io_reader__set(wuffs_base__io_buffer* b, +- const uint8_t** ptr_iop_r, +- const uint8_t** ptr_io0_r, +- const uint8_t** ptr_io1_r, +- const uint8_t** ptr_io2_r, +- wuffs_base__slice_u8 data, +- uint64_t history_position) { +- b->data = data; +- b->meta.wi = data.len; +- b->meta.ri = 0; +- b->meta.pos = history_position; +- b->meta.closed = false; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__get_quirk( ++ const wuffs_xxhash64__hasher* self, ++ uint32_t a_key); + +- *ptr_iop_r = data.ptr; +- *ptr_io0_r = data.ptr; +- *ptr_io1_r = data.ptr; +- *ptr_io2_r = data.ptr + data.len; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xxhash64__hasher__set_quirk( ++ wuffs_xxhash64__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); + +- return b; +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash64__hasher__update( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__update_u64( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-static inline uint64_t // +-wuffs_base__io_writer__copy_from_slice(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- wuffs_base__slice_u8 src) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = src.len; +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); +- } +- if (n > 0) { +- memmove(iop_w, src.ptr, n); +- *ptr_iop_w += n; +- } +- return (uint64_t)(n); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__checksum_u64( ++ const wuffs_xxhash64__hasher* self); + +-static inline void // +-wuffs_base__io_writer__limit(uint8_t** ptr_io2_w, +- uint8_t* iop_w, +- uint64_t limit) { +- if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) { +- *ptr_io2_w = iop_w + limit; +- } +-} ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history(uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- if (!distance) { +- return 0; +- } +- uint8_t* p = *ptr_iop_w; +- if ((size_t)(p - io0_w) < (size_t)(distance)) { +- return 0; +- } +- uint8_t* q = p - distance; +- size_t n = (size_t)(io2_w - p); +- if ((size_t)(length) > n) { +- length = (uint32_t)(n); +- } else { +- n = (size_t)(length); +- } +- // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that +- // is mostly because 3 is the minimum length for the deflate format. This +- // function implementation shouldn't overfit to that one format. Perhaps the +- // limited_copy_u32_from_history Wuffs method should also take an unroll hint +- // argument, and the cgen can look if that argument is the constant +- // expression '3'. +- // +- // See also wuffs_base__io_writer__limited_copy_u32_from_history_fast below. +- for (; n >= 3; n -= 3) { +- *p++ = *q++; +- *p++ = *q++; +- *p++ = *q++; +- } +- for (; n; n--) { +- *p++ = *q++; +- } +- *ptr_iop_w = p; +- return length; +-} ++// ---------------- Struct Definitions + +-// wuffs_base__io_writer__limited_copy_u32_from_history_fast is like the +-// wuffs_base__io_writer__limited_copy_u32_from_history function above, but has +-// stronger pre-conditions. ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. + // +-// The caller needs to prove that: +-// - length <= (io2_w - *ptr_iop_w) +-// - distance >= 1 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_fast(uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint8_t* q = p - distance; +- uint32_t n = length; +- for (; n >= 3; n -= 3) { +- *p++ = *q++; +- *p++ = *q++; +- *p++ = *q++; +- } +- for (; n; n--) { +- *p++ = *q++; ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_xxhash64__hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; ++ wuffs_base__vtable null_vtable; ++ ++ uint64_t f_length_modulo_u64; ++ bool f_length_overflows_u64; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_padding2; ++ uint32_t f_buf_len; ++ uint8_t f_buf_data[32]; ++ uint64_t f_v0; ++ uint64_t f_v1; ++ uint64_t f_v2; ++ uint64_t f_v3; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xxhash64__hasher__alloc()); + } +- *ptr_iop_w = p; +- return length; +-} + +-// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast +-// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 +-// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. +-// +-// In terms of number of bytes copied, length is rounded up to a multiple of 8. +-// As a special case, a zero length rounds up to 8 (even though 0 is already a +-// multiple of 8), since there is always at least one 8 byte chunk copied. +-// +-// In terms of advancing *ptr_iop_w, length is not rounded up. +-// +-// The caller needs to prove that: +-// - (length + 8) <= (io2_w - *ptr_iop_w) +-// - distance == 1 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint64_t x = p[-1]; +- x |= x << 8; +- x |= x << 16; +- x |= x << 32; +- uint32_t n = length; +- while (1) { +- wuffs_base__poke_u64le__no_bounds_check(p, x); +- if (n <= 8) { +- p += n; +- break; +- } +- p += 8; +- n -= 8; ++ static inline wuffs_base__hasher_u64::unique_ptr ++ alloc_as__wuffs_base__hasher_u64() { ++ return wuffs_base__hasher_u64::unique_ptr( ++ wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64()); + } +- *ptr_iop_w = p; +- return length; +-} ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast is +-// like the wuffs_base__io_writer__limited_copy_u32_from_history_fast function +-// above, but copies 8 byte chunks at a time. +-// +-// In terms of number of bytes copied, length is rounded up to a multiple of 8. +-// As a special case, a zero length rounds up to 8 (even though 0 is already a +-// multiple of 8), since there is always at least one 8 byte chunk copied. +-// +-// In terms of advancing *ptr_iop_w, length is not rounded up. +-// +-// The caller needs to prove that: +-// - (length + 8) <= (io2_w - *ptr_iop_w) +-// - distance >= 8 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint8_t* q = p - distance; +- uint32_t n = length; +- while (1) { +- memcpy(p, q, 8); +- if (n <= 8) { +- p += n; +- break; +- } +- p += 8; +- q += 8; +- n -= 8; ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xxhash64__hasher__struct() = delete; ++ wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete; ++ wuffs_xxhash64__hasher__struct& operator=( ++ const wuffs_xxhash64__hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xxhash64__hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } +- *ptr_iop_w = p; +- return length; +-} + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_reader(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- uint32_t length, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = length; +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); ++ inline wuffs_base__hasher_u64* ++ upcast_as__wuffs_base__hasher_u64() { ++ return (wuffs_base__hasher_u64*)this; + } +- const uint8_t* iop_r = *ptr_iop_r; +- if (n > ((size_t)(io2_r - iop_r))) { +- n = (size_t)(io2_r - iop_r); ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xxhash64__hasher__get_quirk(this, a_key); + } +- if (n > 0) { +- memmove(iop_w, iop_r, n); +- *ptr_iop_w += n; +- *ptr_iop_r += n; ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value); + } +- return (uint32_t)(n); +-} + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_slice(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- uint32_t length, +- wuffs_base__slice_u8 src) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = src.len; +- if (n > length) { +- n = length; ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash64__hasher__update(this, a_x); + } +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); ++ ++ inline uint64_t ++ update_u64( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash64__hasher__update_u64(this, a_x); + } +- if (n > 0) { +- memmove(iop_w, src.ptr, n); +- *ptr_iop_w += n; ++ ++ inline uint64_t ++ checksum_u64() const { ++ return wuffs_xxhash64__hasher__checksum_u64(this); + } +- return (uint32_t)(n); +-} + +-static inline wuffs_base__io_buffer* // +-wuffs_base__io_writer__set(wuffs_base__io_buffer* b, +- uint8_t** ptr_iop_w, +- uint8_t** ptr_io0_w, +- uint8_t** ptr_io1_w, +- uint8_t** ptr_io2_w, +- wuffs_base__slice_u8 data, +- uint64_t history_position) { +- b->data = data; +- b->meta.wi = 0; +- b->meta.ri = 0; +- b->meta.pos = history_position; +- b->meta.closed = false; ++#endif // __cplusplus ++}; // struct wuffs_xxhash64__hasher__struct + +- *ptr_iop_w = data.ptr; +- *ptr_io0_w = data.ptr; +- *ptr_io1_w = data.ptr; +- *ptr_io2_w = data.ptr + data.len; ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- return b; +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) + +-// ---------------- I/O (Utility) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC) + +-#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader +-#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer ++// ---------------- Status Codes + +-// ---------------- Tokens ++extern const char wuffs_xz__error__bad_bcj_offset[]; ++extern const char wuffs_xz__error__bad_block_header[]; ++extern const char wuffs_xz__error__bad_checksum[]; ++extern const char wuffs_xz__error__bad_filter[]; ++extern const char wuffs_xz__error__bad_footer[]; ++extern const char wuffs_xz__error__bad_header[]; ++extern const char wuffs_xz__error__bad_header_concatenated_stream[]; ++extern const char wuffs_xz__error__bad_index[]; ++extern const char wuffs_xz__error__bad_padding[]; ++extern const char wuffs_xz__error__truncated_input[]; ++extern const char wuffs_xz__error__unsupported_checksum_algorithm[]; ++extern const char wuffs_xz__error__unsupported_filter[]; ++extern const char wuffs_xz__error__unsupported_filter_combination[]; + +-// ---------------- Tokens (Utility) ++// ---------------- Public Consts + +-// ---------------- Memory Allocation ++#define WUFFS_XZ__QUIRK_DECODE_STANDALONE_CONCATENATED_STREAMS 2021322752u + +-// ---------------- Images ++#define WUFFS_XZ__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- uint32_t up_to_num_pixels, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r); ++#define WUFFS_XZ__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r); ++// ---------------- Struct Declarations + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- uint64_t num_pixels); ++typedef struct wuffs_xz__decoder__struct wuffs_xz__decoder; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__swizzle_ycck( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_buffer* dst, +- wuffs_base__slice_u8 dst_palette, +- uint32_t width, +- uint32_t height, +- wuffs_base__slice_u8 src0, +- wuffs_base__slice_u8 src1, +- wuffs_base__slice_u8 src2, +- wuffs_base__slice_u8 src3, +- uint32_t width0, +- uint32_t width1, +- uint32_t width2, +- uint32_t width3, +- uint32_t height0, +- uint32_t height1, +- uint32_t height2, +- uint32_t height3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint8_t h0, +- uint8_t h1, +- uint8_t h2, +- uint8_t h3, +- uint8_t v0, +- uint8_t v1, +- uint8_t v2, +- uint8_t v3, +- bool is_rgb_or_cmyk, +- bool triangle_filter_for_2to1, +- wuffs_base__slice_u8 scratch_buffer_2k); ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// ---------------- Images (Utility) ++// ---------------- Public Initializer Prototypes + +-#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// ---------------- String Conversions ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xz__decoder__initialize( ++ wuffs_xz__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-// ---------------- Unicode and UTF-8 ++size_t ++sizeof__wuffs_xz__decoder(void); + +-// ---------------- ++// ---------------- Allocs + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__CORE) ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-const uint8_t wuffs_base__low_bits_mask__u8[8] = { +- 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, +-}; ++wuffs_xz__decoder* ++wuffs_xz__decoder__alloc(void); + +-const uint16_t wuffs_base__low_bits_mask__u16[16] = { +- 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, +- 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, +-}; ++static inline wuffs_base__io_transformer* ++wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_xz__decoder__alloc()); ++} + +-const uint32_t wuffs_base__low_bits_mask__u32[32] = { +- 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, +- 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, +- 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, +- 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, +- 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, +- 0x3FFFFFFF, 0x7FFFFFFF, +-}; ++// ---------------- Upcasts + +-const uint64_t wuffs_base__low_bits_mask__u64[64] = { +- 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, +- 0x0000000000000007, 0x000000000000000F, 0x000000000000001F, +- 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF, +- 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, +- 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF, +- 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF, +- 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF, +- 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, +- 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF, +- 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF, +- 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF, +- 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, +- 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, +- 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF, +- 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF, +- 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, +- 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, +- 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF, +- 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF, +- 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, +- 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, +- 0x7FFFFFFFFFFFFFFF, +-}; ++static inline wuffs_base__io_transformer* ++wuffs_xz__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_xz__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} + +-const uint32_t wuffs_base__pixel_format__bits_per_channel[16] = { +- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +- 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, +-}; ++// ---------------- Public Function Prototypes + +-const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect"; +-const char wuffs_base__note__end_of_data[] = "@base: end of data"; +-const char wuffs_base__note__metadata_reported[] = "@base: metadata reported"; +-const char wuffs_base__suspension__even_more_information[] = "$base: even more information"; +-const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read"; +-const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write"; +-const char wuffs_base__suspension__short_read[] = "$base: short read"; +-const char wuffs_base__suspension__short_write[] = "$base: short write"; +-const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position"; +-const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)"; +-const char wuffs_base__error__bad_argument[] = "#base: bad argument"; +-const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence"; +-const char wuffs_base__error__bad_data[] = "#base: bad data"; +-const char wuffs_base__error__bad_receiver[] = "#base: bad receiver"; +-const char wuffs_base__error__bad_restart[] = "#base: bad restart"; +-const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver"; +-const char wuffs_base__error__bad_vtable[] = "#base: bad vtable"; +-const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length"; +-const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version"; +-const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension"; +-const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error"; +-const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed"; +-const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called"; +-const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls"; +-const char wuffs_base__error__no_more_information[] = "#base: no more information"; +-const char wuffs_base__error__not_enough_data[] = "#base: not enough data"; +-const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds"; +-const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension"; +-const char wuffs_base__error__unsupported_method[] = "#base: unsupported method"; +-const char wuffs_base__error__unsupported_option[] = "#base: unsupported option"; +-const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option"; +-const char wuffs_base__error__too_much_data[] = "#base: too much data"; +- +-const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32"; +-const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64"; +-const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder"; +-const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer"; +-const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder"; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xz__decoder__get_quirk( ++ const wuffs_xz__decoder* self, ++ uint32_t a_key); + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__CORE) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__set_quirk( ++ wuffs_xz__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_xz__decoder__dst_history_retain_length( ++ const wuffs_xz__decoder* self); + +-// ---------------- Interface Definitions. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_xz__decoder__workbuf_len( ++ const wuffs_xz__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__hasher_u32__checksum_u32( +- const wuffs_base__hasher_u32* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->checksum_u32)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#ifdef __cplusplus ++} // extern "C" ++#endif + +- return 0; +-} ++// ---------------- Struct Definitions + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u32__get_quirk( +- const wuffs_base__hasher_u32* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- return 0; +-} ++struct wuffs_xz__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__hasher_u32__set_quirk( +- wuffs_base__hasher_u32* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ uint32_t f_filters[3]; ++ uint32_t f_num_non_final_filters; ++ uint8_t f_checksummer; ++ bool f_ignore_checksum; ++ bool f_standalone_format; ++ bool f_lzma_needs_reset; ++ bool f_block_has_compressed_size; ++ bool f_block_has_uncompressed_size; ++ uint8_t f_bcj_undo_index; ++ uint32_t f_bcj_pos; ++ uint32_t f_bcj_x86_prev_mask; ++ uint64_t f_block_compressed_size; ++ uint64_t f_block_uncompressed_size; ++ uint64_t f_compressed_size_for_index; ++ uint32_t f_verification_have_hashed_sizes[2]; ++ uint32_t f_verification_want_hashed_sizes[2]; ++ uint64_t f_verification_have_total_sizes[2]; ++ uint64_t f_verification_want_total_sizes[2]; ++ uint64_t f_num_actual_blocks; ++ uint64_t f_num_index_blocks; ++ uint64_t f_index_block_compressed_size; ++ uint64_t f_index_block_uncompressed_size; ++ uint64_t f_backwards_size; ++ bool f_started_verify_index; ++ uint16_t f_flags; ++ ++ uint8_t (*choosy_apply_non_final_filters)( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_block_header_with_padding; ++ uint32_t p_decode_block_header_sans_padding; ++ uint32_t p_verify_index; ++ uint32_t p_verify_footer; ++ } private_impl; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ struct { ++ uint8_t f_filter_data[3][256]; ++ wuffs_crc32__ieee_hasher f_crc32; ++ wuffs_crc64__ecma_hasher f_crc64; ++ wuffs_sha256__hasher f_sha256; ++ wuffs_lzma__decoder f_lzma; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__hasher_u32__update( +- wuffs_base__hasher_u32* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++ struct { ++ uint32_t v_checksum32_have; ++ uint32_t v_checksum32_want; ++ wuffs_base__bitvec256 v_checksum256_have; ++ uint64_t v_compressed_size; ++ uint64_t v_uncompressed_size; ++ uint64_t scratch; ++ } s_do_transform_io; ++ struct { ++ uint64_t v_padded_size_have; ++ uint64_t v_padded_size_want; ++ } s_decode_block_header_with_padding; ++ struct { ++ uint8_t v_flags; ++ uint8_t v_filter_id; ++ uint32_t v_shift; ++ uint32_t v_f; ++ uint64_t scratch; ++ } s_decode_block_header_sans_padding; ++ struct { ++ uint32_t v_shift; ++ } s_verify_index; ++ struct { ++ uint64_t scratch; ++ } s_verify_footer; ++ } private_data; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +- return wuffs_base__make_empty_struct(); +-} ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__hasher_u32__update_u32( +- wuffs_base__hasher_u32* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xz__decoder__alloc()); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update_u32)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer()); + } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- return 0; +-} ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xz__decoder__struct() = delete; ++ wuffs_xz__decoder__struct(const wuffs_xz__decoder__struct&) = delete; ++ wuffs_xz__decoder__struct& operator=( ++ const wuffs_xz__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +-// -------- ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__checksum_u64( +- const wuffs_base__hasher_u64* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xz__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->checksum_u64)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; + } + +- return 0; +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__get_quirk( +- const wuffs_base__hasher_u64* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xz__decoder__get_quirk(this, a_key); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xz__decoder__set_quirk(this, a_key, a_value); + } + +- return 0; +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__hasher_u64__set_quirk( +- wuffs_base__hasher_u64* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_xz__decoder__dst_history_retain_length(this); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_xz__decoder__workbuf_len(this); + } + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__hasher_u64__update( +- wuffs_base__hasher_u64* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ inline wuffs_base__status ++ transform_io( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_xz__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#endif // __cplusplus ++}; // struct wuffs_xz__decoder__struct + +- return wuffs_base__make_empty_struct(); +-} ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__update_u64( +- wuffs_base__hasher_u64* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC) + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update_u64)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- return 0; +-} ++// ---------------- Auxiliary - Base + +-// -------- ++// Auxiliary code is discussed at ++// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_frame( +- wuffs_base__image_decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++#include + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#include ++#include + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++namespace wuffs_aux { + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_frame_config( +- wuffs_base__image_decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++using IOBuffer = wuffs_base__io_buffer; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_frame_config)(self, a_dst, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// MemOwner represents ownership of some memory. Dynamically allocated memory ++// (e.g. from malloc or new) is typically paired with free or delete, invoked ++// when the std::unique_ptr is destroyed. Statically allocated memory might use ++// MemOwner(nullptr, &free), even if that statically allocated memory is not ++// nullptr, since calling free(nullptr) is a no-op. ++using MemOwner = std::unique_ptr; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++using QuirkKeyValuePair = std::pair; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_image_config( +- wuffs_base__image_decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++namespace sync_io { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_image_config)(self, a_dst, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array. ++// It owns that backing array and will free it in its destructor. ++// ++// The array size can be explicitly extended (by calling the grow method) but, ++// unlike a C++ std::vector, there is no implicit extension (e.g. by calling ++// std::vector::insert) and its maximum size is capped by the max_incl ++// constructor argument. ++// ++// It contains an IOBuffer-typed field whose reader side provides access to ++// previously written bytes and whose writer side provides access to the ++// allocated but not-yet-written-to slack space. For Go programmers, this slack ++// space is roughly analogous to the s[len(s):cap(s)] space of a slice s. ++class DynIOBuffer { ++ public: ++ enum GrowResult { ++ OK = 0, ++ FailedMaxInclExceeded = 1, ++ FailedOutOfMemory = 2, ++ }; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_base__image_decoder__frame_dirty_rect( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } ++ // m_buf holds the dynamically sized byte array and its read/write indexes: ++ // - m_buf.meta.wi is roughly analogous to a Go slice's length. ++ // - m_buf.data.len is roughly analogous to a Go slice's capacity. It is ++ // also equal to the m_buf.data.ptr malloc/realloc size. ++ // ++ // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as ++ // they are conceptually private to this class), but they can modify the ++ // bytes referenced by that pointer-length pair (e.g. compactions). ++ IOBuffer m_buf; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->frame_dirty_rect)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // m_max_incl is an inclusive upper bound on the backing array size. ++ const uint64_t m_max_incl; + +- return wuffs_base__utility__empty_rect_ie_u32(); +-} ++ // Constructor and destructor. ++ explicit DynIOBuffer(uint64_t max_incl); ++ ~DynIOBuffer(); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__get_quirk( +- const wuffs_base__image_decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be ++ // used after a drop call. It just restarts from zero. ++ void drop(); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // grow ensures that the byte array size is at least min_incl and at most ++ // max_incl. It returns FailedMaxInclExceeded if that would require ++ // allocating more than max_incl bytes, including the case where (min_incl > ++ // max_incl). It returns FailedOutOfMemory if memory allocation failed. ++ GrowResult grow(uint64_t min_incl); + +- return 0; +-} ++ private: ++ // Delete the copy and assign constructors. ++ DynIOBuffer(const DynIOBuffer&) = delete; ++ DynIOBuffer& operator=(const DynIOBuffer&) = delete; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__history_retain_length( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ static uint64_t round_up(uint64_t min_incl, uint64_t max_incl); ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return 0; +-} ++class Input { ++ public: ++ virtual ~Input(); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__image_decoder__num_animation_loops( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ virtual IOBuffer* BringsItsOwnIOBuffer(); ++ virtual std::string CopyIn(IOBuffer* dst) = 0; ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_animation_loops)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return 0; +-} ++// FileInput is an Input that reads from a file source. ++// ++// It does not take responsibility for closing the file when done. ++class FileInput : public Input { ++ public: ++ FileInput(FILE* f); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__num_decoded_frame_configs( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ virtual std::string CopyIn(IOBuffer* dst); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_decoded_frame_configs)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ private: ++ FILE* m_f; + +- return 0; +-} ++ // Delete the copy and assign constructors. ++ FileInput(const FileInput&) = delete; ++ FileInput& operator=(const FileInput&) = delete; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__num_decoded_frames( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// -------- + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_decoded_frames)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// MemoryInput is an Input that reads from an in-memory source. ++// ++// It does not take responsibility for freeing the memory when done. ++class MemoryInput : public Input { ++ public: ++ MemoryInput(const char* ptr, size_t len); ++ MemoryInput(const uint8_t* ptr, size_t len); + +- return 0; +-} ++ virtual IOBuffer* BringsItsOwnIOBuffer(); ++ virtual std::string CopyIn(IOBuffer* dst); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__restart_frame( +- wuffs_base__image_decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ private: ++ IOBuffer m_io; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->restart_frame)(self, a_index, a_io_position); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // Delete the copy and assign constructors. ++ MemoryInput(const MemoryInput&) = delete; ++ MemoryInput& operator=(const MemoryInput&) = delete; ++}; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// -------- + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__set_quirk( +- wuffs_base__image_decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++} // namespace sync_io + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++} // namespace wuffs_aux + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// ---------------- Auxiliary - CBOR + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__image_decoder__set_report_metadata( +- wuffs_base__image_decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++namespace wuffs_aux { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++struct DecodeCborResult { ++ DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0); + +- return wuffs_base__make_empty_struct(); +-} ++ std::string error_message; ++ uint64_t cursor_position; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__tell_me_more( +- wuffs_base__image_decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++class DecodeCborCallbacks { ++ public: ++ virtual ~DecodeCborCallbacks(); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // AppendXxx are called for leaf nodes: literals, numbers, strings, etc. + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ virtual std::string AppendNull() = 0; ++ virtual std::string AppendUndefined() = 0; ++ virtual std::string AppendBool(bool val) = 0; ++ virtual std::string AppendF64(double val) = 0; ++ virtual std::string AppendI64(int64_t val) = 0; ++ virtual std::string AppendU64(uint64_t val) = 0; ++ virtual std::string AppendByteString(std::string&& val) = 0; ++ virtual std::string AppendTextString(std::string&& val) = 0; ++ virtual std::string AppendMinus1MinusX(uint64_t val) = 0; ++ virtual std::string AppendCborSimpleValue(uint8_t val) = 0; ++ virtual std::string AppendCborTag(uint64_t val) = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__image_decoder__workbuf_len( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR ++ // maps (dictionaries). ++ // ++ // The flags bits combine exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT ++ // and exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ virtual std::string Push(uint32_t flags) = 0; ++ virtual std::string Pop(uint32_t flags) = 0; + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++ // Done is always the last Callback method called by DecodeCbor, whether or ++ // not parsing the input as CBOR encountered an error. Even when successful, ++ // trailing data may remain in input and buffer. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeCbor may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op. ++ virtual void // ++ Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer); ++}; + +-// -------- ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__get_quirk( +- const wuffs_base__io_transformer* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeCborArgQuirks wraps an optional argument to DecodeCbor. ++struct DecodeCborArgQuirks { ++ explicit DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns an empty slice. ++ static DecodeCborArgQuirks DefaultValue(); + +- return 0; +-} ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__history_retain_length( +- const wuffs_base__io_transformer* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeCbor calls callbacks based on the CBOR-formatted data in input. ++// ++// On success, the returned error_message is empty and cursor_position counts ++// the number of bytes consumed. On failure, error_message is non-empty and ++// cursor_position is the location of the error. That error may be a content ++// error (invalid CBOR) or an input error (e.g. network failure). ++DecodeCborResult // ++DecodeCbor(DecodeCborCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue()); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++} // namespace wuffs_aux + +- return 0; +-} ++// ---------------- Auxiliary - Image + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__io_transformer__set_quirk( +- wuffs_base__io_transformer* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++namespace wuffs_aux { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++struct DecodeImageResult { ++ DecodeImageResult(MemOwner&& pixbuf_mem_owner0, ++ wuffs_base__pixel_buffer pixbuf0, ++ std::string&& error_message0); ++ DecodeImageResult(std::string&& error_message0); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ MemOwner pixbuf_mem_owner; ++ wuffs_base__pixel_buffer pixbuf; ++ std::string error_message; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__io_transformer__transform_io( +- wuffs_base__io_transformer* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always ++// called in this order: ++// 1. SelectDecoder ++// 2. HandleMetadata ++// 3. SelectPixfmt ++// 4. AllocPixbuf ++// 5. AllocWorkbuf ++// 6. Done ++// ++// It may return early - the third callback might not be invoked if the second ++// one fails - but the final callback (Done) is always invoked. ++class DecodeImageCallbacks { ++ public: ++ // AllocPixbufResult holds a memory allocation (the result of malloc or new, ++ // a statically allocated pointer, etc), or an error message. The memory is ++ // de-allocated when mem_owner goes out of scope and is destroyed. ++ struct AllocPixbufResult { ++ AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0); ++ AllocPixbufResult(std::string&& error_message0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ MemOwner mem_owner; ++ wuffs_base__pixel_buffer pixbuf; ++ std::string error_message; ++ }; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // AllocWorkbufResult holds a memory allocation (the result of malloc or new, ++ // a statically allocated pointer, etc), or an error message. The memory is ++ // de-allocated when mem_owner goes out of scope and is destroyed. ++ struct AllocWorkbufResult { ++ AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0); ++ AllocWorkbufResult(std::string&& error_message0); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__io_transformer__workbuf_len( +- const wuffs_base__io_transformer* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ MemOwner mem_owner; ++ wuffs_base__slice_u8 workbuf; ++ std::string error_message; ++ }; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ virtual ~DecodeImageCallbacks(); + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++ // SelectDecoder returns the image decoder for the input data's file format. ++ // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat). ++ // ++ // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF], ++ // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs' ++ // standard library did not recognize the image format but if SelectDecoder ++ // was overridden, it may examine the input data's starting bytes and still ++ // provide its own image decoder, e.g. for an exotic image file format that's ++ // not in Wuffs' standard library. The prefix_etc fields have the same ++ // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder ++ // implementations should not modify prefix_data's contents. ++ // ++ // SelectDecoder might be called more than once, since some image file ++ // formats can wrap others. For example, a nominal BMP file can actually ++ // contain a JPEG or a PNG. ++ // ++ // The default SelectDecoder accepts the FOURCC codes listed below. For ++ // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance ++ // of the ETC file format is optional (for each value of ETC) and depends on ++ // the corresponding module to be enabled at compile time (i.e. #define'ing ++ // WUFFS_CONFIG__MODULE__ETC). ++ // - WUFFS_BASE__FOURCC__BMP ++ // - WUFFS_BASE__FOURCC__GIF ++ // - WUFFS_BASE__FOURCC__JPEG ++ // - WUFFS_BASE__FOURCC__NIE ++ // - WUFFS_BASE__FOURCC__NPBM ++ // - WUFFS_BASE__FOURCC__PNG ++ // - WUFFS_BASE__FOURCC__QOI ++ // - WUFFS_BASE__FOURCC__TGA ++ // - WUFFS_BASE__FOURCC__WBMP ++ // - WUFFS_BASE__FOURCC__WEBP ++ virtual wuffs_base__image_decoder::unique_ptr // ++ SelectDecoder(uint32_t fourcc, ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed); + +-// -------- ++ // HandleMetadata acknowledges image metadata. minfo.flavor will be one of: ++ // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH ++ // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED ++ // If it is ETC__METADATA_RAW_ETC then raw contains the metadata bytes. Those ++ // bytes should not be retained beyond the the HandleMetadata call. ++ // ++ // minfo.metadata__fourcc() will typically match one of the ++ // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM | ++ // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC ++ // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA. ++ // ++ // It returns an error message, or an empty string on success. ++ virtual std::string // ++ HandleMetadata(const wuffs_base__more_information& minfo, ++ wuffs_base__slice_u8 raw); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__token_decoder__decode_tokens( +- wuffs_base__token_decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ // SelectPixfmt returns the destination pixel format for AllocPixbuf. It ++ // should return wuffs_base__make_pixel_format(etc) called with one of: ++ // - WUFFS_BASE__PIXEL_FORMAT__BGR_565 ++ // - WUFFS_BASE__PIXEL_FORMAT__BGR ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__RGB ++ // - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL ++ // or return image_config.pixcfg.pixel_format(). The latter means to use the ++ // image file's natural pixel format. For example, GIF images' natural pixel ++ // format is an indexed one. ++ // ++ // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat). ++ // ++ // The default SelectPixfmt implementation returns ++ // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which ++ // is 4 bytes per pixel (8 bits per channel × 4 channels). ++ virtual wuffs_base__pixel_format // ++ SelectPixfmt(const wuffs_base__image_config& image_config); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // AllocPixbuf allocates the pixel buffer. ++ // ++ // allow_uninitialized_memory will be true if a valid background_color was ++ // passed to DecodeImage, since the pixel buffer's contents will be ++ // overwritten with that color after AllocPixbuf returns. ++ // ++ // The default AllocPixbuf implementation allocates either uninitialized or ++ // zeroed memory. Zeroed memory typically corresponds to filling with opaque ++ // black or transparent black, depending on the pixel format. ++ virtual AllocPixbufResult // ++ AllocPixbuf(const wuffs_base__image_config& image_config, ++ bool allow_uninitialized_memory); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // AllocWorkbuf allocates the work buffer. The allocated buffer's length ++ // should be at least len_range.min_incl, but larger allocations (up to ++ // len_range.max_incl) may have better performance (by using more memory). ++ // ++ // The default AllocWorkbuf implementation allocates len_range.max_incl bytes ++ // of either uninitialized or zeroed memory. ++ virtual AllocWorkbufResult // ++ AllocWorkbuf(wuffs_base__range_ii_u64 len_range, ++ bool allow_uninitialized_memory); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__get_quirk( +- const wuffs_base__token_decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Done is always the last Callback method called by DecodeImage, whether or ++ // not parsing the input encountered an error. Even when successful, trailing ++ // data may remain in input and buffer. ++ // ++ // The image_decoder is the one returned by SelectDecoder (if SelectDecoder ++ // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr, ++ // ownership moves to the Done implementation. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeImage may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op, other than running the ++ // image_decoder unique_ptr destructor. ++ virtual void // ++ Done(DecodeImageResult& result, ++ sync_io::Input& input, ++ IOBuffer& buffer, ++ wuffs_base__image_decoder::unique_ptr image_decoder); ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++extern const char DecodeImage_BufferIsTooShort[]; ++extern const char DecodeImage_MaxInclDimensionExceeded[]; ++extern const char DecodeImage_MaxInclMetadataLengthExceeded[]; ++extern const char DecodeImage_OutOfMemory[]; ++extern const char DecodeImage_UnexpectedEndOfFile[]; ++extern const char DecodeImage_UnsupportedImageFormat[]; ++extern const char DecodeImage_UnsupportedMetadata[]; ++extern const char DecodeImage_UnsupportedPixelBlend[]; ++extern const char DecodeImage_UnsupportedPixelConfiguration[]; ++extern const char DecodeImage_UnsupportedPixelFormat[]; + +- return 0; +-} ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__history_retain_length( +- const wuffs_base__token_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeImageArgQuirks wraps an optional argument to DecodeImage. ++struct DecodeImageArgQuirks { ++ explicit DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns an empty slice. ++ static DecodeImageArgQuirks DefaultValue(); + +- return 0; +-} ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__token_decoder__set_quirk( +- wuffs_base__token_decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++// DecodeImageArgFlags wraps an optional argument to DecodeImage. ++struct DecodeImageArgFlags { ++ explicit DecodeImageArgFlags(uint64_t repr0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns 0. ++ static DecodeImageArgFlags DefaultValue(); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // TODO: support all of the REPORT_METADATA_ETC flags, not just CHRM, EXIF, ++ // GAMA, ICCP, KVP, SRGB and XMP. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__token_decoder__workbuf_len( +- const wuffs_base__token_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ // Background Color. ++ static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001; ++ // Primary Chromaticities and White Point. ++ static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002; ++ // Exchangeable Image File Format. ++ static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004; ++ // Gamma Correction. ++ static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008; ++ // International Color Consortium Profile. ++ static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010; ++ // Key-Value Pair. ++ // ++ // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the ++ // HandleMetadata callback, the raw argument contains UTF-8 strings. ++ static constexpr uint64_t REPORT_METADATA_KVP = 0x0020; ++ // Modification Time. ++ static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040; ++ // Offset (2-Dimensional). ++ static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080; ++ // Physical Dimensions. ++ static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100; ++ // Standard Red Green Blue (Rendering Intent). ++ static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200; ++ // Extensible Metadata Platform. ++ static constexpr uint64_t REPORT_METADATA_XMP = 0x0400; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ uint64_t repr; ++}; + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage. ++struct DecodeImageArgPixelBlend { ++ explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0); + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) ++ // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC. ++ static DecodeImageArgPixelBlend DefaultValue(); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) ++ wuffs_base__pixel_blend repr; ++}; + +-// ---------------- IEEE 754 Floating Point ++// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage. ++struct DecodeImageArgBackgroundColor { ++ explicit DecodeImageArgBackgroundColor( ++ wuffs_base__color_u32_argb_premul repr0); + +-// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by +-// script/print-hpd-left-shift.go. That script has an optional -comments flag, +-// whose output is not copied here, which prints further detail. +-// +-// These tables are used in +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits. ++ // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul. ++ static DecodeImageArgBackgroundColor DefaultValue(); ++ ++ wuffs_base__color_u32_argb_premul repr; ++}; ++ ++// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage. ++struct DecodeImageArgMaxInclDimension { ++ explicit DecodeImageArgMaxInclDimension(uint32_t repr0); ++ ++ // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels. ++ static DecodeImageArgMaxInclDimension DefaultValue(); ++ ++ uint32_t repr; ++}; ++ ++// DecodeImageArgMaxInclMetadataLength wraps an optional argument to ++// DecodeImage. ++struct DecodeImageArgMaxInclMetadataLength { ++ explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0); ++ ++ // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB. ++ static DecodeImageArgMaxInclMetadataLength DefaultValue(); ++ ++ uint64_t repr; ++}; + +-// wuffs_base__private_implementation__hpd_left_shift[i] encodes the number of +-// new digits created after multiplying a positive integer by (1 << i): the +-// additional length in the decimal representation. For example, shifting "234" +-// by 3 (equivalent to multiplying by 8) will produce "1872". Going from a +-// 3-length string to a 4-length string means that 1 new digit was added (and +-// existing digits may have changed). ++// DecodeImage decodes the image data in input. A variety of image file formats ++// can be decoded, depending on what callbacks.SelectDecoder returns. + // +-// Shifting by i can add either N or N-1 new digits, depending on whether the +-// original positive integer compares >= or < to the i'th power of 5 (as 10 +-// equals 2 * 5). Comparison is lexicographic, not numerical. ++// For animated formats, only the first frame is returned, since the API is ++// simpler for synchronous I/O and having DecodeImage only return when ++// completely done, but rendering animation often involves handling other ++// events in between animation frames. To decode multiple frames of animated ++// images, or for asynchronous I/O (e.g. when decoding an image streamed over ++// the network), use Wuffs' lower level C API instead of its higher level, ++// simplified C++ API (the wuffs_aux API). + // +-// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new +-// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625": +-// - ("1" << 4) is "16", which adds 1 new digit. +-// - ("5678" << 4) is "90848", which adds 1 new digit. +-// - ("624" << 4) is "9984", which adds 1 new digit. +-// - ("62498" << 4) is "999968", which adds 1 new digit. +-// - ("625" << 4) is "10000", which adds 2 new digits. +-// - ("625001" << 4) is "10000016", which adds 2 new digits. +-// - ("7008" << 4) is "112128", which adds 2 new digits. +-// - ("99" << 4) is "1584", which adds 2 new digits. ++// The DecodeImageResult's fields depend on whether decoding succeeded: ++// - On total success, the error_message is empty and pixbuf.pixcfg.is_valid() ++// is true. ++// - On partial success (e.g. the input file was truncated but we are still ++// able to decode some of the pixels), error_message is non-empty but ++// pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to ++// accept or reject partial success. ++// - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid() ++// is false. + // +-// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift +-// array encodes this as: +-// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006. +-// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009. +-// where the ? isn't relevant for i == 4. ++// The callbacks allocate the pixel buffer memory and work buffer memory. On ++// success, pixel buffer memory ownership is passed to the DecodeImage caller ++// as the returned pixbuf_mem_owner. Regardless of success or failure, the work ++// buffer memory is deleted. + // +-// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two +-// possible number of new digits. The low 11 bits are an offset into the +-// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i +-// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9] +-// is the string "\x06\x02\x05", so the relevant power of 5 is "625". ++// The pixel_blend (one of the constants listed below) determines how to ++// composite the decoded image over the pixel buffer's original pixels (as ++// returned by callbacks.AllocPixbuf): ++// - WUFFS_BASE__PIXEL_BLEND__SRC ++// - WUFFS_BASE__PIXEL_BLEND__SRC_OVER + // +-// Thanks to Ken Thompson for the original idea. +-static const uint16_t wuffs_base__private_implementation__hpd_left_shift[65] = { +- 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817, +- 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067, +- 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF, +- 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0, +- 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA, +- 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC, +- 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C, +- 0x051C, 0x051C, +-}; +- +-// wuffs_base__private_implementation__powers_of_5 contains the powers of 5, +-// concatenated together: "5", "25", "125", "625", "3125", etc. +-static const uint8_t wuffs_base__private_implementation__powers_of_5[0x051C] = { +- 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9, +- 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2, +- 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5, +- 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0, +- 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5, +- 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, +- 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, +- 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, +- 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, +- 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, +- 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, +- 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, +- 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, +- 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, +- 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, +- 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, +- 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, +- 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, +- 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, +- 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, +- 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, +- 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, +- 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, +- 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5, +- 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3, +- 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2, +- 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9, +- 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8, +- 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, +- 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, +- 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, +- 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, +- 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, +- 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, +- 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, +- 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, +- 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, +- 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, +- 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, +- 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, +- 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, +- 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, +- 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, +- 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, +- 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, +- 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, +- 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, +- 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1, +- 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1, +- 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4, +- 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7, +- 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, +- 6, 9, 1, 4, 0, 6, 2, 5, +-}; ++// The background_color is used to fill the pixel buffer after ++// callbacks.AllocPixbuf returns, if it is valid in the ++// wuffs_base__color_u32_argb_premul__is_valid sense. The default value, ++// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater ++// than its Alpha channel value (0x00). A valid background_color will typically ++// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might ++// still be visible on partial (not total) success or when pixel_blend is ++// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque. ++// ++// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's ++// width or height is greater than max_incl_dimension or if any opted-in (via ++// flags bits) metadata is longer than max_incl_metadata_length. ++DecodeImageResult // ++DecodeImage(DecodeImageCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(), ++ DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(), ++ DecodeImageArgPixelBlend pixel_blend = ++ DecodeImageArgPixelBlend::DefaultValue(), ++ DecodeImageArgBackgroundColor background_color = ++ DecodeImageArgBackgroundColor::DefaultValue(), ++ DecodeImageArgMaxInclDimension max_incl_dimension = ++ DecodeImageArgMaxInclDimension::DefaultValue(), ++ DecodeImageArgMaxInclMetadataLength max_incl_metadata_length = ++ DecodeImageArgMaxInclMetadataLength::DefaultValue()); + +-// -------- ++} // namespace wuffs_aux + +-// wuffs_base__private_implementation__powers_of_10 contains truncated +-// approximations to the powers of 10, ranging from 1e-307 to 1e+288 inclusive, +-// as 596 pairs of uint64_t values (a 128-bit mantissa). +-// +-// There's also an implicit third column (implied by a linear formula involving +-// the base-10 exponent) that is the base-2 exponent, biased by a magic +-// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias +-// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and +-// wuffs_base__private_implementation__parse_number_f64_eisel_lemire works with +-// multiples-of-64-bit mantissas. +-// +-// For example, the third row holds the approximation to 1e-305: +-// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE)) +-// +-// Similarly, 1e+4 is approximated by: +-// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE)) +-// +-// Similarly, 1e+68 is approximated by: +-// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE)) +-// +-// This table was generated by by script/print-mpb-powers-of-10.go +-static const uint64_t wuffs_base__private_implementation__powers_of_10[596][2] = +- { +- {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 +- {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 +- {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 +- {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 +- {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 +- {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 +- {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 +- {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 +- {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 +- {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 +- {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 +- {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 +- {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 +- {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 +- {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 +- {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 +- {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 +- {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 +- {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 +- {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 +- {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 +- {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 +- {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 +- {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 +- {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 +- {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 +- {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 +- {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 +- {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 +- {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 +- {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 +- {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 +- {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 +- {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 +- {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 +- {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 +- {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 +- {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 +- {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 +- {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 +- {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 +- {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 +- {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 +- {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 +- {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 +- {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 +- {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 +- {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 +- {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 +- {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 +- {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 +- {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 +- {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 +- {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 +- {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 +- {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 +- {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 +- {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 +- {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 +- {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 +- {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 +- {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 +- {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 +- {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 +- {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 +- {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 +- {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 +- {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 +- {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 +- {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 +- {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 +- {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 +- {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 +- {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 +- {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 +- {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 +- {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 +- {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 +- {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 +- {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 +- {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 +- {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 +- {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 +- {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 +- {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 +- {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 +- {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 +- {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 +- {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 +- {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 +- {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 +- {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 +- {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 +- {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 +- {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 +- {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 +- {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 +- {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 +- {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 +- {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 +- {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 +- {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 +- {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 +- {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 +- {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 +- {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 +- {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 +- {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 +- {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 +- {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 +- {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 +- {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 +- {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 +- {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 +- {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 +- {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 +- {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 +- {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 +- {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 +- {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 +- {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 +- {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 +- {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 +- {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 +- {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 +- {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 +- {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 +- {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 +- {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 +- {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 +- {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 +- {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 +- {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 +- {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 +- {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 +- {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 +- {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 +- {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 +- {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 +- {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 +- {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 +- {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 +- {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 +- {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 +- {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 +- {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 +- {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 +- {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 +- {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 +- {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 +- {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 +- {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 +- {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 +- {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 +- {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 +- {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 +- {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 +- {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 +- {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 +- {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 +- {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 +- {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 +- {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 +- {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 +- {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 +- {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 +- {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 +- {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 +- {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 +- {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 +- {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 +- {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 +- {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 +- {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 +- {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 +- {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 +- {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 +- {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 +- {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 +- {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 +- {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 +- {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 +- {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 +- {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 +- {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 +- {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 +- {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 +- {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 +- {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 +- {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 +- {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 +- {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 +- {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 +- {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 +- {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 +- {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 +- {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 +- {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 +- {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 +- {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 +- {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 +- {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 +- {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 +- {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 +- {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 +- {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 +- {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 +- {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 +- {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 +- {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 +- {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 +- {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 +- {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 +- {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 +- {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 +- {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 +- {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 +- {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 +- {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 +- {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 +- {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 +- {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 +- {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 +- {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 +- {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 +- {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 +- {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 +- {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 +- {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 +- {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 +- {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 +- {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 +- {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 +- {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 +- {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 +- {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 +- {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 +- {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 +- {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 +- {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 +- {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 +- {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 +- {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 +- {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 +- {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 +- {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 +- {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 +- {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 +- {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 +- {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 +- {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 +- {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 +- {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 +- {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 +- {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 +- {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 +- {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 +- {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 +- {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 +- {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 +- {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 +- {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 +- {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 +- {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 +- {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 +- {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 +- {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 +- {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 +- {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 +- {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 +- {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 +- {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 +- {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 +- {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 +- {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 +- {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 +- {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 +- {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 +- {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 +- {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 +- {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 +- {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 +- {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 +- {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 +- {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 +- {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 +- {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 +- {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 +- {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 +- {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 +- {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 +- {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 +- {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 +- {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 +- {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 +- {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 +- {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 +- {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 +- {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 +- {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 +- {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 +- {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 +- {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 +- {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 +- {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 +- {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 +- {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 +- {0x0000000000000000, 0x8000000000000000}, // 1e0 +- {0x0000000000000000, 0xA000000000000000}, // 1e1 +- {0x0000000000000000, 0xC800000000000000}, // 1e2 +- {0x0000000000000000, 0xFA00000000000000}, // 1e3 +- {0x0000000000000000, 0x9C40000000000000}, // 1e4 +- {0x0000000000000000, 0xC350000000000000}, // 1e5 +- {0x0000000000000000, 0xF424000000000000}, // 1e6 +- {0x0000000000000000, 0x9896800000000000}, // 1e7 +- {0x0000000000000000, 0xBEBC200000000000}, // 1e8 +- {0x0000000000000000, 0xEE6B280000000000}, // 1e9 +- {0x0000000000000000, 0x9502F90000000000}, // 1e10 +- {0x0000000000000000, 0xBA43B74000000000}, // 1e11 +- {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 +- {0x0000000000000000, 0x9184E72A00000000}, // 1e13 +- {0x0000000000000000, 0xB5E620F480000000}, // 1e14 +- {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 +- {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 +- {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 +- {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 +- {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 +- {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 +- {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 +- {0x0000000000000000, 0x878678326EAC9000}, // 1e22 +- {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 +- {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 +- {0x0000000000000000, 0x84595161401484A0}, // 1e25 +- {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 +- {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 +- {0x4000000000000000, 0x813F3978F8940984}, // 1e28 +- {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 +- {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 +- {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 +- {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 +- {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 +- {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 +- {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 +- {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 +- {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 +- {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 +- {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 +- {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 +- {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 +- {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 +- {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 +- {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 +- {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 +- {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 +- {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 +- {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 +- {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 +- {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 +- {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 +- {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 +- {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 +- {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 +- {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 +- {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 +- {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 +- {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 +- {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 +- {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 +- {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 +- {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 +- {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 +- {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 +- {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 +- {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 +- {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 +- {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 +- {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 +- {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 +- {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 +- {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 +- {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 +- {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 +- {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 +- {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 +- {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 +- {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 +- {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 +- {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 +- {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 +- {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 +- {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 +- {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 +- {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 +- {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 +- {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 +- {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 +- {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 +- {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 +- {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 +- {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 +- {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 +- {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 +- {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 +- {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 +- {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 +- {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 +- {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 +- {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 +- {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 +- {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 +- {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 +- {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 +- {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 +- {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 +- {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 +- {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 +- {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 +- {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 +- {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 +- {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 +- {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 +- {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 +- {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 +- {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 +- {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 +- {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 +- {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 +- {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 +- {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 +- {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 +- {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 +- {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 +- {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 +- {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 +- {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 +- {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 +- {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 +- {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 +- {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 +- {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 +- {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 +- {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 +- {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 +- {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 +- {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 +- {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 +- {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 +- {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 +- {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 +- {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 +- {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 +- {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 +- {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 +- {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 +- {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 +- {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 +- {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 +- {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 +- {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 +- {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 +- {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 +- {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 +- {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 +- {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 +- {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 +- {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 +- {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 +- {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 +- {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 +- {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 +- {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 +- {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 +- {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 +- {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 +- {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 +- {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 +- {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 +- {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 +- {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 +- {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 +- {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 +- {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 +- {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 +- {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 +- {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 +- {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 +- {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 +- {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 +- {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 +- {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 +- {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 +- {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 +- {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 +- {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 +- {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 +- {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 +- {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 +- {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 +- {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 +- {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 +- {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 +- {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 +- {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 +- {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 +- {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 +- {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 +- {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 +- {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 +- {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 +- {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 +- {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 +- {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 +- {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 +- {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 +- {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 +- {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 +- {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 +- {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 +- {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 +- {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 +- {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 +- {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 +- {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 +- {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 +- {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 +- {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 +- {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 +- {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 +- {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 +- {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 +- {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 +- {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 +- {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 +- {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 +- {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 +- {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 +- {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 +- {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 +- {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 +- {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 +- {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 +- {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 +- {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 +- {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 +- {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 +- {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 +- {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 +- {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 +- {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 +- {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 +- {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 +- {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 +- {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 +- {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 +- {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 +- {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 +- {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 +- {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 +- {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 +- {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 +- {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 +- {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 +- {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 +- {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 +- {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 +- {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 +- {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 +- {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 +- {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 +- {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 +- {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 +- {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 +- {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 +- {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 +- {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 +- {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 +- {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 +- {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 +- {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 +- {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 +- {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 +- {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 +- {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 +- {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 +- {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 +- {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 +- {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 +- {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 +- {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 +- {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 +- {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 +- {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 +- {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 +- {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 +- {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 +- {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 +-}; ++// ---------------- Auxiliary - JSON + +-// wuffs_base__private_implementation__f64_powers_of_10 holds powers of 10 that +-// can be exactly represented by a float64 (what C calls a double). +-static const double wuffs_base__private_implementation__f64_powers_of_10[23] = { +- 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, +- 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, ++namespace wuffs_aux { ++ ++struct DecodeJsonResult { ++ DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0); ++ ++ std::string error_message; ++ uint64_t cursor_position; + }; + +-// ---------------- IEEE 754 Floating Point ++class DecodeJsonCallbacks { ++ public: ++ virtual ~DecodeJsonCallbacks(); + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // +-wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) { +- uint64_t u = 0; +- if (sizeof(uint64_t) == sizeof(double)) { +- memcpy(&u, &f, sizeof(uint64_t)); +- } +- uint16_t neg = ((uint16_t)((u >> 63) << 15)); +- u &= 0x7FFFFFFFFFFFFFFF; +- uint64_t exp = u >> 52; +- uint64_t man = u & 0x000FFFFFFFFFFFFF; ++ // AppendXxx are called for leaf nodes: literals, numbers and strings. For ++ // strings, the Callbacks implementation is responsible for tracking map keys ++ // versus other values. + +- if (exp == 0x7FF) { +- if (man == 0) { // Infinity. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7C00; +- ret.lossy = false; +- return ret; +- } +- // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most +- // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9 +- // bits of ret.value so that the 10-bit mantissa is non-zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42)); +- ret.lossy = false; +- return ret; ++ virtual std::string AppendNull() = 0; ++ virtual std::string AppendBool(bool val) = 0; ++ virtual std::string AppendF64(double val) = 0; ++ virtual std::string AppendI64(int64_t val) = 0; ++ virtual std::string AppendTextString(std::string&& val) = 0; + +- } else if (exp > 0x40E) { // Truncate to the largest finite f16. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7BFF; +- ret.lossy = true; +- return ret; ++ // Push and Pop are called for container nodes: JSON arrays (lists) and JSON ++ // objects (dictionaries). ++ // ++ // The flags bits combine exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT ++ // and exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + +- } else if (exp <= 0x3E6) { // Truncate to zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg; +- ret.lossy = (u != 0); +- return ret; ++ virtual std::string Push(uint32_t flags) = 0; ++ virtual std::string Pop(uint32_t flags) = 0; + +- } else if (exp <= 0x3F0) { // Normal f64, subnormal f16. +- // Convert from a 53-bit mantissa (after realizing the implicit bit) to a +- // 10-bit mantissa and then adjust for the exponent. +- man |= 0x0010000000000000; +- uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10. +- uint64_t shifted_man = man >> shift; +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | ((uint16_t)shifted_man); +- ret.lossy = (shifted_man << shift) != man; +- return ret; +- } ++ // Done is always the last Callback method called by DecodeJson, whether or ++ // not parsing the input as JSON encountered an error. Even when successful, ++ // trailing data may remain in input and buffer. See "Unintuitive JSON ++ // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON ++ // parsing and when it stops. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeJson may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op. ++ virtual void // ++ Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer); ++}; + +- // Normal f64, normal f16. ++extern const char DecodeJson_BadJsonPointer[]; ++extern const char DecodeJson_NoMatch[]; + +- // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits. +- exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF. ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +- // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit +- // mantissa (again excluding the implicit bit). We lose some information if +- // any of the bottom 42 bits are non-zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42)); +- ret.lossy = (man << 22) != 0; +- return ret; +-} ++// DecodeJsonArgQuirks wraps an optional argument to DecodeJson. ++struct DecodeJsonArgQuirks { ++ explicit DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // +-wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) { +- uint64_t u = 0; +- if (sizeof(uint64_t) == sizeof(double)) { +- memcpy(&u, &f, sizeof(uint64_t)); +- } +- uint32_t neg = ((uint32_t)(u >> 63)) << 31; +- u &= 0x7FFFFFFFFFFFFFFF; +- uint64_t exp = u >> 52; +- uint64_t man = u & 0x000FFFFFFFFFFFFF; ++ // DefaultValue returns an empty slice. ++ static DecodeJsonArgQuirks DefaultValue(); + +- if (exp == 0x7FF) { +- if (man == 0) { // Infinity. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7F800000; +- ret.lossy = false; +- return ret; +- } +- // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most +- // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22 +- // bits of ret.value so that the 23-bit mantissa is non-zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29)); +- ret.lossy = false; +- return ret; ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +- } else if (exp > 0x47E) { // Truncate to the largest finite f32. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7F7FFFFF; +- ret.lossy = true; +- return ret; ++// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson. ++struct DecodeJsonArgJsonPointer { ++ explicit DecodeJsonArgJsonPointer(std::string repr0); + +- } else if (exp <= 0x369) { // Truncate to zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg; +- ret.lossy = (u != 0); +- return ret; ++ // DefaultValue returns an empty string. ++ static DecodeJsonArgJsonPointer DefaultValue(); + +- } else if (exp <= 0x380) { // Normal f64, subnormal f32. +- // Convert from a 53-bit mantissa (after realizing the implicit bit) to a +- // 23-bit mantissa and then adjust for the exponent. +- man |= 0x0010000000000000; +- uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23. +- uint64_t shifted_man = man >> shift; +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | ((uint32_t)shifted_man); +- ret.lossy = (shifted_man << shift) != man; +- return ret; +- } ++ std::string repr; ++}; + +- // Normal f64, normal f32. ++// DecodeJson calls callbacks based on the JSON-formatted data in input. ++// ++// On success, the returned error_message is empty and cursor_position counts ++// the number of bytes consumed. On failure, error_message is non-empty and ++// cursor_position is the location of the error. That error may be a content ++// error (invalid JSON) or an input error (e.g. network failure). ++// ++// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks ++// run for the input's sub-node that matches the query. DecodeJson_NoMatch is ++// returned if no matching sub-node was found. The empty query matches the ++// input's root node, consistent with JSON Pointer semantics. ++// ++// The JSON Pointer implementation is greedy: duplicate keys are not rejected ++// but only the first match for each '/'-separated fragment is followed. ++DecodeJsonResult // ++DecodeJson(DecodeJsonCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(), ++ DecodeJsonArgJsonPointer json_pointer = ++ DecodeJsonArgJsonPointer::DefaultValue()); + +- // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits. +- exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F. ++} // namespace wuffs_aux + +- // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit +- // mantissa (again excluding the implicit bit). We lose some information if +- // any of the bottom 29 bits are non-zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29)); +- ret.lossy = (man << 35) != 0; +- return ret; +-} ++#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// -------- ++// ‼ WUFFS C HEADER ENDS HERE. ++#ifdef WUFFS_IMPLEMENTATION + +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE 2047 +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION 800 ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL is the largest N +-// such that ((10 << N) < (1 << 64)). +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL 60 ++// ---------------- Fundamentals + +-// wuffs_base__private_implementation__high_prec_dec (abbreviated as HPD) is a +-// fixed precision floating point decimal number, augmented with ±infinity +-// values, but it cannot represent NaN (Not a Number). ++// WUFFS_BASE__MAGIC is a magic number to check that initializers are called. ++// It's not foolproof, given C doesn't automatically zero memory before use, ++// but it should catch 99.99% of cases. + // +-// "High precision" means that the mantissa holds 800 decimal digits. 800 is +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION. ++// Its (non-zero) value is arbitrary, based on md5sum("wuffs"). ++#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) ++ ++// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable ++// error was previously encountered. + // +-// An HPD isn't for general purpose arithmetic, only for conversions to and +-// from IEEE 754 double-precision floating point, where the largest and +-// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324. +-// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047 +-// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION and +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. ++// Its (non-zero) value is arbitrary, based on md5sum("disabled"). ++#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2) ++ ++// Use switch cases for coroutine suspension points, similar to the technique ++// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html + // +-// digits[.. num_digits] are the number's digits in big-endian order. The +-// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7' +-// is the ASCII value 0x37. ++// The implicit fallthrough is intentional. + // +-// decimal_point is the index (within digits) of the decimal point. It may be +-// negative or be larger than num_digits, in which case the explicit digits are +-// padded with implicit zeroes. ++// We use trivial macros instead of an explicit assignment and case statement ++// so that clang-format doesn't get confused by the unusual "case"s. ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ ++ coro_susp_point = n; \ ++ case n:; ++ ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ ++ if (!status.repr) { \ ++ goto ok; \ ++ } else if (*status.repr != '$') { \ ++ goto exit; \ ++ } \ ++ coro_susp_point = n; \ ++ goto suspend; \ ++ case n:; ++ ++// The "defined(__clang__)" isn't redundant. While vanilla clang defines ++// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. ++#if defined(__GNUC__) || defined(__clang__) ++#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) ++#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) ++#else ++#define WUFFS_BASE__LIKELY(expr) (expr) ++#define WUFFS_BASE__UNLIKELY(expr) (expr) ++#endif ++ ++// -------- ++ ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__ignore_status(wuffs_base__status z) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++static inline wuffs_base__status // ++wuffs_private_impl__status__ensure_not_a_suspension(wuffs_base__status z) { ++ if (z.repr && (*z.repr == '$')) { ++ z.repr = wuffs_base__error__cannot_return_a_suspension; ++ } ++ return z; ++} ++ ++// -------- ++ ++// wuffs_private_impl__iterate_total_advance returns the exclusive ++// pointer-offset at which iteration should stop. The overall slice has length ++// total_len, each iteration's sub-slice has length iter_len and are placed ++// iter_advance apart. + // +-// For example, if num_digits is 3 and digits is "\x07\x08\x09": +-// - A decimal_point of -2 means ".00789" +-// - A decimal_point of -1 means ".0789" +-// - A decimal_point of +0 means ".789" +-// - A decimal_point of +1 means "7.89" +-// - A decimal_point of +2 means "78.9" +-// - A decimal_point of +3 means "789." +-// - A decimal_point of +4 means "7890." +-// - A decimal_point of +5 means "78900." ++// The iter_advance may not be larger than iter_len. The iter_advance may be ++// smaller than iter_len, in which case the sub-slices will overlap. + // +-// As above, a decimal_point higher than +2047 means that the overall value is +-// infinity, lower than -2047 means zero. ++// The return value r satisfies ((0 <= r) && (r <= total_len)). + // +-// negative is a sign bit. An HPD can distinguish positive and negative zero. ++// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are ++// four iterations at offsets 0, 3, 6 and 9. This function returns 12. + // +-// truncated is whether there are more than +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION digits, and at +-// least one of those extra digits are non-zero. The existence of long-tail +-// digits can affect rounding. ++// 0123456789012345 ++// [....] ++// [....] ++// [....] ++// [....] ++// $ ++// 0123456789012345 + // +-// The "all fields are zero" value is valid, and represents the number +0. +-typedef struct wuffs_base__private_implementation__high_prec_dec__struct { +- uint32_t num_digits; +- int32_t decimal_point; +- bool negative; +- bool truncated; +- uint8_t digits[WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION]; +-} wuffs_base__private_implementation__high_prec_dec; +- +-// wuffs_base__private_implementation__high_prec_dec__trim trims trailing +-// zeroes from the h->digits[.. h->num_digits] slice. They have no benefit, +-// since we explicitly track h->decimal_point. ++// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are ++// three iterations at offsets 0, 5 and 10. This function returns 15. + // +-// Preconditions: +-// - h is non-NULL. +-static inline void // +-wuffs_base__private_implementation__high_prec_dec__trim( +- wuffs_base__private_implementation__high_prec_dec* h) { +- while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) { +- h->num_digits--; ++// 0123456789012345 ++// [....] ++// [....] ++// [....] ++// $ ++// 0123456789012345 ++static inline size_t // ++wuffs_private_impl__iterate_total_advance(size_t total_len, ++ size_t iter_len, ++ size_t iter_advance) { ++ if (total_len >= iter_len) { ++ size_t n = total_len - iter_len; ++ return ((n / iter_advance) * iter_advance) + iter_advance; + } ++ return 0; + } + +-// wuffs_base__private_implementation__high_prec_dec__assign sets h to +-// represent the number x. +-// +-// Preconditions: +-// - h is non-NULL. +-static void // +-wuffs_base__private_implementation__high_prec_dec__assign( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint64_t x, +- bool negative) { +- uint32_t n = 0; ++// ---------------- Numeric Types + +- // Set h->digits. +- if (x > 0) { +- // Calculate the digits, working right-to-left. After we determine n (how +- // many digits there are), copy from buf to h->digits. +- // +- // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to +- // copy a constant number of bytes than a variable number (20 instead of +- // n). Make buf large enough (and start writing to it from the middle) so +- // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)]. +- uint8_t buf[40] = {0}; +- uint8_t* ptr = &buf[20]; +- do { +- uint64_t remaining = x / 10; +- x -= remaining * 10; +- ptr--; +- *ptr = (uint8_t)x; +- n++; +- x = remaining; +- } while (x > 0); +- memcpy(h->digits, ptr, 20); +- } ++extern const uint8_t wuffs_private_impl__low_bits_mask__u8[8]; ++extern const uint16_t wuffs_private_impl__low_bits_mask__u16[16]; ++extern const uint32_t wuffs_private_impl__low_bits_mask__u32[32]; ++extern const uint64_t wuffs_private_impl__low_bits_mask__u64[64]; + +- // Set h's other fields. +- h->num_digits = n; +- h->decimal_point = (int32_t)n; +- h->negative = negative; +- h->truncated = false; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8(n) \ ++ (wuffs_private_impl__low_bits_mask__u8[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16(n) \ ++ (wuffs_private_impl__low_bits_mask__u16[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(n) \ ++ (wuffs_private_impl__low_bits_mask__u32[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(n) \ ++ (wuffs_private_impl__low_bits_mask__u64[n]) ++ ++// -------- ++ ++static inline void // ++wuffs_private_impl__u8__sat_add_indirect(uint8_t* x, uint8_t y) { ++ *x = wuffs_base__u8__sat_add(*x, y); + } + +-static wuffs_base__status // +-wuffs_base__private_implementation__high_prec_dec__parse( +- wuffs_base__private_implementation__high_prec_dec* h, +- wuffs_base__slice_u8 s, +- uint32_t options) { +- if (!h) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- h->num_digits = 0; +- h->decimal_point = 0; +- h->negative = false; +- h->truncated = false; ++static inline void // ++wuffs_private_impl__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { ++ *x = wuffs_base__u8__sat_sub(*x, y); ++} + +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++static inline void // ++wuffs_private_impl__u16__sat_add_indirect(uint16_t* x, uint16_t y) { ++ *x = wuffs_base__u16__sat_add(*x, y); ++} + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } ++static inline void // ++wuffs_private_impl__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { ++ *x = wuffs_base__u16__sat_sub(*x, y); ++} + +- // Parse sign. +- do { +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- h->negative = true; +- p++; +- } else { +- break; +- } +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } +- } while (0); ++static inline void // ++wuffs_private_impl__u32__sat_add_indirect(uint32_t* x, uint32_t y) { ++ *x = wuffs_base__u32__sat_add(*x, y); ++} + +- // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each +- // limb in this if-else chain: +- // - "0.789" +- // - "1002.789" +- // - ".789" +- // - Other (invalid input). +- uint32_t nd = 0; +- int32_t dp = 0; +- bool no_digits_before_separator = false; +- if (('0' == *p) && +- !(options & +- WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) { +- p++; +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if (*p == +- ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- goto after_sep; +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++static inline void // ++wuffs_private_impl__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { ++ *x = wuffs_base__u32__sat_sub(*x, y); ++} + +- } else if (('0' <= *p) && (*p <= '9')) { +- if (*p == '0') { +- for (; (p < q) && (*p == '0'); p++) { +- } +- } else { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- dp = (int32_t)nd; +- p++; +- } ++static inline void // ++wuffs_private_impl__u64__sat_add_indirect(uint64_t* x, uint64_t y) { ++ *x = wuffs_base__u64__sat_add(*x, y); ++} + +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if (('0' <= *p) && (*p <= '9')) { +- if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- dp = (int32_t)nd; +- } else if ('0' != *p) { +- // Long-tail non-zeroes set the truncated bit. +- h->truncated = true; +- } +- } else if (*p == +- ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- goto after_sep; +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++static inline void // ++wuffs_private_impl__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { ++ *x = wuffs_base__u64__sat_sub(*x, y); ++} + +- } else if (*p == ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- no_digits_before_separator = true; ++// ---------------- Numeric Types (Utility) + +- } else { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } ++#define wuffs_base__utility__sign_extend_convert_u8_u32(a) \ ++ ((uint32_t)(int32_t)(int8_t)(a)) + +-after_sep: +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if ('0' == *p) { +- if (nd == 0) { +- // Track leading zeroes implicitly. +- dp--; +- } else if (nd < +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- } +- } else if (('0' < *p) && (*p <= '9')) { +- if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- } else { +- // Long-tail non-zeroes set the truncated bit. +- h->truncated = true; +- } +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \ ++ ((uint32_t)(int32_t)(int16_t)(a)) + +-after_exp: +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } ++#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \ ++ ((uint32_t)(((int32_t)(a)) >> (n))) + +- int32_t exp_sign = +1; +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- exp_sign = -1; +- p++; +- } ++#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \ ++ ((uint64_t)(((int64_t)(a)) >> (n))) + +- int32_t exp = 0; +- const int32_t exp_large = +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; +- bool saw_exp_digits = false; +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- // No-op. +- } else if (('0' <= *p) && (*p <= '9')) { +- saw_exp_digits = true; +- if (exp < exp_large) { +- exp = (10 * exp) + ((int32_t)(*p - '0')); +- } +- } else { +- break; +- } +- } +- if (!saw_exp_digits) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- dp += exp_sign * exp; +- } while (0); ++#define wuffs_base__utility__make_bitvec256(e00, e01, e02, e03) \ ++ wuffs_base__make_bitvec256(e00, e01, e02, e03) + +-after_all: +- if (p != q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- h->num_digits = nd; +- if (nd == 0) { +- if (no_digits_before_separator) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- h->decimal_point = 0; +- } else if (dp < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- h->decimal_point = +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE - 1; +- } else if (dp > +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- h->decimal_point = +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + 1; +- } else { +- h->decimal_point = dp; +- } +- wuffs_base__private_implementation__high_prec_dec__trim(h); +- return wuffs_base__make_status(NULL); +-} ++#define wuffs_base__utility__make_optional_u63(h, v) \ ++ wuffs_base__make_optional_u63(h, v) + +-// -------- ++// ---------------- Slices and Tables + +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +-// returns the number of additional decimal digits when left-shifting by shift. ++// This function basically returns (ptr + len), except that that expression is ++// Undefined Behavior in C (but not C++) when ptr is NULL, even if len is zero. + // +-// See below for preconditions. +-static uint32_t // +-wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- // Masking with 0x3F should be unnecessary (assuming the preconditions) but +- // it's cheap and ensures that we don't overflow the +- // wuffs_base__private_implementation__hpd_left_shift array. +- shift &= 63; ++// Precondition: (ptr != NULL) || (len == 0). ++static inline const uint8_t* // ++wuffs_private_impl__ptr_u8_plus_len(const uint8_t* ptr, size_t len) { ++ return ptr ? (ptr + len) : NULL; ++} + +- uint32_t x_a = wuffs_base__private_implementation__hpd_left_shift[shift]; +- uint32_t x_b = wuffs_base__private_implementation__hpd_left_shift[shift + 1]; +- uint32_t num_new_digits = x_a >> 11; +- uint32_t pow5_a = 0x7FF & x_a; +- uint32_t pow5_b = 0x7FF & x_b; ++// -------- + +- const uint8_t* pow5 = +- &wuffs_base__private_implementation__powers_of_5[pow5_a]; +- uint32_t i = 0; +- uint32_t n = pow5_b - pow5_a; +- for (; i < n; i++) { +- if (i >= h->num_digits) { +- return num_new_digits - 1; +- } else if (h->digits[i] == pow5[i]) { +- continue; +- } else if (h->digits[i] < pow5[i]) { +- return num_new_digits - 1; +- } else { +- return num_new_digits; +- } ++// wuffs_private_impl__slice_u8__prefix returns up to the first up_to bytes of ++// s. ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) { ++ if (((uint64_t)(s.len)) > up_to) { ++ s.len = ((size_t)up_to); + } +- return num_new_digits; ++ return s; + } + +-// -------- ++// wuffs_private_impl__slice_u8__suffix returns up to the last up_to bytes of ++// s. ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) { ++ if (((uint64_t)(s.len)) > up_to) { ++ s.ptr += ((uint64_t)(s.len)) - up_to; ++ s.len = ((size_t)up_to); ++ } ++ return s; ++} + +-// wuffs_base__private_implementation__high_prec_dec__rounded_integer returns +-// the integral (non-fractional) part of h, provided that it is 18 or fewer +-// decimal digits. For 19 or more digits, it returns UINT64_MAX. Note that: +-// - (1 << 53) is 9007199254740992, which has 16 decimal digits. +-// - (1 << 56) is 72057594037927936, which has 17 decimal digits. +-// - (1 << 59) is 576460752303423488, which has 18 decimal digits. +-// - (1 << 63) is 9223372036854775808, which has 19 decimal digits. +-// and that IEEE 754 double precision has 52 mantissa bits. ++// wuffs_private_impl__slice_u8__copy_from_slice calls memmove(dst.ptr, ++// src.ptr, len) where len is the minimum of dst.len and src.len. + // +-// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8. +-// +-// h's negative bit is ignored: rounding -8.6 returns 9. +-// +-// See below for preconditions. +-static uint64_t // +-wuffs_base__private_implementation__high_prec_dec__rounded_integer( +- wuffs_base__private_implementation__high_prec_dec* h) { +- if ((h->num_digits == 0) || (h->decimal_point < 0)) { +- return 0; +- } else if (h->decimal_point > 18) { +- return UINT64_MAX; ++// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty ++// slice) is valid and results in a no-op. ++static inline uint64_t // ++wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src) { ++ size_t len = dst.len < src.len ? dst.len : src.len; ++ if (len > 0) { ++ memmove(dst.ptr, src.ptr, len); + } ++ return len; ++} + +- uint32_t dp = (uint32_t)(h->decimal_point); +- uint64_t n = 0; +- uint32_t i = 0; +- for (; i < dp; i++) { +- n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0); ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_load_host_endian(void* ptr, ++ size_t len, ++ wuffs_base__slice_u8 src) { ++ if (len && (len <= src.len)) { ++ memmove(ptr, src.ptr, len); + } ++ return wuffs_base__make_empty_struct(); ++} + +- bool round_up = false; +- if (dp < h->num_digits) { +- round_up = h->digits[dp] >= 5; +- if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) { +- // We are exactly halfway. If we're truncated, round up, otherwise round +- // to even. +- round_up = h->truncated || // +- ((dp > 0) && (1 & h->digits[dp - 1])); +- } +- } +- if (round_up) { +- n++; ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_memset(void* ptr, size_t len, uint8_t byte_value) { ++ if (len) { ++ memset(ptr, byte_value, len); + } ++ return wuffs_base__make_empty_struct(); ++} + +- return n; ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_save_host_endian(void* ptr, ++ size_t len, ++ wuffs_base__slice_u8 dst) { ++ if (len && (len <= dst.len)) { ++ memmove(dst.ptr, ptr, len); ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// wuffs_base__private_implementation__high_prec_dec__small_xshift shifts h's +-// number (where 'x' is 'l' or 'r' for left or right) by a small shift value. +-// +-// Preconditions: +-// - h is non-NULL. +-// - h->decimal_point is "not extreme". +-// - shift is non-zero. +-// - shift is "a small shift". +-// +-// "Not extreme" means within +-// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. +-// +-// "A small shift" means not more than +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +-// +-// wuffs_base__private_implementation__high_prec_dec__rounded_integer and +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +-// have the same preconditions. +-// +-// wuffs_base__private_implementation__high_prec_dec__lshift keeps the first +-// two preconditions but not the last two. Its shift argument is signed and +-// does not need to be "small": zero is a no-op, positive means left shift and +-// negative means right shift. ++// -------- + +-static void // +-wuffs_base__private_implementation__high_prec_dec__small_lshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- if (h->num_digits == 0) { +- return; ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) { ++ if (t.ptr && (y < t.height)) { ++ return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width); + } +- uint32_t num_new_digits = +- wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( +- h, shift); +- uint32_t rx = h->num_digits - 1; // Read index. +- uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index. +- uint64_t n = 0; ++ return wuffs_base__empty_slice_u8(); ++} + +- // Repeat: pick up a digit, put down a digit, right to left. +- while (((int32_t)rx) >= 0) { +- n += ((uint64_t)(h->digits[rx])) << shift; +- uint64_t quo = n / 10; +- uint64_t rem = n - (10 * quo); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx] = (uint8_t)rem; +- } else if (rem > 0) { +- h->truncated = true; +- } +- n = quo; +- wx--; +- rx--; +- } ++// ---------------- Slices and Tables (Utility) + +- // Put down leading digits, right to left. +- while (n > 0) { +- uint64_t quo = n / 10; +- uint64_t rem = n - (10 * quo); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx] = (uint8_t)rem; +- } else if (rem > 0) { +- h->truncated = true; +- } +- n = quo; +- wx--; +- } ++#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8 + +- // Finish. +- h->num_digits += num_new_digits; +- if (h->num_digits > +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->num_digits = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; +- } +- h->decimal_point += (int32_t)num_new_digits; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++// ---------------- Ranges and Rects ++ ++static inline uint32_t // ++wuffs_private_impl__range_ii_u32__get_min_incl( ++ const wuffs_base__range_ii_u32* r) { ++ return r->min_incl; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__small_rshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- uint32_t rx = 0; // Read index. +- uint32_t wx = 0; // Write index. +- uint64_t n = 0; ++static inline uint32_t // ++wuffs_private_impl__range_ii_u32__get_max_incl( ++ const wuffs_base__range_ii_u32* r) { ++ return r->max_incl; ++} + +- // Pick up enough leading digits to cover the first shift. +- while ((n >> shift) == 0) { +- if (rx < h->num_digits) { +- // Read a digit. +- n = (10 * n) + h->digits[rx++]; +- } else if (n == 0) { +- // h's number used to be zero and remains zero. +- return; +- } else { +- // Read sufficient implicit trailing zeroes. +- while ((n >> shift) == 0) { +- n = 10 * n; +- rx++; +- } +- break; +- } +- } +- h->decimal_point -= ((int32_t)(rx - 1)); +- if (h->decimal_point < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- // After the shift, h's number is effectively zero. +- h->num_digits = 0; +- h->decimal_point = 0; +- h->truncated = false; +- return; +- } ++static inline uint32_t // ++wuffs_private_impl__range_ie_u32__get_min_incl( ++ const wuffs_base__range_ie_u32* r) { ++ return r->min_incl; ++} + +- // Repeat: pick up a digit, put down a digit, left to right. +- uint64_t mask = (((uint64_t)(1)) << shift) - 1; +- while (rx < h->num_digits) { +- uint8_t new_digit = ((uint8_t)(n >> shift)); +- n = (10 * (n & mask)) + h->digits[rx++]; +- h->digits[wx++] = new_digit; +- } ++static inline uint32_t // ++wuffs_private_impl__range_ie_u32__get_max_excl( ++ const wuffs_base__range_ie_u32* r) { ++ return r->max_excl; ++} + +- // Put down trailing digits, left to right. +- while (n > 0) { +- uint8_t new_digit = ((uint8_t)(n >> shift)); +- n = 10 * (n & mask); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx++] = new_digit; +- } else if (new_digit > 0) { +- h->truncated = true; +- } +- } ++static inline uint64_t // ++wuffs_private_impl__range_ii_u64__get_min_incl( ++ const wuffs_base__range_ii_u64* r) { ++ return r->min_incl; ++} + +- // Finish. +- h->num_digits = wx; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++static inline uint64_t // ++wuffs_private_impl__range_ii_u64__get_max_incl( ++ const wuffs_base__range_ii_u64* r) { ++ return r->max_incl; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__lshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t shift) { +- if (shift > 0) { +- while (shift > +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); +- shift -= WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, ((uint32_t)(+shift))); +- } else if (shift < 0) { +- while (shift < -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- wuffs_base__private_implementation__high_prec_dec__small_rshift( +- h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); +- shift += WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_rshift( +- h, ((uint32_t)(-shift))); +- } ++static inline uint64_t // ++wuffs_private_impl__range_ie_u64__get_min_incl( ++ const wuffs_base__range_ie_u64* r) { ++ return r->min_incl; + } + +-// -------- ++static inline uint64_t // ++wuffs_private_impl__range_ie_u64__get_max_excl( ++ const wuffs_base__range_ie_u64* r) { ++ return r->max_excl; ++} + +-// wuffs_base__private_implementation__high_prec_dec__round_etc rounds h's +-// number. For those functions that take an n argument, rounding produces at +-// most n digits (which is not necessarily at most n decimal places). Negative +-// n values are ignored, as well as any n greater than or equal to h's number +-// of digits. The etc__round_just_enough function implicitly chooses an n to +-// implement WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION. +-// +-// Preconditions: +-// - h is non-NULL. +-// - h->decimal_point is "not extreme". +-// +-// "Not extreme" means within +-// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. ++// ---------------- Ranges and Rects (Utility) + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_down( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32 ++#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32 ++#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64 ++#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64 ++#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32 ++#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32 ++#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32 ++#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32 ++#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64 ++#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64 ++#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32 ++#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32 ++ ++// ---------------- I/O ++ ++static inline uint64_t // ++wuffs_private_impl__io__count_since(uint64_t mark, uint64_t index) { ++ if (index >= mark) { ++ return index - mark; + } +- h->num_digits = (uint32_t)(n); +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++ return 0; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_up( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++// TODO: drop the "const" in "const uint8_t* ptr". Some though required about ++// the base.io_reader.since method returning a mutable "slice base.u8". ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__io__since(uint64_t mark, ++ uint64_t index, ++ const uint8_t* ptr) { ++ if (index >= mark) { ++ return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark, ++ ((size_t)(index - mark))); + } ++ return wuffs_base__empty_slice_u8(); ++} ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + +- for (n--; n >= 0; n--) { +- if (h->digits[n] < 9) { +- h->digits[n]++; +- h->num_digits = (uint32_t)(n + 1); +- return; +- } +- } ++// -------- + +- // The number is all 9s. Change to a single 1 and adjust the decimal point. +- h->digits[0] = 1; +- h->num_digits = 1; +- h->decimal_point++; ++static inline void // ++wuffs_private_impl__io_reader__limit(const uint8_t** ptr_io2_r, ++ const uint8_t* iop_r, ++ uint64_t limit) { ++ if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) { ++ *ptr_io2_r = iop_r + limit; ++ } + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_nearest( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++static inline uint32_t // ++wuffs_private_impl__io_reader__limited_copy_u32_to_slice( ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r, ++ uint32_t length, ++ wuffs_base__slice_u8 dst) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ size_t n = dst.len; ++ if (n > length) { ++ n = length; + } +- bool up = h->digits[n] >= 5; +- if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) { +- up = h->truncated || // +- ((n > 0) && ((h->digits[n - 1] & 1) != 0)); ++ if (n > ((size_t)(io2_r - iop_r))) { ++ n = (size_t)(io2_r - iop_r); + } +- +- if (up) { +- wuffs_base__private_implementation__high_prec_dec__round_up(h, n); +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_down(h, n); ++ if (n > 0) { ++ memmove(dst.ptr, iop_r, n); ++ *ptr_iop_r += n; + } ++ return (uint32_t)(n); + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t exp2, +- uint64_t mantissa) { +- // The magic numbers 52 and 53 in this function are because IEEE 754 double +- // precision has 52 mantissa bits. +- // +- // Let f be the floating point number represented by exp2 and mantissa (and +- // also the number in h): the number (mantissa * (2 ** (exp2 - 52))). +- // +- // If f is zero or a small integer, we can return early. +- if ((mantissa == 0) || +- ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) { +- return; ++// wuffs_private_impl__io_reader__match7 returns whether the io_reader's ++// upcoming bytes start with the given prefix (up to 7 bytes long). It is ++// peek-like, not read-like, in that there are no side-effects. ++// ++// The low 3 bits of a hold the prefix length, n. ++// ++// The high 56 bits of a hold the prefix itself, in little-endian order. The ++// first prefix byte is in bits 8..=15, the second prefix byte is in bits ++// 16..=23, etc. The high (8 * (7 - n)) bits are ignored. ++// ++// There are three possible return values: ++// - 0 means success. ++// - 1 means inconclusive, equivalent to "$short read". ++// - 2 means failure. ++static inline uint32_t // ++wuffs_private_impl__io_reader__match7(const uint8_t* iop_r, ++ const uint8_t* io2_r, ++ wuffs_base__io_buffer* r, ++ uint64_t a) { ++ uint32_t n = a & 7; ++ a >>= 8; ++ if ((io2_r - iop_r) >= 8) { ++ uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r); ++ uint32_t shift = 8 * (8 - n); ++ return ((a << shift) == (x << shift)) ? 0 : 2; ++ } ++ for (; n > 0; n--) { ++ if (iop_r >= io2_r) { ++ return (r && r->meta.closed) ? 2 : 1; ++ } else if (*iop_r != ((uint8_t)(a))) { ++ return 2; ++ } ++ iop_r++; ++ a >>= 8; + } ++ return 0; ++} + +- // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52). +- // Subnormal numbers have the same exp2 but a smaller mantissa. +- static const int32_t min_incl_normal_exp2 = -1022; +- static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul; ++static inline wuffs_base__io_buffer* // ++wuffs_private_impl__io_reader__set(wuffs_base__io_buffer* b, ++ const uint8_t** ptr_iop_r, ++ const uint8_t** ptr_io0_r, ++ const uint8_t** ptr_io1_r, ++ const uint8_t** ptr_io2_r, ++ wuffs_base__slice_u8 data, ++ uint64_t history_position) { ++ b->data = data; ++ b->meta.wi = data.len; ++ b->meta.ri = 0; ++ b->meta.pos = history_position; ++ b->meta.closed = false; + +- // Compute lower and upper bounds such that any number between them (possibly +- // inclusive) will round to f. First, the lower bound. Our number f is: +- // ((mantissa + 0) * (2 ** ( exp2 - 52))) +- // +- // The next lowest floating point number is: +- // ((mantissa - 1) * (2 ** ( exp2 - 52))) +- // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the +- // min_incl_normal_exp2. Either way, call it: +- // ((l_mantissa) * (2 ** (l_exp2 - 52))) +- // +- // The lower bound is halfway between them (noting that 52 became 53): +- // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53))) +- int32_t l_exp2 = exp2; +- uint64_t l_mantissa = mantissa - 1; +- if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) { +- l_exp2 = exp2 - 1; +- l_mantissa = (2 * mantissa) - 1; +- } +- wuffs_base__private_implementation__high_prec_dec lower; +- wuffs_base__private_implementation__high_prec_dec__assign( +- &lower, (2 * l_mantissa) + 1, false); +- wuffs_base__private_implementation__high_prec_dec__lshift(&lower, +- l_exp2 - 53); ++ *ptr_iop_r = data.ptr; ++ *ptr_io0_r = data.ptr; ++ *ptr_io1_r = data.ptr; ++ *ptr_io2_r = data.ptr + data.len; + +- // Next, the upper bound. Our number f is: +- // ((mantissa + 0) * (2 ** (exp2 - 52))) +- // +- // The next highest floating point number is: +- // ((mantissa + 1) * (2 ** (exp2 - 52))) +- // +- // The upper bound is halfway between them (noting that 52 became 53): +- // (((2 * mantissa) + 1) * (2 ** (exp2 - 53))) +- wuffs_base__private_implementation__high_prec_dec upper; +- wuffs_base__private_implementation__high_prec_dec__assign( +- &upper, (2 * mantissa) + 1, false); +- wuffs_base__private_implementation__high_prec_dec__lshift(&upper, exp2 - 53); ++ return b; ++} + +- // The lower and upper bounds are possible outputs only if the original +- // mantissa is even, so that IEEE round-to-even would round to the original +- // mantissa and not its neighbors. +- bool inclusive = (mantissa & 1) == 0; ++// -------- + +- // As we walk the digits, we want to know whether rounding up would fall +- // within the upper bound. This is tracked by upper_delta: +- // - When -1, the digits of h and upper are the same so far. +- // - When +0, we saw a difference of 1 between h and upper on a previous +- // digit and subsequently only 9s for h and 0s for upper. Thus, rounding +- // up may fall outside of the bound if !inclusive. +- // - When +1, the difference is greater than 1 and we know that rounding up +- // falls within the bound. +- // +- // This is a state machine with three states. The numerical value for each +- // state (-1, +0 or +1) isn't important, other than their order. +- int upper_delta = -1; ++static inline uint64_t // ++wuffs_private_impl__io_writer__copy_from_slice(uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ wuffs_base__slice_u8 src) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = src.len; ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ if (n > 0) { ++ memmove(iop_w, src.ptr, n); ++ *ptr_iop_w += n; ++ } ++ return (uint64_t)(n); ++} + +- // We can now figure out the shortest number of digits required. Walk the +- // digits until h has distinguished itself from lower or upper. +- // +- // The zi and zd variables are indexes and digits, for z in l (lower), h (the +- // number) and u (upper). ++static inline void // ++wuffs_private_impl__io_writer__limit(uint8_t** ptr_io2_w, ++ uint8_t* iop_w, ++ uint64_t limit) { ++ if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) { ++ *ptr_io2_w = iop_w + limit; ++ } ++} ++ ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ if (!distance) { ++ return 0; ++ } ++ uint8_t* p = *ptr_iop_w; ++ if ((size_t)(p - io0_w) < (size_t)(distance)) { ++ return 0; ++ } ++ uint8_t* q = p - distance; ++ size_t n = (size_t)(io2_w - p); ++ if ((size_t)(length) > n) { ++ length = (uint32_t)(n); ++ } else { ++ n = (size_t)(length); ++ } ++ // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that ++ // is mostly because 3 is the minimum length for the deflate format. This ++ // function implementation shouldn't overfit to that one format. Perhaps the ++ // limited_copy_u32_from_history Wuffs method should also take an unroll hint ++ // argument, and the cgen can look if that argument is the constant ++ // expression '3'. + // +- // The lower, h and upper numbers may have their decimal points at different +- // places. In this case, upper is the longest, so we iterate ui starting from +- // 0 and iterate li and hi starting from either 0 or -1. +- int32_t ui = 0; +- for (;; ui++) { +- // Calculate hd, the middle number's digit. +- int32_t hi = ui - upper.decimal_point + h->decimal_point; +- if (hi >= ((int32_t)(h->num_digits))) { +- break; +- } +- uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0; ++ // See also wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast ++ // below. ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // Calculate ld, the lower bound's digit. +- int32_t li = ui - upper.decimal_point + lower.decimal_point; +- uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0; ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast is like ++// the wuffs_private_impl__io_writer__limited_copy_u32_from_history function ++// above, but has stronger pre-conditions. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - length <= (io2_w - *ptr_iop_w) ++// - distance >= 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // We can round down (truncate) if lower has a different digit than h or if +- // lower is inclusive and is exactly the result of rounding down (i.e. we +- // have reached the final digit of lower). +- bool can_round_down = +- (ld != hd) || // +- (inclusive && ((li + 1) == ((int32_t)(lower.num_digits)))); ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function, ++// but also returns the cusp: a byte pair (as a u16le) being the last byte of ++// and next byte after the copied history. ++// ++// For example, if history was [10, 11, 12, 13, 14, 15, 16, 17, 18] then: ++// - copying l=3, d=8 produces [11, 12, 13] and the cusp is (13, 14). ++// - copying l=3, d=2 produces [17, 18, 17] and the cusp is (17, 18). ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - length <= (io2_w - *ptr_iop_w) ++// - distance >= 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); ++} + +- // Calculate ud, the upper bound's digit, and update upper_delta. +- uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0; +- if (upper_delta < 0) { +- if ((hd + 1) < ud) { +- // For example: +- // h = 12345??? +- // upper = 12347??? +- upper_delta = +1; +- } else if (hd != ud) { +- // For example: +- // h = 12345??? +- // upper = 12346??? +- upper_delta = +0; +- } +- } else if (upper_delta == 0) { +- if ((hd != 9) || (ud != 0)) { +- // For example: +- // h = 1234598? +- // upper = 1234600? +- upper_delta = +1; +- } ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast ++// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 ++// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. ++// ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. ++// ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance == 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint64_t x = p[-1]; ++ x |= x << 8; ++ x |= x << 16; ++ x |= x << 32; ++ uint32_t n = length; ++ while (1) { ++ wuffs_base__poke_u64le__no_bounds_check(p, x); ++ if (n <= 8) { ++ p += n; ++ break; + } ++ p += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // We can round up if upper has a different digit than h and either upper +- // is inclusive or upper is bigger than the result of rounding up. +- bool can_round_up = +- (upper_delta > 0) || // +- ((upper_delta == 0) && // +- (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits))))); +- +- // If we can round either way, round to nearest. If we can round only one +- // way, do it. If we can't round, continue the loop. +- if (can_round_down) { +- if (can_round_up) { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- h, hi + 1); +- return; +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_down(h, +- hi + 1); +- return; +- } +- } else { +- if (can_round_up) { +- wuffs_base__private_implementation__high_prec_dec__round_up(h, hi + 1); +- return; +- } ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp ++// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 ++// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. ++// It also returns the cusp: a byte pair (as a u16le) being the last byte of ++// and next byte after the copied history. ++// ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. ++// ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance == 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint64_t x = p[-1]; ++ x |= x << 8; ++ x |= x << 16; ++ x |= x << 32; ++ uint32_t n = length; ++ while (1) { ++ wuffs_base__poke_u64le__no_bounds_check(p, x); ++ if (n <= 8) { ++ p += n; ++ q += n; ++ break; + } ++ p += 8; ++ q += 8; ++ n -= 8; + } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); + } + +-// -------- +- +-// wuffs_base__private_implementation__parse_number_f64_eisel_lemire produces +-// the IEEE 754 double-precision value for an exact mantissa and base-10 +-// exponent. For example: +-// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1. +-// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading +-// minus sign is the responsibility of the caller, not this function. ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function ++// above, but copies 8 byte chunks at a time. + // +-// On success, it returns a non-negative int64_t such that the low 63 bits hold +-// the 11-bit exponent and 52-bit mantissa. ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. + // +-// On failure, it returns a negative value. ++// In terms of advancing *ptr_iop_w, length is not rounded up. + // +-// The algorithm is based on an original idea by Michael Eisel that was refined +-// by Daniel Lemire. See +-// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/ +-// and +-// https://nigeltao.github.io/blog/2020/eisel-lemire.html ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance >= 8 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ while (1) { ++ memcpy(p, q, 8); ++ if (n <= 8) { ++ p += n; ++ break; ++ } ++ p += 8; ++ q += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return length; ++} ++ ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function ++// above, but copies 8 byte chunks at a time. It also returns the cusp: a byte ++// pair (as a u16le) being the last byte of and next byte after the copied ++// history. + // +-// Preconditions: +-// - man is non-zero. +-// - exp10 is in the range [-307 ..= 288], the same range of the +-// wuffs_base__private_implementation__powers_of_10 array. ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. + // +-// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX], +-// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the +-// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal +-// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are +-// approximately 2.23e–308 and 1.80e+308. +-static int64_t // +-wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- uint64_t man, +- int32_t exp10) { +- // Look up the (possibly truncated) base-2 representation of (10 ** exp10). +- // The look-up table was constructed so that it is already normalized: the +- // table entry's mantissa's MSB (most significant bit) is on. +- const uint64_t* po10 = +- &wuffs_base__private_implementation__powers_of_10[exp10 + 307][0]; ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance >= 8 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ while (1) { ++ memcpy(p, q, 8); ++ if (n <= 8) { ++ p += n; ++ q += n; ++ break; ++ } ++ p += 8; ++ q += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); ++} + +- // Normalize the man argument. The (man != 0) precondition means that a +- // non-zero bit exists. +- uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); +- man <<= clz; ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = length; ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ const uint8_t* iop_r = *ptr_iop_r; ++ if (n > ((size_t)(io2_r - iop_r))) { ++ n = (size_t)(io2_r - iop_r); ++ } ++ if (n > 0) { ++ memmove(iop_w, iop_r, n); ++ *ptr_iop_w += n; ++ *ptr_iop_r += n; ++ } ++ return (uint32_t)(n); ++} + +- // Calculate the return value's base-2 exponent. We might tweak it by ±1 +- // later, but its initial value comes from a linear scaling of exp10, +- // converting from power-of-10 to power-of-2, and adjusting by clz. +- // +- // The magic constants are: +- // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because +- // the look-up table uses 64-bit mantissas. +- // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough +- // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928. +- // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift. +- // +- // Equality of the linearly-scaled value and the actual power-of-2, over the +- // range of exp10 arguments that this function accepts, is confirmed by +- // script/print-mpb-powers-of-10.go +- uint64_t ret_exp2 = +- ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz); ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ wuffs_base__slice_u8 src) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = src.len; ++ if (n > length) { ++ n = length; ++ } ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ if (n > 0) { ++ memmove(iop_w, src.ptr, n); ++ *ptr_iop_w += n; ++ } ++ return (uint32_t)(n); ++} + +- // Multiply the two mantissas. Normalization means that both mantissas are at +- // least (1<<63), so the 128-bit product must be at least (1<<126). The high +- // 64 bits of the product, x_hi, must therefore be at least (1<<62). +- // +- // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi +- // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore +- // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. +- wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]); +- uint64_t x_hi = x.hi; +- uint64_t x_lo = x.lo; ++static inline wuffs_base__io_buffer* // ++wuffs_private_impl__io_writer__set(wuffs_base__io_buffer* b, ++ uint8_t** ptr_iop_w, ++ uint8_t** ptr_io0_w, ++ uint8_t** ptr_io1_w, ++ uint8_t** ptr_io2_w, ++ wuffs_base__slice_u8 data, ++ uint64_t history_position) { ++ b->data = data; ++ b->meta.wi = 0; ++ b->meta.ri = 0; ++ b->meta.pos = history_position; ++ b->meta.closed = false; + +- // Before we shift right by at least 9 bits, recall that the look-up table +- // entry was possibly truncated. We have so far only calculated a lower bound +- // for the product (man * e), where e is (10 ** exp10). The upper bound would +- // add a further (man * 1) to the 128-bit product, which overflows the lower +- // 64-bit limb if ((x_lo + man) < man). +- // +- // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right +- // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit +- // limb's low 9 bits are all on. +- // +- // For example, parsing "9999999999999999999" will take the if-true branch +- // here, since: +- // - x_hi = 0x4563918244F3FFFF +- // - x_lo = 0x8000000000000000 +- // - man = 0x8AC7230489E7FFFF +- if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) { +- // Refine our calculation of (man * e). Before, our approximation of e used +- // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit +- // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e). +- // Now calculate y = (man * bits_64_to_127_incl_of_e). +- wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]); +- uint64_t y_hi = y.hi; +- uint64_t y_lo = y.lo; ++ *ptr_iop_w = data.ptr; ++ *ptr_io0_w = data.ptr; ++ *ptr_io1_w = data.ptr; ++ *ptr_io2_w = data.ptr + data.len; + +- // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to +- // calculate the 192-bit product of the 64-bit man by the 128-bit e. +- // As we exit this if-block, we only care about the high 128 bits +- // (merged_hi and merged_lo) of that 192-bit product. +- // +- // For example, parsing "1.234e-45" will take the if-true branch here, +- // since: +- // - x_hi = 0x70B7E3696DB29FFF +- // - x_lo = 0xE040000000000000 +- // - y_hi = 0x33718BBEAB0E0D7A +- // - y_lo = 0xA880000000000000 +- uint64_t merged_hi = x_hi; +- uint64_t merged_lo = x_lo + y_hi; +- if (merged_lo < x_lo) { +- merged_hi++; // Carry the overflow bit. +- } ++ return b; ++} + +- // The "high resolution" approximation of e is still a lower bound. Once +- // again, see if the upper bound is large enough to produce a different +- // result. This time, if it does, give up instead of reaching for an even +- // more precise approximation to e. +- // +- // This three-part check is similar to the two-part check that guarded the +- // if block that we're now in, but it has an extra term for the middle 64 +- // bits (checking that adding 1 to merged_lo would overflow). +- // +- // For example, parsing "5.9604644775390625e-8" will take the if-true +- // branch here, since: +- // - merged_hi = 0x7FFFFFFFFFFFFFFF +- // - merged_lo = 0xFFFFFFFFFFFFFFFF +- // - y_lo = 0x4DB3FFC120988200 +- // - man = 0xD3C21BCECCEDA100 +- if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) && +- (y_lo + man < man)) { +- return -1; +- } ++// ---------------- I/O (Utility) + +- // Replace the 128-bit x with merged. +- x_hi = merged_hi; +- x_lo = merged_lo; +- } ++#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader ++#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer + +- // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave +- // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the +- // MSB (before shifting) was on, adjust ret_exp2 for the larger shift. +- // +- // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit +- // number. +- uint64_t msb = x_hi >> 63; +- uint64_t ret_mantissa = x_hi >> (msb + 9); +- ret_exp2 -= 1 ^ msb; ++// ---------------- Tokens + +- // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can +- // be tricky. If we're half-way between two exactly representable numbers +- // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give +- // up instead of trying to pick the winner. +- // +- // Technically, we could tighten the condition by changing "73" to "73 or 74, +- // depending on msb", but a flat "73" is simpler. +- // +- // For example, parsing "1e+23" will take the if-true branch here, since: +- // - x_hi = 0x54B40B1F852BDA00 +- // - ret_mantissa = 0x002A5A058FC295ED +- if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) { +- return -1; +- } ++// ---------------- Tokens (Utility) + +- // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit +- // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether +- // it was on or off, shifting right by one then produces a 53-bit number. If +- // carrying up overflowed, shift again. +- ret_mantissa += ret_mantissa & 1; +- ret_mantissa >>= 1; +- // This if block is equivalent to (but benchmarks slightly faster than) the +- // following branchless form: +- // uint64_t overflow_adjustment = ret_mantissa >> 53; +- // ret_mantissa >>= overflow_adjustment; +- // ret_exp2 += overflow_adjustment; +- // +- // For example, parsing "7.2057594037927933e+16" will take the if-true +- // branch here, since: +- // - x_hi = 0x7FFFFFFFFFFFFE80 +- // - ret_mantissa = 0x0020000000000000 +- if ((ret_mantissa >> 53) > 0) { +- ret_mantissa >>= 1; +- ret_exp2++; +- } ++// ---------------- Memory Allocation + +- // Starting with a 53-bit number, IEEE 754 double-precision normal numbers +- // have an implicit mantissa bit. Mask that away and keep the low 52 bits. +- ret_mantissa &= 0x000FFFFFFFFFFFFF; ++// ---------------- Images + +- // Pack the bits and return. +- return ((int64_t)(ret_mantissa | (ret_exp2 << 52))); +-} ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ uint32_t up_to_num_pixels, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r); + +-// -------- ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r); + +-static wuffs_base__result_f64 // +-wuffs_base__private_implementation__parse_number_f64_special( +- wuffs_base__slice_u8 s, +- uint32_t options) { +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { +- goto fail; +- } ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint64_t num_pixels); + +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__swizzle_ycck( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_buffer* dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ wuffs_base__slice_u8 src0, ++ wuffs_base__slice_u8 src1, ++ wuffs_base__slice_u8 src2, ++ wuffs_base__slice_u8 src3, ++ uint32_t width0, ++ uint32_t width1, ++ uint32_t width2, ++ uint32_t width3, ++ uint32_t height0, ++ uint32_t height1, ++ uint32_t height2, ++ uint32_t height3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint8_t h0, ++ uint8_t h1, ++ uint8_t h2, ++ uint8_t h3, ++ uint8_t v0, ++ uint8_t v1, ++ uint8_t v2, ++ uint8_t v3, ++ bool is_rgb_or_cmyk, ++ bool triangle_filter_for_2to1, ++ wuffs_base__slice_u8 scratch_buffer_2k); + +- for (; (p < q) && (*p == '_'); p++) { +- } +- if (p >= q) { +- goto fail; +- } ++// ---------------- Images (Utility) + +- // Parse sign. +- bool negative = false; +- do { +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- negative = true; +- p++; +- } else { +- break; +- } +- for (; (p < q) && (*p == '_'); p++) { +- } +- } while (0); +- if (p >= q) { +- goto fail; +- } ++#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format + +- bool nan = false; +- switch (p[0]) { +- case 'I': +- case 'i': +- if (((q - p) < 3) || // +- ((p[1] != 'N') && (p[1] != 'n')) || // +- ((p[2] != 'F') && (p[2] != 'f'))) { +- goto fail; +- } +- p += 3; ++// ---------------- String Conversions + +- if ((p >= q) || (*p == '_')) { +- break; +- } else if (((q - p) < 5) || // +- ((p[0] != 'I') && (p[0] != 'i')) || // +- ((p[1] != 'N') && (p[1] != 'n')) || // +- ((p[2] != 'I') && (p[2] != 'i')) || // +- ((p[3] != 'T') && (p[3] != 't')) || // +- ((p[4] != 'Y') && (p[4] != 'y'))) { +- goto fail; +- } +- p += 5; ++// ---------------- Unicode and UTF-8 + +- if ((p >= q) || (*p == '_')) { +- break; +- } +- goto fail; ++// ---------------- + +- case 'N': +- case 'n': +- if (((q - p) < 3) || // +- ((p[1] != 'A') && (p[1] != 'a')) || // +- ((p[2] != 'N') && (p[2] != 'n'))) { +- goto fail; +- } +- p += 3; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +- if ((p >= q) || (*p == '_')) { +- nan = true; +- break; +- } +- goto fail; ++const uint8_t wuffs_private_impl__low_bits_mask__u8[8] = { ++ 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, ++}; + +- default: +- goto fail; +- } ++const uint16_t wuffs_private_impl__low_bits_mask__u16[16] = { ++ 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, ++ 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, ++}; + +- // Finish. +- for (; (p < q) && (*p == '_'); p++) { +- } +- if (p != q) { +- goto fail; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) | +- (negative ? 0x8000000000000000 : 0)); +- return ret; +- } while (0); ++const uint32_t wuffs_private_impl__low_bits_mask__u32[32] = { ++ 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, ++ 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, ++ 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, ++ 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, ++ 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, ++ 0x3FFFFFFF, 0x7FFFFFFF, ++}; + +-fail: +- do { +- wuffs_base__result_f64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); +-} ++const uint64_t wuffs_private_impl__low_bits_mask__u64[64] = { ++ 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, ++ 0x0000000000000007, 0x000000000000000F, 0x000000000000001F, ++ 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF, ++ 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, ++ 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF, ++ 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF, ++ 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF, ++ 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, ++ 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF, ++ 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF, ++ 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF, ++ 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, ++ 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, ++ 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF, ++ 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF, ++ 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, ++ 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, ++ 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF, ++ 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF, ++ 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, ++ 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, ++ 0x7FFFFFFFFFFFFFFF, ++}; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +-wuffs_base__private_implementation__high_prec_dec__to_f64( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t options) { +- do { +- // powers converts decimal powers of 10 to binary powers of 2. For example, +- // (10000 >> 13) is 1. It stops before the elements exceed 60, also known +- // as WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +- // +- // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array +- // element value rounds up (1<<14 is an upper bound for 1e4) while staying +- // at or below WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +- // +- // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2), +- // powers[2] == 6 and so: +- // - Right shifting by 6+0 produces the range [10/64 .. 100/64] = +- // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1. +- // - Right shifting by 6+1 produces the range [10/128 .. 100/128] = +- // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0. +- // +- // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2), +- // powers[2] == 6 and so: +- // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] = +- // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0. +- // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] = +- // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1. +- // +- // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0) +- // when right shifting but (powers[n]+1) when left shifting. +- static const uint32_t num_powers = 19; +- static const uint8_t powers[19] = { +- 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, // +- 33, 36, 39, 43, 46, 49, 53, 56, 59, // +- }; ++const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16] = { ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, ++}; + +- // Handle zero and obvious extremes. The largest and smallest positive +- // finite f64 values are approximately 1.8e+308 and 4.9e-324. +- if ((h->num_digits == 0) || (h->decimal_point < -326)) { +- goto zero; +- } else if (h->decimal_point > 310) { +- goto infinity; +- } ++const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect"; ++const char wuffs_base__note__end_of_data[] = "@base: end of data"; ++const char wuffs_base__note__metadata_reported[] = "@base: metadata reported"; ++const char wuffs_base__suspension__even_more_information[] = "$base: even more information"; ++const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read"; ++const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write"; ++const char wuffs_base__suspension__short_read[] = "$base: short read"; ++const char wuffs_base__suspension__short_workbuf[] = "$base: short workbuf"; ++const char wuffs_base__suspension__short_write[] = "$base: short write"; ++const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position"; ++const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)"; ++const char wuffs_base__error__bad_argument[] = "#base: bad argument"; ++const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence"; ++const char wuffs_base__error__bad_data[] = "#base: bad data"; ++const char wuffs_base__error__bad_receiver[] = "#base: bad receiver"; ++const char wuffs_base__error__bad_restart[] = "#base: bad restart"; ++const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver"; ++const char wuffs_base__error__bad_vtable[] = "#base: bad vtable"; ++const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length"; ++const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version"; ++const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension"; ++const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[] = "#base: disabled by WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST"; ++const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error"; ++const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed"; ++const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called"; ++const char wuffs_base__error__insufficient_history[] = "#base: insufficient history"; ++const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls"; ++const char wuffs_base__error__no_more_information[] = "#base: no more information"; ++const char wuffs_base__error__not_enough_data[] = "#base: not enough data"; ++const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds"; ++const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension"; ++const char wuffs_base__error__unsupported_method[] = "#base: unsupported method"; ++const char wuffs_base__error__unsupported_option[] = "#base: unsupported option"; ++const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option"; ++const char wuffs_base__error__too_much_data[] = "#base: too much data"; + +- // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10) +- // pair from the high_prec_dec h is more correct but slower than the +- // approach taken in wuffs_base__parse_number_f64. The latter is optimized +- // for the common cases (e.g. assuming no underscores or a leading '+' +- // sign) rather than the full set of cases allowed by the Wuffs API. +- // +- // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying +- // for an exact result). When we have more than 19 mantissa digits, run it +- // twice to get a lower and upper bound. We still have an exact result +- // (within f64's rounding margin) if both bounds are equal (and valid). +- uint32_t i_max = h->num_digits; +- if (i_max > 19) { +- i_max = 19; +- } +- int32_t exp10 = h->decimal_point - ((int32_t)i_max); +- if ((-307 <= exp10) && (exp10 <= 288)) { +- uint64_t man = 0; +- uint32_t i; +- for (i = 0; i < i_max; i++) { +- man = (10 * man) + h->digits[i]; +- } +- while (man != 0) { // The 'while' is just an 'if' that we can 'break'. +- int64_t r0 = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man + 0, exp10); +- if (r0 < 0) { +- break; +- } else if (h->num_digits > 19) { +- int64_t r1 = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man + 1, exp10); +- if (r1 != r0) { +- break; +- } +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63)); +- return ret; +- } +- } ++const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32"; ++const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64"; ++const char wuffs_base__hasher_bitvec256__vtable_name[] = "{vtable}wuffs_base__hasher_bitvec256"; ++const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder"; ++const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer"; ++const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder"; + +- // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See +- // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html +- // +- // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently, +- // that h->decimal_point is +0 or +1. +- // +- // First we shift right while at or above 10... +- const int32_t f64_bias = -1023; +- int32_t exp2 = 0; +- while (h->decimal_point > 1) { +- uint32_t n = (uint32_t)(+h->decimal_point); +- uint32_t shift = +- (n < num_powers) +- ? powers[n] +- : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- +- wuffs_base__private_implementation__high_prec_dec__small_rshift(h, shift); +- if (h->decimal_point < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- goto zero; +- } +- exp2 += (int32_t)shift; +- } +- // ...then we shift left while below 0.1. +- while (h->decimal_point < 0) { +- uint32_t shift; +- uint32_t n = (uint32_t)(-h->decimal_point); +- shift = (n < num_powers) +- // The +1 is per "when targeting h->decimal_point being +0 or +- // +1... when left shifting" in the powers comment above. +- ? (powers[n] + 1) +- : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +- wuffs_base__private_implementation__high_prec_dec__small_lshift(h, shift); +- if (h->decimal_point > +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- goto infinity; +- } +- exp2 -= (int32_t)shift; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +- // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which +- // will give us our exponent in base-2), the mantissa's first 3 digits will +- // determine the final left shift, equal to 52 (the number of explicit f64 +- // bits) plus an additional adjustment. +- int man3 = (100 * h->digits[0]) + +- ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) + +- ((h->num_digits > 2) ? h->digits[2] : 0); +- int32_t additional_lshift = 0; +- if (h->decimal_point == 0) { // The value is in [0.1 .. 1]. +- if (man3 < 125) { +- additional_lshift = +4; +- } else if (man3 < 250) { +- additional_lshift = +3; +- } else if (man3 < 500) { +- additional_lshift = +2; +- } else { +- additional_lshift = +1; +- } +- } else { // The value is in [1 .. 10]. +- if (man3 < 200) { +- additional_lshift = -0; +- } else if (man3 < 400) { +- additional_lshift = -1; +- } else if (man3 < 800) { +- additional_lshift = -2; +- } else { +- additional_lshift = -3; +- } +- } +- exp2 -= additional_lshift; +- uint32_t final_lshift = (uint32_t)(52 + additional_lshift); ++// ---------------- Interface Definitions. + +- // The minimum normal exponent is (f64_bias + 1). +- while ((f64_bias + 1) > exp2) { +- uint32_t n = (uint32_t)((f64_bias + 1) - exp2); +- if (n > WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- n = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_rshift(h, n); +- exp2 += (int32_t)n; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__hasher_u32__checksum_u32( ++ const wuffs_base__hasher_u32* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // Check for overflow. +- if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. +- goto infinity; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_u32)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Extract 53 bits for the mantissa (in base-2). +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, final_lshift); +- uint64_t man2 = +- wuffs_base__private_implementation__high_prec_dec__rounded_integer(h); ++ return 0; ++} + +- // Rounding might have added one bit. If so, shift and re-check overflow. +- if ((man2 >> 53) != 0) { +- man2 >>= 1; +- exp2++; +- if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. +- goto infinity; +- } +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u32__get_quirk( ++ const wuffs_base__hasher_u32* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // Handle subnormal numbers. +- if ((man2 >> 52) == 0) { +- exp2 = f64_bias; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Pack the bits and return. +- uint64_t exp2_bits = +- (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1. +- uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1. +- (exp2_bits << 52) | // +- (h->negative ? 0x8000000000000000 : 0); // (1 << 63). +- +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); +- +-zero: +- do { +- uint64_t bits = h->negative ? 0x8000000000000000 : 0; ++ return 0; ++} + +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_u32__set_quirk( ++ wuffs_base__hasher_u32* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-infinity: +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { +- wuffs_base__result_f64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000; +- +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-static inline bool // +-wuffs_base__private_implementation__is_decimal_digit(uint8_t c) { +- return ('0' <= c) && (c <= '9'); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_u32__update( ++ wuffs_base__hasher_u32* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +-wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) { +- // In practice, almost all "dd.ddddE±xxx" numbers can be represented +- // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10 +- // exponent, adjusting "xxx" for the position (if present) of the decimal +- // separator '.' or ','. +- // +- // This (u64 man, i32 exp10) data structure is superficially similar to the +- // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent +- // here is base-10, not base-2. +- // +- // If s's number fits in a (man, exp10), parse that pair with the +- // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with +- // the fallback algorithm is slower but comprehensive. +- // +- // † "Printing Floating-Point Numbers Quickly and Accurately with Integers" +- // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf). +- // Florian Loitsch is also the primary contributor to +- // https://github.com/google/double-conversion +- do { +- // Calculating that (man, exp10) pair needs to stay within s's bounds. +- // Provided that s isn't extremely long, work on a NUL-terminated copy of +- // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx". +- // +- // As the pointer p walks the contents, it's faster to repeatedly check "is +- // *p a valid digit" than "is p within bounds and *p a valid digit". +- if (s.len >= 256) { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- uint8_t z[256]; +- memcpy(&z[0], s.ptr, s.len); +- z[s.len] = 0; +- const uint8_t* p = &z[0]; ++ v++; ++ } + +- // Look for a leading minus sign. Technically, we could also look for an +- // optional plus sign, but the "script/process-json-numbers.c with -p" +- // benchmark is noticably slower if we do. It's optional and, in practice, +- // usually absent. Let the fallback catch it. +- bool negative = (*p == '-'); +- if (negative) { +- p++; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- // After walking "dd.dddd", comparing p later with p now will produce the +- // number of "d"s and "."s. +- const uint8_t* const start_of_digits_ptr = p; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__hasher_u32__update_u32( ++ wuffs_base__hasher_u32* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return 0; ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; ++ } + +- // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0', +- // it must be a single '0'. If it starts with a non-zero decimal digit, it +- // can be a sequence of decimal digits. +- // +- // Update the man variable during the walk. It's OK if man overflows now. +- // We'll detect that later. +- uint64_t man; +- if (*p == '0') { +- man = 0; +- p++; +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- } else if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- man = ((uint8_t)(*p - '0')); +- p++; +- for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { +- man = (10 * man) + ((uint8_t)(*p - '0')); +- } +- } else { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_u32)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Walk the "d"s after the optional decimal separator ('.' or ','), +- // updating the man and exp10 variables. +- int32_t exp10 = 0; +- if (*p == +- ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- const uint8_t* first_after_separator_ptr = p; +- if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- man = (10 * man) + ((uint8_t)(*p - '0')); +- p++; +- for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { +- man = (10 * man) + ((uint8_t)(*p - '0')); +- } +- exp10 = ((int32_t)(first_after_separator_ptr - p)); +- } ++ return 0; ++} + +- // Count the number of digits: +- // - for an input of "314159", digit_count is 6. +- // - for an input of "3.14159", digit_count is 7. +- // +- // This is off-by-one if there is a decimal separator. That's OK for now. +- // We'll correct for that later. The "script/process-json-numbers.c with +- // -p" benchmark is noticably slower if we try to correct for that now. +- uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr); ++// -------- + +- // Update exp10 for the optional exponent, starting with 'E' or 'e'. +- if ((*p | 0x20) == 'e') { +- p++; +- int32_t exp_sign = +1; +- if (*p == '-') { +- p++; +- exp_sign = -1; +- } else if (*p == '+') { +- p++; +- } +- if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- int32_t exp_num = ((uint8_t)(*p - '0')); +- p++; +- // The rest of the exp_num walking has a peculiar control flow but, once +- // again, the "script/process-json-numbers.c with -p" benchmark is +- // sensitive to alternative formulations. +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- while (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- if (exp_num > 0x1000000) { +- goto fallback; +- } +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- exp10 += exp_sign * exp_num; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__checksum_u64( ++ const wuffs_base__hasher_u64* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // The Wuffs API is that the original slice has no trailing data. It also +- // allows underscores, which we don't catch here but the fallback should. +- if (p != &z[s.len]) { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_u64)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Check that the uint64_t typed man variable has not overflowed, based on +- // digit_count. +- // +- // For reference: +- // - (1 << 63) is 9223372036854775808, which has 19 decimal digits. +- // - (1 << 64) is 18446744073709551616, which has 20 decimal digits. +- // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64 +- // bits and 16 hexadecimal digits. +- // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67 +- // bits and 17 hexadecimal digits. +- if (digit_count > 19) { +- // Even if we have more than 19 pseudo-digits, it's not yet definitely an +- // overflow. Recall that digit_count might be off-by-one (too large) if +- // there's a decimal separator. It will also over-report the number of +- // meaningful digits if the input looks something like "0.000dddExxx". +- // +- // We adjust by the number of leading '0's and '.'s and re-compare to 19. +- // Once again, technically, we could skip ','s too, but that perturbs the +- // "script/process-json-numbers.c with -p" benchmark. +- const uint8_t* q = start_of_digits_ptr; +- for (; (*q == '0') || (*q == '.'); q++) { +- } +- digit_count -= (uint32_t)(q - start_of_digits_ptr); +- if (digit_count > 19) { +- goto fallback; +- } +- } ++ return 0; ++} + +- // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire +- // preconditions include that exp10 is in the range [-307 ..= 288]. +- if ((exp10 < -307) || (288 < exp10)) { +- goto fallback; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__get_quirk( ++ const wuffs_base__hasher_u64* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // If both man and (10 ** exp10) are exactly representable by a double, we +- // don't need to run the Eisel-Lemire algorithm. +- if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) { +- double d = (double)man; +- if (exp10 >= 0) { +- d *= wuffs_base__private_implementation__f64_powers_of_10[+exp10]; +- } else { +- d /= wuffs_base__private_implementation__f64_powers_of_10[-exp10]; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = negative ? -d : +d; +- return ret; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire +- // preconditions include that man is non-zero. Parsing "0" should be caught +- // by the "If both man and (10 ** exp10)" above, but "0e99" might not. +- if (man == 0) { +- goto fallback; +- } ++ return 0; ++} + +- // Our man and exp10 are in range. Run the Eisel-Lemire algorithm. +- int64_t r = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man, exp10); +- if (r < 0) { +- goto fallback; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- ((uint64_t)r) | (((uint64_t)negative) << 63)); +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_u64__set_quirk( ++ wuffs_base__hasher_u64* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-fallback: +- do { +- wuffs_base__private_implementation__high_prec_dec h; +- wuffs_base__status status = +- wuffs_base__private_implementation__high_prec_dec__parse(&h, s, +- options); +- if (status.repr) { +- return wuffs_base__private_implementation__parse_number_f64_special( +- s, options); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- return wuffs_base__private_implementation__high_prec_dec__to_f64(&h, +- options); +- } while (0); +-} ++ v++; ++ } + +-// -------- ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-static inline size_t // +-wuffs_base__private_implementation__render_inf(wuffs_base__slice_u8 dst, +- bool neg, +- uint32_t options) { +- if (neg) { +- if (dst.len < 4) { +- return 0; +- } +- wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le. +- return 4; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_u64__update( ++ wuffs_base__hasher_u64* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- if (dst.len < 4) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le. +- return 4; ++ v++; + } + +- if (dst.len < 3) { +- return 0; +- } +- wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le. +- return 3; ++ return wuffs_base__make_empty_struct(); + } + +-static inline size_t // +-wuffs_base__private_implementation__render_nan(wuffs_base__slice_u8 dst) { +- if (dst.len < 3) { ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__update_u64( ++ wuffs_base__hasher_u64* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { + return 0; + } +- wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le. +- return 3; +-} +- +-static size_t // +-wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- wuffs_base__slice_u8 dst, +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t precision, +- uint32_t options) { +- size_t n = (h->negative || +- (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) +- ? 1 +- : 0; +- if (h->decimal_point <= 0) { +- n += 1; +- } else { +- n += (size_t)(h->decimal_point); +- } +- if (precision > 0) { +- n += precision + 1; // +1 for the '.'. ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; + } + +- // Don't modify dst if the formatted number won't fit. +- if (n > dst.len) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_u64)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Align-left or align-right. +- uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? &dst.ptr[dst.len - n] +- : &dst.ptr[0]; ++ return 0; ++} + +- // Leading "±". +- if (h->negative) { +- *ptr++ = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- *ptr++ = '+'; +- } ++// -------- + +- // Integral digits. +- if (h->decimal_point <= 0) { +- *ptr++ = '0'; +- } else { +- uint32_t m = +- wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point)); +- uint32_t i = 0; +- for (; i < m; i++) { +- *ptr++ = (uint8_t)('0' | h->digits[i]); +- } +- for (; i < (uint32_t)(h->decimal_point); i++) { +- *ptr++ = '0'; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__checksum_bitvec256( ++ const wuffs_base__hasher_bitvec256* self) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- // Separator and then fractional digits. +- if (precision > 0) { +- *ptr++ = +- (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.'; +- uint32_t i = 0; +- for (; i < precision; i++) { +- uint32_t j = ((uint32_t)(h->decimal_point)) + i; +- *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_bitvec256)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- return n; ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +-static size_t // +-wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- wuffs_base__slice_u8 dst, +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t precision, +- uint32_t options) { +- int32_t exp = 0; +- if (h->num_digits > 0) { +- exp = h->decimal_point - 1; +- } +- bool negative_exp = exp < 0; +- if (negative_exp) { +- exp = -exp; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_bitvec256__get_quirk( ++ const wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; + } +- +- size_t n = (h->negative || +- (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) +- ? 4 +- : 3; // Mininum 3 bytes: first digit and then "e±". +- if (precision > 0) { +- n += precision + 1; // +1 for the '.'. ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } +- n += (exp < 100) ? 2 : 3; + +- // Don't modify dst if the formatted number won't fit. +- if (n > dst.len) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Align-left or align-right. +- uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? &dst.ptr[dst.len - n] +- : &dst.ptr[0]; ++ return 0; ++} + +- // Leading "±". +- if (h->negative) { +- *ptr++ = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- *ptr++ = '+'; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_bitvec256__set_quirk( ++ wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- +- // Integral digit. +- if (h->num_digits > 0) { +- *ptr++ = (uint8_t)('0' | h->digits[0]); +- } else { +- *ptr++ = '0'; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // Separator and then fractional digits. +- if (precision > 0) { +- *ptr++ = +- (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.'; +- uint32_t i = 1; +- uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1); +- for (; i < j; i++) { +- *ptr++ = (uint8_t)('0' | h->digits[i]); +- } +- for (; i <= precision; i++) { +- *ptr++ = '0'; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- // Exponent: "e±" and then 2 or 3 digits. +- *ptr++ = 'e'; +- *ptr++ = negative_exp ? '-' : '+'; +- if (exp < 10) { +- *ptr++ = '0'; +- *ptr++ = (uint8_t)('0' | exp); +- } else if (exp < 100) { +- *ptr++ = (uint8_t)('0' | (exp / 10)); +- *ptr++ = (uint8_t)('0' | (exp % 10)); +- } else { +- int32_t e = exp / 100; +- exp -= e * 100; +- *ptr++ = (uint8_t)('0' | e); +- *ptr++ = (uint8_t)('0' | (exp / 10)); +- *ptr++ = (uint8_t)('0' | (exp % 10)); +- } +- +- return n; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, +- double x, +- uint32_t precision, +- uint32_t options) { +- // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits +- // with a -1023 bias) and mantissa (52 bits). +- uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x); +- bool neg = (bits >> 63) != 0; +- int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF; +- uint64_t man = bits & 0x000FFFFFFFFFFFFFul; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_bitvec256__update( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +- // Apply the exponent bias and set the implicit top bit of the mantissa, +- // unless x is subnormal. Also take care of Inf and NaN. +- if (exp2 == 0x7FF) { +- if (man != 0) { +- return wuffs_base__private_implementation__render_nan(dst); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- return wuffs_base__private_implementation__render_inf(dst, neg, options); +- } else if (exp2 == 0) { +- exp2 = -1022; +- } else { +- exp2 -= 1023; +- man |= 0x0010000000000000ul; ++ v++; + } + +- // Ensure that precision isn't too large. +- if (precision > 4095) { +- precision = 4095; ++ return wuffs_base__make_empty_struct(); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__update_bitvec256( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- // Convert from the (neg, exp2, man) tuple to an HPD. +- wuffs_base__private_implementation__high_prec_dec h; +- wuffs_base__private_implementation__high_prec_dec__assign(&h, man, neg); +- if (h.num_digits > 0) { +- wuffs_base__private_implementation__high_prec_dec__lshift( +- &h, exp2 - 52); // 52 mantissa bits. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_bitvec256)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Handle the "%e" and "%f" formats. +- switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT | +- WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) { +- case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format. +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point; +- precision = ((uint32_t)(wuffs_base__i32__max(0, p))); +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision) + h.decimal_point); +- } +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- dst, &h, precision, options); ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++} + +- case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format. +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0; +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision) + 1); +- } +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- dst, &h, precision, options); ++// -------- ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_frame( ++ wuffs_base__image_decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // We have the "%g" format and so precision means the number of significant +- // digits, not the number of digits after the decimal separator. Perform +- // rounding and determine whether to use "%e" or "%f". +- int32_t e_threshold = 0; +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- precision = h.num_digits; +- e_threshold = 6; +- } else { +- if (precision == 0) { +- precision = 1; +- } +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision)); +- e_threshold = ((int32_t)precision); +- int32_t nd = ((int32_t)(h.num_digits)); +- if ((e_threshold > nd) && (nd >= h.decimal_point)) { +- e_threshold = nd; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- // Use the "%e" format if the exponent is large. +- int32_t e = h.decimal_point - 1; +- if ((e < -4) || (e_threshold <= e)) { +- uint32_t p = wuffs_base__u32__min(precision, h.num_digits); +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- dst, &h, (p > 0) ? (p - 1) : 0, options); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_frame_config( ++ wuffs_base__image_decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // Use the "%f" format otherwise. +- int32_t p = ((int32_t)precision); +- if (p > h.decimal_point) { +- p = ((int32_t)(h.num_digits)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_frame_config)(self, a_dst, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } +- precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point))); +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- dst, &h, precision, options); ++ ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_image_config( ++ wuffs_base__image_decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_image_config)(self, a_dst, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-// ---------------- Integer ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits, +-// and (0x80 | v) for valid digits, where v is the 4 bit value. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_base__image_decoder__frame_dirty_rect( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-static const uint8_t wuffs_base__parse_number__decimal_digits[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. +- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->frame_dirty_rect)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. ++ return wuffs_base__utility__empty_rect_ie_u32(); ++} + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__get_quirk( ++ const wuffs_base__image_decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. +- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. ++ return 0; ++} + +- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__image_decoder__num_animation_loops( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_animation_loops)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ return 0; ++} + +-static const uint8_t wuffs_base__private_implementation__encode_base16[16] = { +- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07. +- 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F. +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__num_decoded_frame_configs( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-// -------- ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_decoded_frame_configs)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // +-wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) { +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++ return 0; ++} + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__num_decoded_frames( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- bool negative = false; +- if (p >= q) { +- goto fail_bad_argument; +- } else if (*p == '-') { +- p++; +- negative = true; +- } else if (*p == '+') { +- p++; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_decoded_frames)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- do { +- wuffs_base__result_u64 r = wuffs_base__parse_number_u64( +- wuffs_base__make_slice_u8(p, (size_t)(q - p)), options); +- if (r.status.repr != NULL) { +- wuffs_base__result_i64 ret; +- ret.status.repr = r.status.repr; +- ret.value = 0; +- return ret; +- } else if (negative) { +- if (r.value < 0x8000000000000000) { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = -(int64_t)(r.value); +- return ret; +- } else if (r.value == 0x8000000000000000) { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = INT64_MIN; +- return ret; +- } +- goto fail_out_of_bounds; +- } else if (r.value > 0x7FFFFFFFFFFFFFFF) { +- goto fail_out_of_bounds; +- } else { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = +(int64_t)(r.value); +- return ret; +- } +- } while (0); +- +-fail_bad_argument: +- do { +- wuffs_base__result_i64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); +- +-fail_out_of_bounds: +- do { +- wuffs_base__result_i64 ret; +- ret.status.repr = wuffs_base__error__out_of_bounds; +- ret.value = 0; +- return ret; +- } while (0); ++ return 0; + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // +-wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) { +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; +- +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__restart_frame( ++ wuffs_base__image_decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- if (p >= q) { +- goto fail_bad_argument; +- +- } else if (*p == '0') { +- p++; +- if (p >= q) { +- goto ok_zero; +- } +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- if (*p == '_') { +- p++; +- for (; p < q; p++) { +- if (*p != '_') { +- if (options & +- WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { +- goto decimal; +- } +- goto fail_bad_argument; +- } +- } +- goto ok_zero; +- } ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->restart_frame)(self, a_index, a_io_position); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- if ((*p == 'x') || (*p == 'X')) { +- p++; +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } +- } +- if (p < q) { +- goto hexadecimal; +- } ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- } else if ((*p == 'd') || (*p == 'D')) { +- p++; +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } +- } +- if (p < q) { +- goto decimal; +- } +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__set_quirk( ++ wuffs_base__image_decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { +- goto decimal; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- goto fail_bad_argument; ++ v++; + } + +-decimal: +- do { +- uint64_t v = wuffs_base__parse_number__decimal_digits[*p++]; +- if (v == 0) { +- goto fail_bad_argument; +- } +- v &= 0x0F; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1). +- const uint64_t max10 = 1844674407370955161u; +- const uint8_t max1 = 5; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__image_decoder__set_report_metadata( ++ wuffs_base__image_decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- continue; +- } +- uint8_t digit = wuffs_base__parse_number__decimal_digits[*p]; +- if (digit == 0) { +- goto fail_bad_argument; +- } +- digit &= 0x0F; +- if ((v > max10) || ((v == max10) && (digit > max1))) { +- goto fail_out_of_bounds; +- } +- v = (10 * v) + ((uint64_t)(digit)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = v; +- return ret; +- } while (0); ++ return wuffs_base__make_empty_struct(); ++} + +-hexadecimal: +- do { +- uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++]; +- if (v == 0) { +- goto fail_bad_argument; +- } +- v &= 0x0F; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__tell_me_more( ++ wuffs_base__image_decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- continue; +- } +- uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p]; +- if (digit == 0) { +- goto fail_bad_argument; +- } +- digit &= 0x0F; +- if ((v >> 60) != 0) { +- goto fail_out_of_bounds; +- } +- v = (v << 4) | ((uint64_t)(digit)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = v; +- return ret; +- } while (0); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-ok_zero: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = 0; +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__image_decoder__workbuf_len( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +-fail_bad_argument: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-fail_out_of_bounds: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = wuffs_base__error__out_of_bounds; +- ret.value = 0; +- return ret; +- } while (0); ++ return wuffs_base__utility__empty_range_ii_u64(); + } + + // -------- + +-// wuffs_base__render_number__first_hundred contains the decimal encodings of +-// the first one hundred numbers [0 ..= 99]. +-static const uint8_t wuffs_base__render_number__first_hundred[200] = { +- '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', // +- '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', // +- '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', // +- '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', // +- '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', // +- '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', // +- '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', // +- '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', // +- '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', // +- '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', // +- '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', // +- '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', // +- '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', // +- '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', // +- '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', // +- '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', // +- '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', // +- '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', // +- '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', // +- '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', // +-}; +- +-static size_t // +-wuffs_base__private_implementation__render_number_u64(wuffs_base__slice_u8 dst, +- uint64_t x, +- uint32_t options, +- bool neg) { +- uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL]; +- uint8_t* ptr = &buf[0] + sizeof(buf); +- +- while (x >= 100) { +- size_t index = ((size_t)((x % 100) * 2)); +- x /= 100; +- uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; +- uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; +- ptr -= 2; +- ptr[0] = s0; +- ptr[1] = s1; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_base__io_transformer__dst_history_retain_length( ++ const wuffs_base__io_transformer* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } +- +- if (x < 10) { +- ptr -= 1; +- ptr[0] = (uint8_t)('0' + x); +- } else { +- size_t index = ((size_t)(x * 2)); +- uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; +- uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; +- ptr -= 2; +- ptr[0] = s0; +- ptr[1] = s1; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + +- if (neg) { +- ptr -= 1; +- ptr[0] = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- ptr -= 1; +- ptr[0] = '+'; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->dst_history_retain_length)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0])); +- if (n > dst.len) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__io_transformer__get_quirk( ++ const wuffs_base__io_transformer* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } +- memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? (dst.len - n) +- : 0), +- ptr, n); +- return n; +-} + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, +- int64_t x, +- uint32_t options) { +- uint64_t u = (uint64_t)x; +- bool neg = x < 0; +- if (neg) { +- u = 1 + ~u; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } +- return wuffs_base__private_implementation__render_number_u64(dst, u, options, +- neg); +-} + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, +- uint64_t x, +- uint32_t options) { +- return wuffs_base__private_implementation__render_number_u64(dst, x, options, +- false); ++ return 0; + } + +-// ---------------- Base-16 ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__io_transformer__set_quirk( ++ wuffs_base__io_transformer* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t src_len2 = src.len / 2; +- size_t len; +- if (dst.len < src_len2) { +- len = dst.len; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src_len2; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else if (src.len & 1) { +- o.status.repr = wuffs_base__error__bad_data; +- } else { +- o.status.repr = NULL; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- while (n--) { +- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) | +- (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F)); +- d += 1; +- s += 2; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__io_transformer__transform_io( ++ wuffs_base__io_transformer* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- o.num_dst = len; +- o.num_src = len * 2; +- return o; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t src_len4 = src.len / 4; +- size_t len = dst.len < src_len4 ? dst.len : src_len4; +- if (dst.len < src_len4) { +- len = dst.len; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src_len4; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else if (src.len & 1) { +- o.status.repr = wuffs_base__error__bad_data; +- } else { +- o.status.repr = NULL; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__io_transformer__workbuf_len( ++ const wuffs_base__io_transformer* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; +- +- while (n--) { +- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) | +- (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F)); +- d += 1; +- s += 4; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len; +- o.num_src = len * 4; +- return o; ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t dst_len2 = dst.len / 2; +- size_t len; +- if (dst_len2 < src.len) { +- len = dst_len2; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src.len; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else { +- o.status.repr = NULL; +- } +- } ++// -------- + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__token_decoder__decode_tokens( ++ wuffs_base__token_decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- while (n--) { +- uint8_t c = *s; +- d[0] = wuffs_base__private_implementation__encode_base16[c >> 4]; +- d[1] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; +- d += 2; +- s += 1; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len * 2; +- o.num_src = len; +- return o; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t dst_len4 = dst.len / 4; +- size_t len; +- if (dst_len4 < src.len) { +- len = dst_len4; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src.len; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else { +- o.status.repr = NULL; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__token_decoder__get_quirk( ++ const wuffs_base__token_decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; +- +- while (n--) { +- uint8_t c = *s; +- d[0] = '\\'; +- d[1] = 'x'; +- d[2] = wuffs_base__private_implementation__encode_base16[c >> 4]; +- d[3] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; +- d += 4; +- s += 1; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len * 4; +- o.num_src = len; +- return o; ++ return 0; + } + +-// ---------------- Base-64 ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__token_decoder__set_quirk( ++ wuffs_base__token_decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-// The two base-64 alphabets, std and url, differ only in the last two codes. +-// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +-// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-static const uint8_t wuffs_base__base_64__decode_std[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. +- 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. +- 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. +- 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. +- 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. +- 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F. +- 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. +- 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. +- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. +- 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__token_decoder__workbuf_len( ++ const wuffs_base__token_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ return wuffs_base__utility__empty_range_ii_u64(); ++} + +-static const uint8_t wuffs_base__base_64__decode_url[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. +- 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +- 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. +- 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. +- 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. +- 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F. +- 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. +- 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. +- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. +- 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. ++// ---------------- IEEE 754 Floating Point + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F ++// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by ++// script/print-hpd-left-shift.go. That script has an optional -comments flag, ++// whose output is not copied here, which prints further detail. ++// ++// These tables are used in ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits. ++ ++// wuffs_private_impl__hpd_left_shift[i] encodes the number of new digits ++// created after multiplying a positive integer by (1 << i): the additional ++// length in the decimal representation. For example, shifting "234" by 3 ++// (equivalent to multiplying by 8) will produce "1872". Going from a 3-length ++// string to a 4-length string means that 1 new digit was added (and existing ++// digits may have changed). ++// ++// Shifting by i can add either N or N-1 new digits, depending on whether the ++// original positive integer compares >= or < to the i'th power of 5 (as 10 ++// equals 2 * 5). Comparison is lexicographic, not numerical. ++// ++// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new ++// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625": ++// - ("1" << 4) is "16", which adds 1 new digit. ++// - ("5678" << 4) is "90848", which adds 1 new digit. ++// - ("624" << 4) is "9984", which adds 1 new digit. ++// - ("62498" << 4) is "999968", which adds 1 new digit. ++// - ("625" << 4) is "10000", which adds 2 new digits. ++// - ("625001" << 4) is "10000016", which adds 2 new digits. ++// - ("7008" << 4) is "112128", which adds 2 new digits. ++// - ("99" << 4) is "1584", which adds 2 new digits. ++// ++// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift ++// array encodes this as: ++// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006. ++// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009. ++// where the ? isn't relevant for i == 4. ++// ++// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two ++// possible number of new digits. The low 11 bits are an offset into the ++// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i ++// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9] ++// is the string "\x06\x02\x05", so the relevant power of 5 is "625". ++// ++// Thanks to Ken Thompson for the original idea. ++static const uint16_t wuffs_private_impl__hpd_left_shift[65] = { ++ 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817, ++ 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067, ++ 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF, ++ 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0, ++ 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA, ++ 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC, ++ 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C, ++ 0x051C, 0x051C, + }; + +-static const uint8_t wuffs_base__base_64__encode_std[64] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. +- 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. +- 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. +- 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. +- 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. +- 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. +- 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F. ++// wuffs_private_impl__powers_of_5 contains the powers of 5, concatenated ++// together: "5", "25", "125", "625", "3125", etc. ++static const uint8_t wuffs_private_impl__powers_of_5[0x051C] = { ++ 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9, ++ 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2, ++ 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5, ++ 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0, ++ 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5, ++ 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, ++ 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, ++ 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, ++ 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, ++ 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, ++ 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, ++ 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, ++ 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, ++ 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, ++ 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, ++ 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, ++ 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, ++ 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, ++ 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, ++ 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, ++ 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, ++ 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, ++ 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, ++ 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5, ++ 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3, ++ 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2, ++ 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9, ++ 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8, ++ 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, ++ 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, ++ 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, ++ 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, ++ 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, ++ 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, ++ 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, ++ 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, ++ 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, ++ 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, ++ 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, ++ 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, ++ 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, ++ 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, ++ 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, ++ 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, ++ 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, ++ 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, ++ 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, ++ 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1, ++ 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1, ++ 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4, ++ 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7, ++ 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, ++ 6, 9, 1, 4, 0, 6, 2, 5, + }; + +-static const uint8_t wuffs_base__base_64__encode_url[64] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. +- 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. +- 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. +- 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. +- 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. +- 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. +- 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F. ++// -------- ++ ++// wuffs_private_impl__powers_of_10 contains truncated approximations to the ++// powers of 10, ranging from 1e-307 to 1e+288 inclusive, as 596 pairs of ++// uint64_t values (a 128-bit mantissa). ++// ++// There's also an implicit third column (implied by a linear formula involving ++// the base-10 exponent) that is the base-2 exponent, biased by a magic ++// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias ++// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and ++// wuffs_private_impl__parse_number_f64_eisel_lemire works with ++// multiples-of-64-bit mantissas. ++// ++// For example, the third row holds the approximation to 1e-305: ++// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE)) ++// ++// Similarly, 1e+4 is approximated by: ++// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE)) ++// ++// Similarly, 1e+68 is approximated by: ++// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE)) ++// ++// This table was generated by by script/print-mpb-powers-of-10.go ++static const uint64_t wuffs_private_impl__powers_of_10[596][2] = { ++ {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 ++ {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 ++ {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 ++ {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 ++ {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 ++ {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 ++ {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 ++ {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 ++ {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 ++ {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 ++ {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 ++ {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 ++ {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 ++ {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 ++ {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 ++ {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 ++ {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 ++ {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 ++ {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 ++ {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 ++ {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 ++ {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 ++ {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 ++ {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 ++ {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 ++ {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 ++ {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 ++ {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 ++ {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 ++ {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 ++ {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 ++ {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 ++ {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 ++ {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 ++ {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 ++ {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 ++ {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 ++ {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 ++ {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 ++ {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 ++ {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 ++ {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 ++ {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 ++ {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 ++ {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 ++ {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 ++ {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 ++ {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 ++ {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 ++ {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 ++ {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 ++ {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 ++ {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 ++ {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 ++ {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 ++ {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 ++ {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 ++ {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 ++ {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 ++ {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 ++ {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 ++ {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 ++ {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 ++ {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 ++ {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 ++ {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 ++ {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 ++ {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 ++ {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 ++ {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 ++ {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 ++ {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 ++ {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 ++ {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 ++ {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 ++ {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 ++ {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 ++ {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 ++ {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 ++ {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 ++ {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 ++ {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 ++ {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 ++ {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 ++ {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 ++ {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 ++ {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 ++ {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 ++ {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 ++ {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 ++ {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 ++ {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 ++ {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 ++ {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 ++ {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 ++ {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 ++ {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 ++ {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 ++ {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 ++ {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 ++ {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 ++ {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 ++ {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 ++ {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 ++ {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 ++ {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 ++ {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 ++ {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 ++ {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 ++ {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 ++ {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 ++ {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 ++ {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 ++ {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 ++ {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 ++ {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 ++ {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 ++ {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 ++ {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 ++ {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 ++ {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 ++ {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 ++ {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 ++ {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 ++ {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 ++ {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 ++ {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 ++ {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 ++ {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 ++ {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 ++ {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 ++ {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 ++ {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 ++ {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 ++ {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 ++ {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 ++ {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 ++ {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 ++ {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 ++ {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 ++ {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 ++ {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 ++ {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 ++ {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 ++ {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 ++ {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 ++ {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 ++ {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 ++ {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 ++ {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 ++ {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 ++ {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 ++ {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 ++ {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 ++ {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 ++ {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 ++ {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 ++ {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 ++ {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 ++ {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 ++ {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 ++ {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 ++ {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 ++ {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 ++ {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 ++ {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 ++ {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 ++ {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 ++ {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 ++ {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 ++ {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 ++ {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 ++ {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 ++ {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 ++ {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 ++ {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 ++ {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 ++ {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 ++ {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 ++ {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 ++ {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 ++ {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 ++ {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 ++ {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 ++ {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 ++ {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 ++ {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 ++ {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 ++ {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 ++ {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 ++ {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 ++ {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 ++ {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 ++ {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 ++ {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 ++ {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 ++ {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 ++ {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 ++ {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 ++ {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 ++ {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 ++ {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 ++ {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 ++ {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 ++ {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 ++ {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 ++ {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 ++ {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 ++ {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 ++ {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 ++ {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 ++ {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 ++ {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 ++ {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 ++ {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 ++ {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 ++ {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 ++ {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 ++ {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 ++ {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 ++ {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 ++ {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 ++ {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 ++ {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 ++ {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 ++ {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 ++ {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 ++ {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 ++ {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 ++ {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 ++ {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 ++ {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 ++ {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 ++ {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 ++ {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 ++ {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 ++ {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 ++ {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 ++ {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 ++ {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 ++ {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 ++ {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 ++ {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 ++ {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 ++ {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 ++ {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 ++ {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 ++ {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 ++ {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 ++ {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 ++ {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 ++ {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 ++ {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 ++ {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 ++ {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 ++ {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 ++ {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 ++ {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 ++ {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 ++ {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 ++ {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 ++ {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 ++ {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 ++ {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 ++ {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 ++ {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 ++ {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 ++ {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 ++ {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 ++ {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 ++ {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 ++ {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 ++ {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 ++ {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 ++ {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 ++ {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 ++ {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 ++ {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 ++ {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 ++ {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 ++ {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 ++ {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 ++ {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 ++ {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 ++ {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 ++ {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 ++ {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 ++ {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 ++ {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 ++ {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 ++ {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 ++ {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 ++ {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 ++ {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 ++ {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 ++ {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 ++ {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 ++ {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 ++ {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 ++ {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 ++ {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 ++ {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 ++ {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 ++ {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 ++ {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 ++ {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 ++ {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 ++ {0x0000000000000000, 0x8000000000000000}, // 1e0 ++ {0x0000000000000000, 0xA000000000000000}, // 1e1 ++ {0x0000000000000000, 0xC800000000000000}, // 1e2 ++ {0x0000000000000000, 0xFA00000000000000}, // 1e3 ++ {0x0000000000000000, 0x9C40000000000000}, // 1e4 ++ {0x0000000000000000, 0xC350000000000000}, // 1e5 ++ {0x0000000000000000, 0xF424000000000000}, // 1e6 ++ {0x0000000000000000, 0x9896800000000000}, // 1e7 ++ {0x0000000000000000, 0xBEBC200000000000}, // 1e8 ++ {0x0000000000000000, 0xEE6B280000000000}, // 1e9 ++ {0x0000000000000000, 0x9502F90000000000}, // 1e10 ++ {0x0000000000000000, 0xBA43B74000000000}, // 1e11 ++ {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 ++ {0x0000000000000000, 0x9184E72A00000000}, // 1e13 ++ {0x0000000000000000, 0xB5E620F480000000}, // 1e14 ++ {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 ++ {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 ++ {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 ++ {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 ++ {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 ++ {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 ++ {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 ++ {0x0000000000000000, 0x878678326EAC9000}, // 1e22 ++ {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 ++ {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 ++ {0x0000000000000000, 0x84595161401484A0}, // 1e25 ++ {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 ++ {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 ++ {0x4000000000000000, 0x813F3978F8940984}, // 1e28 ++ {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 ++ {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 ++ {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 ++ {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 ++ {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 ++ {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 ++ {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 ++ {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 ++ {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 ++ {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 ++ {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 ++ {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 ++ {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 ++ {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 ++ {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 ++ {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 ++ {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 ++ {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 ++ {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 ++ {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 ++ {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 ++ {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 ++ {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 ++ {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 ++ {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 ++ {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 ++ {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 ++ {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 ++ {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 ++ {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 ++ {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 ++ {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 ++ {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 ++ {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 ++ {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 ++ {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 ++ {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 ++ {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 ++ {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 ++ {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 ++ {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 ++ {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 ++ {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 ++ {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 ++ {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 ++ {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 ++ {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 ++ {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 ++ {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 ++ {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 ++ {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 ++ {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 ++ {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 ++ {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 ++ {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 ++ {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 ++ {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 ++ {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 ++ {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 ++ {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 ++ {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 ++ {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 ++ {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 ++ {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 ++ {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 ++ {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 ++ {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 ++ {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 ++ {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 ++ {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 ++ {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 ++ {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 ++ {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 ++ {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 ++ {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 ++ {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 ++ {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 ++ {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 ++ {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 ++ {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 ++ {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 ++ {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 ++ {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 ++ {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 ++ {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 ++ {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 ++ {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 ++ {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 ++ {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 ++ {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 ++ {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 ++ {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 ++ {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 ++ {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 ++ {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 ++ {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 ++ {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 ++ {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 ++ {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 ++ {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 ++ {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 ++ {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 ++ {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 ++ {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 ++ {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 ++ {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 ++ {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 ++ {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 ++ {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 ++ {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 ++ {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 ++ {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 ++ {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 ++ {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 ++ {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 ++ {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 ++ {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 ++ {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 ++ {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 ++ {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 ++ {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 ++ {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 ++ {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 ++ {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 ++ {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 ++ {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 ++ {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 ++ {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 ++ {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 ++ {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 ++ {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 ++ {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 ++ {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 ++ {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 ++ {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 ++ {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 ++ {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 ++ {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 ++ {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 ++ {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 ++ {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 ++ {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 ++ {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 ++ {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 ++ {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 ++ {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 ++ {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 ++ {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 ++ {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 ++ {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 ++ {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 ++ {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 ++ {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 ++ {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 ++ {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 ++ {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 ++ {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 ++ {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 ++ {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 ++ {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 ++ {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 ++ {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 ++ {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 ++ {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 ++ {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 ++ {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 ++ {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 ++ {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 ++ {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 ++ {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 ++ {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 ++ {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 ++ {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 ++ {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 ++ {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 ++ {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 ++ {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 ++ {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 ++ {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 ++ {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 ++ {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 ++ {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 ++ {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 ++ {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 ++ {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 ++ {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 ++ {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 ++ {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 ++ {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 ++ {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 ++ {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 ++ {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 ++ {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 ++ {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 ++ {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 ++ {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 ++ {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 ++ {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 ++ {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 ++ {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 ++ {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 ++ {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 ++ {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 ++ {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 ++ {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 ++ {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 ++ {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 ++ {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 ++ {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 ++ {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 ++ {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 ++ {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 ++ {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 ++ {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 ++ {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 ++ {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 ++ {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 ++ {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 ++ {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 ++ {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 ++ {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 ++ {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 ++ {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 ++ {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 ++ {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 ++ {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 ++ {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 ++ {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 ++ {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 ++ {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 ++ {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 ++ {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 ++ {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 ++ {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 ++ {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 ++ {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 ++ {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 ++ {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 ++ {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 ++ {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 ++ {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 ++ {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 ++ {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 ++ {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 ++ {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 ++ {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 ++ {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 ++ {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 ++ {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 ++ {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 ++ {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 ++ {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 ++ {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 ++ {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 ++ {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 ++ {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 ++ {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 ++ {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 ++ {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 ++ {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 + }; + +-// -------- ++// wuffs_private_impl__f64_powers_of_10 holds powers of 10 that can be exactly ++// represented by a float64 (what C calls a double). ++static const double wuffs_private_impl__f64_powers_of_10[23] = { ++ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, ++ 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, ++}; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) +- ? wuffs_base__base_64__decode_url +- : wuffs_base__base_64__decode_std; +- wuffs_base__transform__output o; +- uint8_t* d_ptr = dst.ptr; +- size_t d_len = dst.len; +- const uint8_t* s_ptr = src.ptr; +- size_t s_len = src.len; +- bool pad = false; ++// ---------------- IEEE 754 Floating Point + +- while (s_len >= 4) { +- uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- uint32_t s2 = alphabet[0xFF & (s >> 16)]; +- uint32_t s3 = alphabet[0xFF & (s >> 24)]; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // ++wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) { ++ uint64_t u = 0; ++ if (sizeof(uint64_t) == sizeof(double)) { ++ memcpy(&u, &f, sizeof(uint64_t)); ++ } ++ uint16_t neg = ((uint16_t)((u >> 63) << 15)); ++ u &= 0x7FFFFFFFFFFFFFFF; ++ uint64_t exp = u >> 52; ++ uint64_t man = u & 0x000FFFFFFFFFFFFF; + +- if (((s0 | s1 | s2 | s3) & 0xC0) != 0) { +- if (s_len > 4) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } else if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) && +- (s_ptr[3] == '=')) { +- pad = true; +- if (s_ptr[2] == '=') { +- goto src2; +- } +- goto src3; +- } +- o.status.repr = wuffs_base__error__bad_data; +- goto done; ++ if (exp == 0x7FF) { ++ if (man == 0) { // Infinity. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7C00; ++ ret.lossy = false; ++ return ret; + } ++ // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most ++ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9 ++ // bits of ret.value so that the 10-bit mantissa is non-zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42)); ++ ret.lossy = false; ++ return ret; + +- if (d_len < 3) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } ++ } else if (exp > 0x40E) { // Truncate to the largest finite f16. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7BFF; ++ ret.lossy = true; ++ return ret; + +- s_ptr += 4; +- s_len -= 4; +- s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0); +- *d_ptr++ = (uint8_t)(s >> 16); +- *d_ptr++ = (uint8_t)(s >> 8); +- *d_ptr++ = (uint8_t)(s >> 0); +- d_len -= 3; +- } +- +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } ++ } else if (exp <= 0x3E6) { // Truncate to zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg; ++ ret.lossy = (u != 0); ++ return ret; + +- if (s_len == 0) { +- o.status.repr = NULL; +- goto done; +- } else if (s_len == 1) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } else if (s_len == 2) { +- goto src2; ++ } else if (exp <= 0x3F0) { // Normal f64, subnormal f16. ++ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a ++ // 10-bit mantissa and then adjust for the exponent. ++ man |= 0x0010000000000000; ++ uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10. ++ uint64_t shifted_man = man >> shift; ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | ((uint16_t)shifted_man); ++ ret.lossy = (shifted_man << shift) != man; ++ return ret; + } + +-src3: +- do { +- uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- uint32_t s2 = alphabet[0xFF & (s >> 16)]; +- if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } +- if (d_len < 2) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- s_ptr += pad ? 4 : 3; +- s = (s0 << 18) | (s1 << 12) | (s2 << 6); +- *d_ptr++ = (uint8_t)(s >> 16); +- *d_ptr++ = (uint8_t)(s >> 8); +- o.status.repr = NULL; +- goto done; +- } while (0); ++ // Normal f64, normal f16. + +-src2: +- do { +- uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- if ((s0 & 0xC0) || (s1 & 0xCF)) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } +- if (d_len < 1) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- s_ptr += pad ? 4 : 2; +- s = (s0 << 18) | (s1 << 12); +- *d_ptr++ = (uint8_t)(s >> 16); +- o.status.repr = NULL; +- goto done; +- } while (0); ++ // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits. ++ exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF. + +-done: +- o.num_dst = (size_t)(d_ptr - dst.ptr); +- o.num_src = (size_t)(s_ptr - src.ptr); +- return o; ++ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit ++ // mantissa (again excluding the implicit bit). We lose some information if ++ // any of the bottom 42 bits are non-zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42)); ++ ret.lossy = (man << 22) != 0; ++ return ret; + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) +- ? wuffs_base__base_64__encode_url +- : wuffs_base__base_64__encode_std; +- wuffs_base__transform__output o; +- uint8_t* d_ptr = dst.ptr; +- size_t d_len = dst.len; +- const uint8_t* s_ptr = src.ptr; +- size_t s_len = src.len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // ++wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) { ++ uint64_t u = 0; ++ if (sizeof(uint64_t) == sizeof(double)) { ++ memcpy(&u, &f, sizeof(uint64_t)); ++ } ++ uint32_t neg = ((uint32_t)(u >> 63)) << 31; ++ u &= 0x7FFFFFFFFFFFFFFF; ++ uint64_t exp = u >> 52; ++ uint64_t man = u & 0x000FFFFFFFFFFFFF; + +- do { +- while (s_len >= 3) { +- if (d_len < 4) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr); +- s_ptr += 3; +- s_len -= 3; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- *d_ptr++ = alphabet[0x3F & (s >> 6)]; +- *d_ptr++ = alphabet[0x3F & (s >> 0)]; +- d_len -= 4; ++ if (exp == 0x7FF) { ++ if (man == 0) { // Infinity. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7F800000; ++ ret.lossy = false; ++ return ret; + } ++ // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most ++ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22 ++ // bits of ret.value so that the 23-bit mantissa is non-zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29)); ++ ret.lossy = false; ++ return ret; + +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } ++ } else if (exp > 0x47E) { // Truncate to the largest finite f32. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7F7FFFFF; ++ ret.lossy = true; ++ return ret; + +- if (s_len == 2) { +- if (d_len < +- ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr))) +- << 8; +- s_ptr += 2; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- *d_ptr++ = alphabet[0x3F & (s >> 6)]; +- if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { +- *d_ptr++ = '='; +- } +- o.status.repr = NULL; +- goto done; ++ } else if (exp <= 0x369) { // Truncate to zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg; ++ ret.lossy = (u != 0); ++ return ret; + +- } else if (s_len == 1) { +- if (d_len < +- ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr))) +- << 16; +- s_ptr += 1; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { +- *d_ptr++ = '='; +- *d_ptr++ = '='; +- } +- o.status.repr = NULL; +- goto done; ++ } else if (exp <= 0x380) { // Normal f64, subnormal f32. ++ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a ++ // 23-bit mantissa and then adjust for the exponent. ++ man |= 0x0010000000000000; ++ uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23. ++ uint64_t shifted_man = man >> shift; ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | ((uint32_t)shifted_man); ++ ret.lossy = (shifted_man << shift) != man; ++ return ret; ++ } + +- } else { +- o.status.repr = NULL; +- goto done; +- } +- } while (0); ++ // Normal f64, normal f32. + +-done: +- o.num_dst = (size_t)(d_ptr - dst.ptr); +- o.num_src = (size_t)(s_ptr - src.ptr); +- return o; ++ // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits. ++ exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F. ++ ++ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit ++ // mantissa (again excluding the implicit bit). We lose some information if ++ // any of the bottom 29 bits are non-zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29)); ++ ret.lossy = (man << 35) != 0; ++ return ret; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) ++// -------- + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) ++#define WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE 2047 ++#define WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION 800 + +-// ---------------- Magic Numbers ++// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL is the largest N such that ++// ((10 << N) < (1 << 64)). ++#define WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL 60 + +-// ICO doesn't start with a magic identifier. Instead, see if the opening bytes +-// are plausibly ICO. ++// wuffs_private_impl__high_prec_dec (abbreviated as HPD) is a fixed precision ++// floating point decimal number, augmented with ±infinity values, but it ++// cannot represent NaN (Not a Number). + // +-// Callers should have already verified that (prefix_data.len >= 2) and the +-// first two bytes are 0x00. ++// "High precision" means that the mantissa holds 800 decimal digits. 800 is ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION. + // +-// See: +-// - https://docs.fileformat.com/image/ico/ +-static int32_t // +-wuffs_base__magic_number_guess_fourcc__maybe_ico( +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // Allow-list for the Image Type field. +- if (prefix_data.len < 4) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[3] != 0) { +- return 0; +- } +- switch (prefix_data.ptr[2]) { +- case 0x01: // ICO +- case 0x02: // CUR +- break; +- default: +- return 0; +- } +- +- // The Number Of Images should be positive. +- if (prefix_data.len < 6) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) { +- return 0; +- } ++// An HPD isn't for general purpose arithmetic, only for conversions to and ++// from IEEE 754 double-precision floating point, where the largest and ++// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324. ++// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047 ++// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION and ++// WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++// ++// digits[.. num_digits] are the number's digits in big-endian order. The ++// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7' ++// is the ASCII value 0x37. ++// ++// decimal_point is the index (within digits) of the decimal point. It may be ++// negative or be larger than num_digits, in which case the explicit digits are ++// padded with implicit zeroes. ++// ++// For example, if num_digits is 3 and digits is "\x07\x08\x09": ++// - A decimal_point of -2 means ".00789" ++// - A decimal_point of -1 means ".0789" ++// - A decimal_point of +0 means ".789" ++// - A decimal_point of +1 means "7.89" ++// - A decimal_point of +2 means "78.9" ++// - A decimal_point of +3 means "789." ++// - A decimal_point of +4 means "7890." ++// - A decimal_point of +5 means "78900." ++// ++// As above, a decimal_point higher than +2047 means that the overall value is ++// infinity, lower than -2047 means zero. ++// ++// negative is a sign bit. An HPD can distinguish positive and negative zero. ++// ++// truncated is whether there are more than ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION digits, and at least one of those ++// extra digits are non-zero. The existence of long-tail digits can affect ++// rounding. ++// ++// The "all fields are zero" value is valid, and represents the number +0. ++typedef struct wuffs_private_impl__high_prec_dec__struct { ++ uint32_t num_digits; ++ int32_t decimal_point; ++ bool negative; ++ bool truncated; ++ uint8_t digits[WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION]; ++} wuffs_private_impl__high_prec_dec; + +- // The first ICONDIRENTRY's fourth byte should be zero. +- if (prefix_data.len < 10) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[9] != 0) { +- return 0; ++// wuffs_private_impl__high_prec_dec__trim trims trailing zeroes from the ++// h->digits[.. h->num_digits] slice. They have no benefit, since we explicitly ++// track h->decimal_point. ++// ++// Preconditions: ++// - h is non-NULL. ++static inline void // ++wuffs_private_impl__high_prec_dec__trim(wuffs_private_impl__high_prec_dec* h) { ++ while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) { ++ h->num_digits--; + } +- +- // TODO: have a separate FourCC for CUR? +- return 0x49434F20; // 'ICO 'be + } + +-// TGA doesn't start with a magic identifier. Instead, see if the opening bytes +-// are plausibly TGA. ++// wuffs_private_impl__high_prec_dec__assign sets h to represent the number x. + // +-// Callers should have already verified that (prefix_data.len >= 2) and the +-// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or +-// 0x01. +-// +-// See: +-// - https://docs.fileformat.com/image/tga/ +-// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf +-static int32_t // +-wuffs_base__magic_number_guess_fourcc__maybe_tga( +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // Allow-list for the Image Type field. +- if (prefix_data.len < 3) { +- return prefix_closed ? 0 : -1; +- } +- switch (prefix_data.ptr[2]) { +- case 0x01: +- case 0x02: +- case 0x03: +- case 0x09: +- case 0x0A: +- case 0x0B: +- break; +- default: +- // TODO: 0x20 and 0x21 are invalid, according to the spec, but are +- // apparently unofficial extensions. +- return 0; +- } +- +- // Allow-list for the Color Map Entry Size field (if the Color Map Type field +- // is non-zero) or else all the Color Map fields should be zero. +- if (prefix_data.len < 8) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[1] != 0x00) { +- switch (prefix_data.ptr[7]) { +- case 0x0F: +- case 0x10: +- case 0x18: +- case 0x20: +- break; +- default: +- return 0; +- } +- } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] | +- prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) { +- return 0; +- } ++// Preconditions: ++// - h is non-NULL. ++static void // ++wuffs_private_impl__high_prec_dec__assign(wuffs_private_impl__high_prec_dec* h, ++ uint64_t x, ++ bool negative) { ++ uint32_t n = 0; + +- // Allow-list for the Pixel Depth field. +- if (prefix_data.len < 17) { +- return prefix_closed ? 0 : -1; +- } +- switch (prefix_data.ptr[16]) { +- case 0x01: +- case 0x08: +- case 0x0F: +- case 0x10: +- case 0x18: +- case 0x20: +- break; +- default: +- return 0; ++ // Set h->digits. ++ if (x > 0) { ++ // Calculate the digits, working right-to-left. After we determine n (how ++ // many digits there are), copy from buf to h->digits. ++ // ++ // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to ++ // copy a constant number of bytes than a variable number (20 instead of ++ // n). Make buf large enough (and start writing to it from the middle) so ++ // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)]. ++ uint8_t buf[40] = {0}; ++ uint8_t* ptr = &buf[20]; ++ do { ++ uint64_t remaining = x / 10; ++ x -= remaining * 10; ++ ptr--; ++ *ptr = (uint8_t)x; ++ n++; ++ x = remaining; ++ } while (x > 0); ++ memcpy(h->digits, ptr, 20); + } + +- return 0x54474120; // 'TGA 'be ++ // Set h's other fields. ++ h->num_digits = n; ++ h->decimal_point = (int32_t)n; ++ h->negative = negative; ++ h->truncated = false; ++ wuffs_private_impl__high_prec_dec__trim(h); + } + +-WUFFS_BASE__MAYBE_STATIC int32_t // +-wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // This is similar to (but different from): +- // - the magic/Magdir tables under https://github.com/file/file +- // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/ +- +- // table holds the 'magic numbers' (which are actually variable length +- // strings). The strings may contain NUL bytes, so the "const char* magic" +- // value starts with the length-minus-1 of the 'magic number'. +- // +- // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer +- // matches) and finally by magic[2:]. When multiple entries match, the +- // longest one wins. +- // +- // The fourcc field might be negated, in which case there's further +- // specialization (see § below). +- static struct { +- int32_t fourcc; +- const char* magic; +- } table[] = { +- {-0x30302020, "\x01\x00\x00"}, // '00 'be +- {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ +- {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD +- {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 +- {+0x424D5020, "\x01\x42\x4D"}, // BMP +- {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF +- {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) +- {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian) +- {+0x4E50424D, "\x02\x50\x35\x0A"}, // NPBM (P5; *.pgm) +- {+0x4E50424D, "\x02\x50\x36\x0A"}, // NPBM (P6; *.ppm) +- {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF +- {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"}, // LZMA +- {+0x4C5A4D41, "\x02\x5D\x00\x00"}, // LZMA +- {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE +- {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI +- {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB +- {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG +- {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"}, // XZ +- {+0x4A504547, "\x01\xFF\xD8"}, // JPEG +- }; +- static const size_t table_len = sizeof(table) / sizeof(table[0]); +- +- if (prefix_data.len == 0) { +- return prefix_closed ? 0 : -1; ++static wuffs_base__status // ++wuffs_private_impl__high_prec_dec__parse(wuffs_private_impl__high_prec_dec* h, ++ wuffs_base__slice_u8 s, ++ uint32_t options) { ++ if (!h) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- uint8_t pre_first_byte = prefix_data.ptr[0]; ++ h->num_digits = 0; ++ h->decimal_point = 0; ++ h->negative = false; ++ h->truncated = false; + +- int32_t fourcc = 0; +- size_t i; +- for (i = 0; i < table_len; i++) { +- uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1])); +- if (pre_first_byte < mag_first_byte) { +- break; +- } else if (pre_first_byte > mag_first_byte) { +- continue; +- } +- fourcc = table[i].fourcc; ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0])); +- if (mag_remaining_len == 0) { +- goto match; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } + } ++ } + +- const char* mag_remaining_ptr = table[i].magic + 2; +- uint8_t* pre_remaining_ptr = prefix_data.ptr + 1; +- size_t pre_remaining_len = prefix_data.len - 1; +- if (pre_remaining_len < mag_remaining_len) { +- if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) { +- return prefix_closed ? 0 : -1; +- } ++ // Parse sign. ++ do { ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ h->negative = true; ++ p++; + } else { +- if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) { +- goto match; ++ break; ++ } ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } + } + } +- } +- +- if (prefix_data.len < 2) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) { +- return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data, +- prefix_closed); +- } +- +- return 0; +- +-match: +- // Negative FourCC values (see § above) are further specialized. +- if (fourcc < 0) { +- fourcc = -fourcc; ++ } while (0); + +- if (fourcc == 0x52494646) { // 'RIFF'be +- if (prefix_data.len < 12) { +- return prefix_closed ? 0 : -1; ++ // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each ++ // limb in this if-else chain: ++ // - "0.789" ++ // - "1002.789" ++ // - ".789" ++ // - Other (invalid input). ++ uint32_t nd = 0; ++ int32_t dp = 0; ++ bool no_digits_before_separator = false; ++ if (('0' == *p) && ++ !(options & ++ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) { ++ p++; ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if (*p == ++ ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ goto after_sep; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8); +- if (x == 0x57454250) { // 'WEBP'be +- return 0x57454250; // 'WEBP'be ++ } ++ ++ } else if (('0' <= *p) && (*p <= '9')) { ++ if (*p == '0') { ++ for (; (p < q) && (*p == '0'); p++) { + } ++ } else { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ dp = (int32_t)nd; ++ p++; ++ } + +- } else if (fourcc == 0x30302020) { // '00 'be +- // Binary data starting with multiple 0x00 NUL bytes is quite common. +- // Unfortunately, some file formats also don't start with a magic +- // identifier, so we have to use heuristics (where the order matters, the +- // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe +- // it's TGA, ICO/CUR, etc. Maybe it's something else. +- int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga( +- prefix_data, prefix_closed); +- if (tga != 0) { +- return tga; ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if (('0' <= *p) && (*p <= '9')) { ++ if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ dp = (int32_t)nd; ++ } else if ('0' != *p) { ++ // Long-tail non-zeroes set the truncated bit. ++ h->truncated = true; ++ } ++ } else if (*p == ++ ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ goto after_sep; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico( +- prefix_data, prefix_closed); +- if (ico != 0) { +- return ico; ++ } ++ ++ } else if (*p == ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ no_digits_before_separator = true; ++ ++ } else { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ ++after_sep: ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if ('0' == *p) { ++ if (nd == 0) { ++ // Track leading zeroes implicitly. ++ dp--; ++ } else if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); + } +- if (prefix_data.len < 4) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[2] != 0x00) && +- ((prefix_data.ptr[2] >= 0x80) || +- (prefix_data.ptr[3] != 0x00))) { +- // Roughly speaking, this could be a non-degenerate (non-0-width and +- // non-0-height) WBMP image. +- return 0x57424D50; // 'WBMP'be ++ } else if (('0' < *p) && (*p <= '9')) { ++ if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ } else { ++ // Long-tail non-zeroes set the truncated bit. ++ h->truncated = true; + } +- return 0; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + } +- return fourcc; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +-// ---------------- Pixel Swizzler ++after_exp: ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } ++ } ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); ++ int32_t exp_sign = +1; ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ exp_sign = -1; ++ p++; ++ } + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); ++ int32_t exp = 0; ++ const int32_t exp_large = WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + ++ WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION; ++ bool saw_exp_digits = false; ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ // No-op. ++ } else if (('0' <= *p) && (*p <= '9')) { ++ saw_exp_digits = true; ++ if (exp < exp_large) { ++ exp = (10 * exp) + ((int32_t)(*p - '0')); ++ } ++ } else { ++ break; ++ } ++ } ++ if (!saw_exp_digits) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ dp += exp_sign * exp; ++ } while (0); + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++after_all: ++ if (p != q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ h->num_digits = nd; ++ if (nd == 0) { ++ if (no_digits_before_separator) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ h->decimal_point = 0; ++ } else if (dp < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ h->decimal_point = -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE - 1; ++ } else if (dp > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ h->decimal_point = +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + 1; ++ } else { ++ h->decimal_point = dp; ++ } ++ wuffs_private_impl__high_prec_dec__trim(h); ++ return wuffs_base__make_status(NULL); ++} + + // -------- + +-static inline uint32_t // +-wuffs_base__swap_u32_argb_abgr(uint32_t u) { +- uint32_t o = u & 0xFF00FF00ul; +- uint32_t r = u & 0x00FF0000ul; +- uint32_t b = u & 0x000000FFul; +- return o | (r >> 16) | (b << 16); +-} ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits returns the number ++// of additional decimal digits when left-shifting by shift. ++// ++// See below for preconditions. ++static uint32_t // ++wuffs_private_impl__high_prec_dec__lshift_num_new_digits( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ // Masking with 0x3F should be unnecessary (assuming the preconditions) but ++ // it's cheap and ensures that we don't overflow the ++ // wuffs_private_impl__hpd_left_shift array. ++ shift &= 63; + +-static inline uint64_t // +-wuffs_base__swap_u64_argb_abgr(uint64_t u) { +- uint64_t o = u & 0xFFFF0000FFFF0000ull; +- uint64_t r = u & 0x0000FFFF00000000ull; +- uint64_t b = u & 0x000000000000FFFFull; +- return o | (r >> 32) | (b << 32); +-} ++ uint32_t x_a = wuffs_private_impl__hpd_left_shift[shift]; ++ uint32_t x_b = wuffs_private_impl__hpd_left_shift[shift + 1]; ++ uint32_t num_new_digits = x_a >> 11; ++ uint32_t pow5_a = 0x7FF & x_a; ++ uint32_t pow5_b = 0x7FF & x_b; + +-static inline uint32_t // +-wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) { +- uint32_t a = ((uint32_t)(0xFF & (c >> 56))); +- uint32_t r = ((uint32_t)(0xFF & (c >> 40))); +- uint32_t g = ((uint32_t)(0xFF & (c >> 24))); +- uint32_t b = ((uint32_t)(0xFF & (c >> 8))); +- return (a << 24) | (b << 16) | (g << 8) | (r << 0); ++ const uint8_t* pow5 = &wuffs_private_impl__powers_of_5[pow5_a]; ++ uint32_t i = 0; ++ uint32_t n = pow5_b - pow5_a; ++ for (; i < n; i++) { ++ if (i >= h->num_digits) { ++ return num_new_digits - 1; ++ } else if (h->digits[i] == pow5[i]) { ++ continue; ++ } else if (h->digits[i] < pow5[i]) { ++ return num_new_digits - 1; ++ } else { ++ return num_new_digits; ++ } ++ } ++ return num_new_digits; + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // +-wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, +- uint32_t x, +- uint32_t y) { +- if (!pb || (x >= pb->pixcfg.private_impl.width) || +- (y >= pb->pixcfg.private_impl.height)) { ++// wuffs_private_impl__high_prec_dec__rounded_integer returns the integral ++// (non-fractional) part of h, provided that it is 18 or fewer decimal digits. ++// For 19 or more digits, it returns UINT64_MAX. Note that: ++// - (1 << 53) is 9007199254740992, which has 16 decimal digits. ++// - (1 << 56) is 72057594037927936, which has 17 decimal digits. ++// - (1 << 59) is 576460752303423488, which has 18 decimal digits. ++// - (1 << 63) is 9223372036854775808, which has 19 decimal digits. ++// and that IEEE 754 double precision has 52 mantissa bits. ++// ++// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8. ++// ++// h's negative bit is ignored: rounding -8.6 returns 9. ++// ++// See below for preconditions. ++static uint64_t // ++wuffs_private_impl__high_prec_dec__rounded_integer( ++ wuffs_private_impl__high_prec_dec* h) { ++ if ((h->num_digits == 0) || (h->decimal_point < 0)) { + return 0; ++ } else if (h->decimal_point > 18) { ++ return UINT64_MAX; + } + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return 0; ++ uint32_t dp = (uint32_t)(h->decimal_point); ++ uint64_t n = 0; ++ uint32_t i = 0; ++ for (; i < dp; i++) { ++ n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0); + } + +- size_t stride = pb->private_impl.planes[0].stride; +- const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); ++ bool round_up = false; ++ if (dp < h->num_digits) { ++ round_up = h->digits[dp] >= 5; ++ if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) { ++ // We are exactly halfway. If we're truncated, round up, otherwise round ++ // to even. ++ round_up = h->truncated || // ++ ((dp > 0) && (1 & h->digits[dp - 1])); ++ } ++ } ++ if (round_up) { ++ n++; ++ } + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); ++ return n; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { +- uint8_t* palette = pb->private_impl.planes[3].ptr; +- return wuffs_base__peek_u32le__no_bounds_check(palette + +- (4 * ((size_t)row[x]))); +- } ++// wuffs_private_impl__high_prec_dec__small_xshift shifts h's number (where 'x' ++// is 'l' or 'r' for left or right) by a small shift value. ++// ++// Preconditions: ++// - h is non-NULL. ++// - h->decimal_point is "not extreme". ++// - shift is non-zero. ++// - shift is "a small shift". ++// ++// "Not extreme" means within ±WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++// ++// "A small shift" means not more than ++// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++// ++// wuffs_private_impl__high_prec_dec__rounded_integer and ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits have the same ++// preconditions. ++// ++// wuffs_private_impl__high_prec_dec__lshift keeps the first two preconditions ++// but not the last two. Its shift argument is signed and does not need to be ++// "small": zero is a no-op, positive means left shift and negative means right ++// shift. + +- // Common formats above. Rarer formats below. ++static void // ++wuffs_private_impl__high_prec_dec__small_lshift( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ if (h->num_digits == 0) { ++ return; ++ } ++ uint32_t num_new_digits = ++ wuffs_private_impl__high_prec_dec__lshift_num_new_digits(h, shift); ++ uint32_t rx = h->num_digits - 1; // Read index. ++ uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index. ++ uint64_t n = 0; + +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x]))); +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1]))); +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0]))); ++ // Repeat: pick up a digit, put down a digit, right to left. ++ while (((int32_t)rx) >= 0) { ++ n += ((uint64_t)(h->digits[rx])) << shift; ++ uint64_t quo = n / 10; ++ uint64_t rem = n - (10 * quo); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx] = (uint8_t)rem; ++ } else if (rem > 0) { ++ h->truncated = true; ++ } ++ n = quo; ++ wx--; ++ rx--; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: { +- uint8_t* palette = pb->private_impl.planes[3].ptr; +- return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(palette + +- (4 * ((size_t)row[x])))); ++ // Put down leading digits, right to left. ++ while (n > 0) { ++ uint64_t quo = n / 10; ++ uint64_t rem = n - (10 * quo); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx] = (uint8_t)rem; ++ } else if (rem > 0) { ++ h->truncated = true; + } ++ n = quo; ++ wx--; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return 0xFF000000 | +- wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return 0xFF000000 | +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); ++ // Finish. ++ h->num_digits += num_new_digits; ++ if (h->num_digits > WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->num_digits = WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION; ++ } ++ h->decimal_point += (int32_t)num_new_digits; ++ wuffs_private_impl__high_prec_dec__trim(h); ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__swap_u32_argb_abgr( +- 0xFF000000 | +- wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- return wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(row + +- (4 * ((size_t)x))))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- return wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__swap_u32_argb_abgr( +- 0xFF000000 | +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++static void // ++wuffs_private_impl__high_prec_dec__small_rshift( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ uint32_t rx = 0; // Read index. ++ uint32_t wx = 0; // Write index. ++ uint64_t n = 0; + +- default: +- // TODO: support more formats. ++ // Pick up enough leading digits to cover the first shift. ++ while ((n >> shift) == 0) { ++ if (rx < h->num_digits) { ++ // Read a digit. ++ n = (10 * n) + h->digits[rx++]; ++ } else if (n == 0) { ++ // h's number used to be zero and remains zero. ++ return; ++ } else { ++ // Read sufficient implicit trailing zeroes. ++ while ((n >> shift) == 0) { ++ n = 10 * n; ++ rx++; ++ } + break; ++ } ++ } ++ h->decimal_point -= ((int32_t)(rx - 1)); ++ if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ // After the shift, h's number is effectively zero. ++ h->num_digits = 0; ++ h->decimal_point = 0; ++ h->truncated = false; ++ return; + } + +- return 0; ++ // Repeat: pick up a digit, put down a digit, left to right. ++ uint64_t mask = (((uint64_t)(1)) << shift) - 1; ++ while (rx < h->num_digits) { ++ uint8_t new_digit = ((uint8_t)(n >> shift)); ++ n = (10 * (n & mask)) + h->digits[rx++]; ++ h->digits[wx++] = new_digit; ++ } ++ ++ // Put down trailing digits, left to right. ++ while (n > 0) { ++ uint8_t new_digit = ((uint8_t)(n >> shift)); ++ n = 10 * (n & mask); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx++] = new_digit; ++ } else if (new_digit > 0) { ++ h->truncated = true; ++ } ++ } ++ ++ // Finish. ++ h->num_digits = wx; ++ wuffs_private_impl__high_prec_dec__trim(h); ++} ++ ++static void // ++wuffs_private_impl__high_prec_dec__lshift(wuffs_private_impl__high_prec_dec* h, ++ int32_t shift) { ++ if (shift > 0) { ++ while (shift > +WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ wuffs_private_impl__high_prec_dec__small_lshift( ++ h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL); ++ shift -= WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_lshift(h, ((uint32_t)(+shift))); ++ } else if (shift < 0) { ++ while (shift < -WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ wuffs_private_impl__high_prec_dec__small_rshift( ++ h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL); ++ shift += WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, ((uint32_t)(-shift))); ++ } + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_buffer__set_color_u32_at( +- wuffs_base__pixel_buffer* pb, +- uint32_t x, +- uint32_t y, +- wuffs_base__color_u32_argb_premul color) { +- if (!pb) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++// wuffs_private_impl__high_prec_dec__round_etc rounds h's number. For those ++// functions that take an n argument, rounding produces at most n digits (which ++// is not necessarily at most n decimal places). Negative n values are ignored, ++// as well as any n greater than or equal to h's number of digits. The ++// etc__round_just_enough function implicitly chooses an n to implement ++// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION. ++// ++// Preconditions: ++// - h is non-NULL. ++// - h->decimal_point is "not extreme". ++// ++// "Not extreme" means within ±WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++ ++static void // ++wuffs_private_impl__high_prec_dec__round_down( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; + } +- if ((x >= pb->pixcfg.private_impl.width) || +- (y >= pb->pixcfg.private_impl.height)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ h->num_digits = (uint32_t)(n); ++ wuffs_private_impl__high_prec_dec__trim(h); ++} ++ ++static void // ++wuffs_private_impl__high_prec_dec__round_up( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; + } + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ for (n--; n >= 0; n--) { ++ if (h->digits[n] < 9) { ++ h->digits[n]++; ++ h->num_digits = (uint32_t)(n + 1); ++ return; ++ } + } + +- size_t stride = pb->private_impl.planes[0].stride; +- uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); ++ // The number is all 9s. Change to a single 1 and adjust the decimal point. ++ h->digits[0] = 1; ++ h->num_digits = 1; ++ h->decimal_point++; ++} + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color); +- break; ++static void // ++wuffs_private_impl__high_prec_dec__round_nearest( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; ++ } ++ bool up = h->digits[n] >= 5; ++ if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) { ++ up = h->truncated || // ++ ((n > 0) && ((h->digits[n - 1] & 1) != 0)); ++ } + +- // Common formats above. Rarer formats below. +- +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- wuffs_base__poke_u8__no_bounds_check( +- row + ((size_t)x), +- wuffs_base__color_u32_argb_premul__as__color_u8_gray(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- wuffs_base__poke_u16le__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- wuffs_base__poke_u16be__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- wuffs_base__poke_u8__no_bounds_check( +- row + ((size_t)x), wuffs_base__pixel_palette__closest_element( +- wuffs_base__pixel_buffer__palette(pb), +- pb->pixcfg.private_impl.pixfmt, color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- wuffs_base__poke_u16le__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- wuffs_base__poke_u64le__no_bounds_check( +- row + (8 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( +- color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- wuffs_base__poke_u24le__no_bounds_check( +- row + (3 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr(color))); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); +- break; +- +- default: +- // TODO: support more formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ if (up) { ++ wuffs_private_impl__high_prec_dec__round_up(h, n); ++ } else { ++ wuffs_private_impl__high_prec_dec__round_down(h, n); + } +- +- return wuffs_base__make_status(NULL); + } + +-// -------- +- +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint16_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u16le__no_bounds_check(ptr, color); +- ptr += 2; +- } ++static void // ++wuffs_private_impl__high_prec_dec__round_just_enough( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t exp2, ++ uint64_t mantissa) { ++ // The magic numbers 52 and 53 in this function are because IEEE 754 double ++ // precision has 52 mantissa bits. ++ // ++ // Let f be the floating point number represented by exp2 and mantissa (and ++ // also the number in h): the number (mantissa * (2 ** (exp2 - 52))). ++ // ++ // If f is zero or a small integer, we can return early. ++ if ((mantissa == 0) || ++ ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) { + return; + } + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (2 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u16le__no_bounds_check(ptr, color); +- ptr += 2; +- } +- } +-} ++ // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52). ++ // Subnormal numbers have the same exp2 but a smaller mantissa. ++ static const int32_t min_incl_normal_exp2 = -1022; ++ static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul; + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint32_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u24le__no_bounds_check(ptr, color); +- ptr += 3; +- } +- return; ++ // Compute lower and upper bounds such that any number between them (possibly ++ // inclusive) will round to f. First, the lower bound. Our number f is: ++ // ((mantissa + 0) * (2 ** ( exp2 - 52))) ++ // ++ // The next lowest floating point number is: ++ // ((mantissa - 1) * (2 ** ( exp2 - 52))) ++ // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the ++ // min_incl_normal_exp2. Either way, call it: ++ // ((l_mantissa) * (2 ** (l_exp2 - 52))) ++ // ++ // The lower bound is halfway between them (noting that 52 became 53): ++ // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53))) ++ int32_t l_exp2 = exp2; ++ uint64_t l_mantissa = mantissa - 1; ++ if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) { ++ l_exp2 = exp2 - 1; ++ l_mantissa = (2 * mantissa) - 1; + } ++ wuffs_private_impl__high_prec_dec lower; ++ wuffs_private_impl__high_prec_dec__assign(&lower, (2 * l_mantissa) + 1, ++ false); ++ wuffs_private_impl__high_prec_dec__lshift(&lower, l_exp2 - 53); + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (3 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u24le__no_bounds_check(ptr, color); +- ptr += 3; +- } +- } +-} ++ // Next, the upper bound. Our number f is: ++ // ((mantissa + 0) * (2 ** (exp2 - 52))) ++ // ++ // The next highest floating point number is: ++ // ((mantissa + 1) * (2 ** (exp2 - 52))) ++ // ++ // The upper bound is halfway between them (noting that 52 became 53): ++ // (((2 * mantissa) + 1) * (2 ** (exp2 - 53))) ++ wuffs_private_impl__high_prec_dec upper; ++ wuffs_private_impl__high_prec_dec__assign(&upper, (2 * mantissa) + 1, false); ++ wuffs_private_impl__high_prec_dec__lshift(&upper, exp2 - 53); + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint32_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u32le__no_bounds_check(ptr, color); +- ptr += 4; +- } +- return; +- } ++ // The lower and upper bounds are possible outputs only if the original ++ // mantissa is even, so that IEEE round-to-even would round to the original ++ // mantissa and not its neighbors. ++ bool inclusive = (mantissa & 1) == 0; + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (4 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u32le__no_bounds_check(ptr, color); +- ptr += 4; +- } +- } +-} ++ // As we walk the digits, we want to know whether rounding up would fall ++ // within the upper bound. This is tracked by upper_delta: ++ // - When -1, the digits of h and upper are the same so far. ++ // - When +0, we saw a difference of 1 between h and upper on a previous ++ // digit and subsequently only 9s for h and 0s for upper. Thus, rounding ++ // up may fall outside of the bound if !inclusive. ++ // - When +1, the difference is greater than 1 and we know that rounding up ++ // falls within the bound. ++ // ++ // This is a state machine with three states. The numerical value for each ++ // state (-1, +0 or +1) isn't important, other than their order. ++ int upper_delta = -1; + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint64_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u64le__no_bounds_check(ptr, color); +- ptr += 8; ++ // We can now figure out the shortest number of digits required. Walk the ++ // digits until h has distinguished itself from lower or upper. ++ // ++ // The zi and zd variables are indexes and digits, for z in l (lower), h (the ++ // number) and u (upper). ++ // ++ // The lower, h and upper numbers may have their decimal points at different ++ // places. In this case, upper is the longest, so we iterate ui starting from ++ // 0 and iterate li and hi starting from either 0 or -1. ++ int32_t ui = 0; ++ for (;; ui++) { ++ // Calculate hd, the middle number's digit. ++ int32_t hi = ui - upper.decimal_point + h->decimal_point; ++ if (hi >= ((int32_t)(h->num_digits))) { ++ break; + } +- return; +- } ++ uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0; + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (8 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u64le__no_bounds_check(ptr, color); +- ptr += 8; ++ // Calculate ld, the lower bound's digit. ++ int32_t li = ui - upper.decimal_point + lower.decimal_point; ++ uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0; ++ ++ // We can round down (truncate) if lower has a different digit than h or if ++ // lower is inclusive and is exactly the result of rounding down (i.e. we ++ // have reached the final digit of lower). ++ bool can_round_down = ++ (ld != hd) || // ++ (inclusive && ((li + 1) == ((int32_t)(lower.num_digits)))); ++ ++ // Calculate ud, the upper bound's digit, and update upper_delta. ++ uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0; ++ if (upper_delta < 0) { ++ if ((hd + 1) < ud) { ++ // For example: ++ // h = 12345??? ++ // upper = 12347??? ++ upper_delta = +1; ++ } else if (hd != ud) { ++ // For example: ++ // h = 12345??? ++ // upper = 12346??? ++ upper_delta = +0; ++ } ++ } else if (upper_delta == 0) { ++ if ((hd != 9) || (ud != 0)) { ++ // For example: ++ // h = 1234598? ++ // upper = 1234600? ++ upper_delta = +1; ++ } + } +- } +-} + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- wuffs_base__color_u32_argb_premul color) { +- if (!pb) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) { +- return wuffs_base__make_status(NULL); +- } +- wuffs_base__rect_ie_u32 bounds = +- wuffs_base__pixel_config__bounds(&pb->pixcfg); +- if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } ++ // We can round up if upper has a different digit than h and either upper ++ // is inclusive or upper is bigger than the result of rounding up. ++ bool can_round_up = ++ (upper_delta > 0) || // ++ ((upper_delta == 0) && // ++ (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits))))); + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ // If we can round either way, round to nearest. If we can round only one ++ // way, do it. If we can't round, continue the loop. ++ if (can_round_down) { ++ if (can_round_up) { ++ wuffs_private_impl__high_prec_dec__round_nearest(h, hi + 1); ++ return; ++ } else { ++ wuffs_private_impl__high_prec_dec__round_down(h, hi + 1); ++ return; ++ } ++ } else { ++ if (can_round_up) { ++ wuffs_private_impl__high_prec_dec__round_up(h, hi + 1); ++ return; ++ } ++ } + } ++} + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, color); +- return wuffs_base__make_status(NULL); +- +- // Common formats above. Rarer formats below. ++// -------- + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); +- return wuffs_base__make_status(NULL); ++// wuffs_private_impl__parse_number_f64_eisel_lemire produces the IEEE 754 ++// double-precision value for an exact mantissa and base-10 exponent. For ++// example: ++// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1. ++// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading ++// minus sign is the responsibility of the caller, not this function. ++// ++// On success, it returns a non-negative int64_t such that the low 63 bits hold ++// the 11-bit exponent and 52-bit mantissa. ++// ++// On failure, it returns a negative value. ++// ++// The algorithm is based on an original idea by Michael Eisel that was refined ++// by Daniel Lemire. See ++// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/ ++// and ++// https://nigeltao.github.io/blog/2020/eisel-lemire.html ++// ++// Preconditions: ++// - man is non-zero. ++// - exp10 is in the range [-307 ..= 288], the same range of the ++// wuffs_private_impl__powers_of_10 array. ++// ++// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX], ++// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the ++// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal ++// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are ++// approximately 2.23e–308 and 1.80e+308. ++static int64_t // ++wuffs_private_impl__parse_number_f64_eisel_lemire(uint64_t man, int32_t exp10) { ++ // Look up the (possibly truncated) base-2 representation of (10 ** exp10). ++ // The look-up table was constructed so that it is already normalized: the ++ // table entry's mantissa's MSB (most significant bit) is on. ++ const uint64_t* po10 = &wuffs_private_impl__powers_of_10[exp10 + 307][0]; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, color); +- return wuffs_base__make_status(NULL); ++ // Normalize the man argument. The (man != 0) precondition means that a ++ // non-zero bit exists. ++ uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); ++ man <<= clz; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- color)); +- return wuffs_base__make_status(NULL); ++ // Calculate the return value's base-2 exponent. We might tweak it by ±1 ++ // later, but its initial value comes from a linear scaling of exp10, ++ // converting from power-of-10 to power-of-2, and adjusting by clz. ++ // ++ // The magic constants are: ++ // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because ++ // the look-up table uses 64-bit mantissas. ++ // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough ++ // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928. ++ // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift. ++ // ++ // Equality of the linearly-scaled value and the actual power-of-2, over the ++ // range of exp10 arguments that this function accepts, is confirmed by ++ // script/print-mpb-powers-of-10.go ++ uint64_t ret_exp2 = ++ ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( +- color)); +- return wuffs_base__make_status(NULL); ++ // Multiply the two mantissas. Normalization means that both mantissas are at ++ // least (1<<63), so the 128-bit product must be at least (1<<126). The high ++ // 64 bits of the product, x_hi, must therefore be at least (1<<62). ++ // ++ // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi ++ // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore ++ // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. ++ wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]); ++ uint64_t x_hi = x.hi; ++ uint64_t x_lo = x.lo; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr(color))); +- return wuffs_base__make_status(NULL); ++ // Before we shift right by at least 9 bits, recall that the look-up table ++ // entry was possibly truncated. We have so far only calculated a lower bound ++ // for the product (man * e), where e is (10 ** exp10). The upper bound would ++ // add a further (man * 1) to the 128-bit product, which overflows the lower ++ // 64-bit limb if ((x_lo + man) < man). ++ // ++ // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right ++ // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit ++ // limb's low 9 bits are all on. ++ // ++ // For example, parsing "9999999999999999999" will take the if-true branch ++ // here, since: ++ // - x_hi = 0x4563918244F3FFFF ++ // - x_lo = 0x8000000000000000 ++ // - man = 0x8AC7230489E7FFFF ++ if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) { ++ // Refine our calculation of (man * e). Before, our approximation of e used ++ // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit ++ // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e). ++ // Now calculate y = (man * bits_64_to_127_incl_of_e). ++ wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]); ++ uint64_t y_hi = y.hi; ++ uint64_t y_lo = y.lo; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, wuffs_base__swap_u32_argb_abgr(color)); +- return wuffs_base__make_status(NULL); +- } ++ // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to ++ // calculate the 192-bit product of the 64-bit man by the 128-bit e. ++ // As we exit this if-block, we only care about the high 128 bits ++ // (merged_hi and merged_lo) of that 192-bit product. ++ // ++ // For example, parsing "1.234e-45" will take the if-true branch here, ++ // since: ++ // - x_hi = 0x70B7E3696DB29FFF ++ // - x_lo = 0xE040000000000000 ++ // - y_hi = 0x33718BBEAB0E0D7A ++ // - y_lo = 0xA880000000000000 ++ uint64_t merged_hi = x_hi; ++ uint64_t merged_lo = x_lo + y_hi; ++ if (merged_lo < x_lo) { ++ merged_hi++; // Carry the overflow bit. ++ } + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint32_t x; +- for (x = rect.min_incl_x; x < rect.max_excl_x; x++) { +- wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color); ++ // The "high resolution" approximation of e is still a lower bound. Once ++ // again, see if the upper bound is large enough to produce a different ++ // result. This time, if it does, give up instead of reaching for an even ++ // more precise approximation to e. ++ // ++ // This three-part check is similar to the two-part check that guarded the ++ // if block that we're now in, but it has an extra term for the middle 64 ++ // bits (checking that adding 1 to merged_lo would overflow). ++ // ++ // For example, parsing "5.9604644775390625e-8" will take the if-true ++ // branch here, since: ++ // - merged_hi = 0x7FFFFFFFFFFFFFFF ++ // - merged_lo = 0xFFFFFFFFFFFFFFFF ++ // - y_lo = 0x4DB3FFC120988200 ++ // - man = 0xD3C21BCECCEDA100 ++ if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) && ++ (y_lo + man < man)) { ++ return -1; + } ++ ++ // Replace the 128-bit x with merged. ++ x_hi = merged_hi; ++ x_lo = merged_lo; + } +- return wuffs_base__make_status(NULL); +-} + +-// -------- ++ // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave ++ // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the ++ // MSB (before shifting) was on, adjust ret_exp2 for the larger shift. ++ // ++ // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit ++ // number. ++ uint64_t msb = x_hi >> 63; ++ uint64_t ret_mantissa = x_hi >> (msb + 9); ++ ret_exp2 -= 1 ^ msb; + +-WUFFS_BASE__MAYBE_STATIC uint8_t // +-wuffs_base__pixel_palette__closest_element( +- wuffs_base__slice_u8 palette_slice, +- wuffs_base__pixel_format palette_format, +- wuffs_base__color_u32_argb_premul c) { +- size_t n = palette_slice.len / 4; +- if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4); ++ // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can ++ // be tricky. If we're half-way between two exactly representable numbers ++ // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give ++ // up instead of trying to pick the winner. ++ // ++ // Technically, we could tighten the condition by changing "73" to "73 or 74, ++ // depending on msb", but a flat "73" is simpler. ++ // ++ // For example, parsing "1e+23" will take the if-true branch here, since: ++ // - x_hi = 0x54B40B1F852BDA00 ++ // - ret_mantissa = 0x002A5A058FC295ED ++ if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) { ++ return -1; + } +- size_t best_index = 0; +- uint64_t best_score = 0xFFFFFFFFFFFFFFFF; + +- // Work in 16-bit color. +- uint32_t ca = 0x101 * (0xFF & (c >> 24)); +- uint32_t cr = 0x101 * (0xFF & (c >> 16)); +- uint32_t cg = 0x101 * (0xFF & (c >> 8)); +- uint32_t cb = 0x101 * (0xFF & (c >> 0)); +- +- switch (palette_format.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { +- bool nonpremul = palette_format.repr == +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL; +- +- size_t i; +- for (i = 0; i < n; i++) { +- // Work in 16-bit color. +- uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0])); +- uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1])); +- uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2])); +- uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3])); +- +- // Convert to premultiplied alpha. +- if (nonpremul && (pa != 0xFFFF)) { +- pb = (pb * pa) / 0xFFFF; +- pg = (pg * pa) / 0xFFFF; +- pr = (pr * pa) / 0xFFFF; +- } +- +- // These deltas are conceptually int32_t (signed) but after squaring, +- // it's equivalent to work in uint32_t (unsigned). +- pb -= cb; +- pg -= cg; +- pr -= cr; +- pa -= ca; +- uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) + +- ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa)); +- if (best_score > score) { +- best_score = score; +- best_index = i; +- } +- } +- break; +- } ++ // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit ++ // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether ++ // it was on or off, shifting right by one then produces a 53-bit number. If ++ // carrying up overflowed, shift again. ++ ret_mantissa += ret_mantissa & 1; ++ ret_mantissa >>= 1; ++ // This if block is equivalent to (but benchmarks slightly faster than) the ++ // following branchless form: ++ // uint64_t overflow_adjustment = ret_mantissa >> 53; ++ // ret_mantissa >>= overflow_adjustment; ++ // ret_exp2 += overflow_adjustment; ++ // ++ // For example, parsing "7.2057594037927933e+16" will take the if-true ++ // branch here, since: ++ // - x_hi = 0x7FFFFFFFFFFFFE80 ++ // - ret_mantissa = 0x0020000000000000 ++ if ((ret_mantissa >> 53) > 0) { ++ ret_mantissa >>= 1; ++ ret_exp2++; + } + +- return (uint8_t)best_index; ++ // Starting with a 53-bit number, IEEE 754 double-precision normal numbers ++ // have an implicit mantissa bit. Mask that away and keep the low 52 bits. ++ ret_mantissa &= 0x000FFFFFFFFFFFFF; ++ ++ // Pack the bits and return. ++ return ((int64_t)(ret_mantissa | (ret_exp2 << 52))); + } + + // -------- + +-static inline uint32_t // +-wuffs_base__composite_nonpremul_nonpremul_u32_axxx(uint32_t dst_nonpremul, +- uint32_t src_nonpremul) { +- // Extract 16-bit color components. +- // +- // If the destination is transparent then SRC_OVER is equivalent to SRC: just +- // return src_nonpremul. This isn't just an optimization (skipping the rest +- // of the function's computation). It also preserves the nonpremul +- // distinction between e.g. transparent red and transparent blue that would +- // otherwise be lost by converting from nonpremul to premul and back. +- uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); +- if (da == 0) { +- return src_nonpremul; +- } +- uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); +- +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++static wuffs_base__result_f64 // ++wuffs_private_impl__parse_number_f64_special(wuffs_base__slice_u8 s, ++ uint32_t options) { ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { ++ goto fail; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ if (p >= q) { ++ goto fail; ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Parse sign. ++ bool negative = false; ++ do { ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ negative = true; ++ p++; ++ } else { ++ break; ++ } ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } while (0); ++ if (p >= q) { ++ goto fail; ++ } + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++ bool nan = false; ++ switch (p[0]) { ++ case 'I': ++ case 'i': ++ if (((q - p) < 3) || // ++ ((p[1] != 'N') && (p[1] != 'n')) || // ++ ((p[2] != 'F') && (p[2] != 'f'))) { ++ goto fail; ++ } ++ p += 3; + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ if ((p >= q) || (*p == '_')) { ++ break; ++ } else if (((q - p) < 5) || // ++ ((p[0] != 'I') && (p[0] != 'i')) || // ++ ((p[1] != 'N') && (p[1] != 'n')) || // ++ ((p[2] != 'I') && (p[2] != 'i')) || // ++ ((p[3] != 'T') && (p[3] != 't')) || // ++ ((p[4] != 'Y') && (p[4] != 'y'))) { ++ goto fail; ++ } ++ p += 5; + +-static inline uint64_t // +-wuffs_base__composite_nonpremul_nonpremul_u64_axxx(uint64_t dst_nonpremul, +- uint64_t src_nonpremul) { +- // Extract components. +- // +- // If the destination is transparent then SRC_OVER is equivalent to SRC: just +- // return src_nonpremul. This isn't just an optimization (skipping the rest +- // of the function's computation). It also preserves the nonpremul +- // distinction between e.g. transparent red and transparent blue that would +- // otherwise be lost by converting from nonpremul to premul and back. +- uint64_t da = 0xFFFF & (dst_nonpremul >> 48); +- if (da == 0) { +- return src_nonpremul; +- } +- uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); +- uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); +- uint64_t db = 0xFFFF & (dst_nonpremul >> 0); +- uint64_t sa = 0xFFFF & (src_nonpremul >> 48); +- uint64_t sr = 0xFFFF & (src_nonpremul >> 32); +- uint64_t sg = 0xFFFF & (src_nonpremul >> 16); +- uint64_t sb = 0xFFFF & (src_nonpremul >> 0); ++ if ((p >= q) || (*p == '_')) { ++ break; ++ } ++ goto fail; + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ case 'N': ++ case 'n': ++ if (((q - p) < 3) || // ++ ((p[1] != 'A') && (p[1] != 'a')) || // ++ ((p[2] != 'N') && (p[2] != 'n'))) { ++ goto fail; ++ } ++ p += 3; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; ++ if ((p >= q) || (*p == '_')) { ++ nan = true; ++ break; ++ } ++ goto fail; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ default: ++ goto fail; ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Finish. ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ if (p != q) { ++ goto fail; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) | ++ (negative ? 0x8000000000000000 : 0)); ++ return ret; ++ } while (0); + +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++fail: ++ do { ++ wuffs_base__result_f64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + } + +-static inline uint32_t // +-wuffs_base__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul, +- uint32_t src_premul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // ++wuffs_private_impl__high_prec_dec__to_f64(wuffs_private_impl__high_prec_dec* h, ++ uint32_t options) { ++ do { ++ // powers converts decimal powers of 10 to binary powers of 2. For example, ++ // (10000 >> 13) is 1. It stops before the elements exceed 60, also known ++ // as WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++ // ++ // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array ++ // element value rounds up (1<<14 is an upper bound for 1e4) while staying ++ // at or below WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++ // ++ // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2), ++ // powers[2] == 6 and so: ++ // - Right shifting by 6+0 produces the range [10/64 .. 100/64] = ++ // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1. ++ // - Right shifting by 6+1 produces the range [10/128 .. 100/128] = ++ // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0. ++ // ++ // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2), ++ // powers[2] == 6 and so: ++ // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] = ++ // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0. ++ // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] = ++ // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1. ++ // ++ // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0) ++ // when right shifting but (powers[n]+1) when left shifting. ++ static const uint32_t num_powers = 19; ++ static const uint8_t powers[19] = { ++ 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, // ++ 33, 36, 39, 43, 46, 49, 53, 56, 59, // ++ }; + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ // Handle zero and obvious extremes. The largest and smallest positive ++ // finite f64 values are approximately 1.8e+308 and 4.9e-324. ++ if ((h->num_digits == 0) || (h->decimal_point < -326)) { ++ goto zero; ++ } else if (h->decimal_point > 310) { ++ goto infinity; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10) ++ // pair from the high_prec_dec h is more correct but slower than the ++ // approach taken in wuffs_base__parse_number_f64. The latter is optimized ++ // for the common cases (e.g. assuming no underscores or a leading '+' ++ // sign) rather than the full set of cases allowed by the Wuffs API. ++ // ++ // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying ++ // for an exact result). When we have more than 19 mantissa digits, run it ++ // twice to get a lower and upper bound. We still have an exact result ++ // (within f64's rounding margin) if both bounds are equal (and valid). ++ uint32_t i_max = h->num_digits; ++ if (i_max > 19) { ++ i_max = 19; ++ } ++ int32_t exp10 = h->decimal_point - ((int32_t)i_max); ++ if ((-307 <= exp10) && (exp10 <= 288)) { ++ uint64_t man = 0; ++ uint32_t i; ++ for (i = 0; i < i_max; i++) { ++ man = (10 * man) + h->digits[i]; ++ } ++ while (man != 0) { // The 'while' is just an 'if' that we can 'break'. ++ int64_t r0 = ++ wuffs_private_impl__parse_number_f64_eisel_lemire(man + 0, exp10); ++ if (r0 < 0) { ++ break; ++ } else if (h->num_digits > 19) { ++ int64_t r1 = ++ wuffs_private_impl__parse_number_f64_eisel_lemire(man + 1, exp10); ++ if (r1 != r0) { ++ break; ++ } ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63)); ++ return ret; ++ } ++ } + +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++ // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See ++ // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html ++ // ++ // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently, ++ // that h->decimal_point is +0 or +1. ++ // ++ // First we shift right while at or above 10... ++ const int32_t f64_bias = -1023; ++ int32_t exp2 = 0; ++ while (h->decimal_point > 1) { ++ uint32_t n = (uint32_t)(+h->decimal_point); ++ uint32_t shift = (n < num_powers) ++ ? powers[n] ++ : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, shift); ++ if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ goto zero; ++ } ++ exp2 += (int32_t)shift; ++ } ++ // ...then we shift left while below 0.1. ++ while (h->decimal_point < 0) { ++ uint32_t shift; ++ uint32_t n = (uint32_t)(-h->decimal_point); ++ shift = (n < num_powers) ++ // The +1 is per "when targeting h->decimal_point being +0 or ++ // +1... when left shifting" in the powers comment above. ++ ? (powers[n] + 1u) ++ : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++ wuffs_private_impl__high_prec_dec__small_lshift(h, shift); ++ if (h->decimal_point > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ goto infinity; ++ } ++ exp2 -= (int32_t)shift; ++ } + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which ++ // will give us our exponent in base-2), the mantissa's first 3 digits will ++ // determine the final left shift, equal to 52 (the number of explicit f64 ++ // bits) plus an additional adjustment. ++ int man3 = (100 * h->digits[0]) + ++ ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) + ++ ((h->num_digits > 2) ? h->digits[2] : 0); ++ int32_t additional_lshift = 0; ++ if (h->decimal_point == 0) { // The value is in [0.1 .. 1]. ++ if (man3 < 125) { ++ additional_lshift = +4; ++ } else if (man3 < 250) { ++ additional_lshift = +3; ++ } else if (man3 < 500) { ++ additional_lshift = +2; ++ } else { ++ additional_lshift = +1; ++ } ++ } else { // The value is in [1 .. 10]. ++ if (man3 < 200) { ++ additional_lshift = -0; ++ } else if (man3 < 400) { ++ additional_lshift = -1; ++ } else if (man3 < 800) { ++ additional_lshift = -2; ++ } else { ++ additional_lshift = -3; ++ } ++ } ++ exp2 -= additional_lshift; ++ uint32_t final_lshift = (uint32_t)(52 + additional_lshift); + +-static inline uint64_t // +-wuffs_base__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul, +- uint64_t src_premul) { +- // Extract components. +- uint64_t da = 0xFFFF & (dst_nonpremul >> 48); +- uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); +- uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); +- uint64_t db = 0xFFFF & (dst_nonpremul >> 0); +- uint64_t sa = 0xFFFF & (src_premul >> 48); +- uint64_t sr = 0xFFFF & (src_premul >> 32); +- uint64_t sg = 0xFFFF & (src_premul >> 16); +- uint64_t sb = 0xFFFF & (src_premul >> 0); ++ // The minimum normal exponent is (f64_bias + 1). ++ while ((f64_bias + 1) > exp2) { ++ uint32_t n = (uint32_t)((f64_bias + 1) - exp2); ++ if (n > WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ n = WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, n); ++ exp2 += (int32_t)n; ++ } + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ // Check for overflow. ++ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. ++ goto infinity; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; ++ // Extract 53 bits for the mantissa (in base-2). ++ wuffs_private_impl__high_prec_dec__small_lshift(h, final_lshift); ++ uint64_t man2 = wuffs_private_impl__high_prec_dec__rounded_integer(h); + +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++ // Rounding might have added one bit. If so, shift and re-check overflow. ++ if ((man2 >> 53) != 0) { ++ man2 >>= 1; ++ exp2++; ++ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. ++ goto infinity; ++ } ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Handle subnormal numbers. ++ if ((man2 >> 52) == 0) { ++ exp2 = f64_bias; ++ } + +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); +-} ++ // Pack the bits and return. ++ uint64_t exp2_bits = ++ (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1. ++ uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1. ++ (exp2_bits << 52) | // ++ (h->negative ? 0x8000000000000000 : 0); // (1 << 63). + +-static inline uint32_t // +-wuffs_base__composite_premul_nonpremul_u32_axxx(uint32_t dst_premul, +- uint32_t src_nonpremul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++zero: ++ do { ++ uint64_t bits = h->negative ? 0x8000000000000000 : 0; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++infinity: ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { ++ wuffs_base__result_f64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000; + +-static inline uint64_t // +-wuffs_base__composite_premul_nonpremul_u64_axxx(uint64_t dst_premul, +- uint64_t src_nonpremul) { +- // Extract components. +- uint64_t da = 0xFFFF & (dst_premul >> 48); +- uint64_t dr = 0xFFFF & (dst_premul >> 32); +- uint64_t dg = 0xFFFF & (dst_premul >> 16); +- uint64_t db = 0xFFFF & (dst_premul >> 0); +- uint64_t sa = 0xFFFF & (src_nonpremul >> 48); +- uint64_t sr = 0xFFFF & (src_nonpremul >> 32); +- uint64_t sg = 0xFFFF & (src_nonpremul >> 16); +- uint64_t sb = 0xFFFF & (src_nonpremul >> 0); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; +- +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; +- +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + } + +-static inline uint32_t // +-wuffs_base__composite_premul_premul_u32_axxx(uint32_t dst_premul, +- uint32_t src_premul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; +- +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); +- +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; +- +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); ++static inline bool // ++wuffs_private_impl__is_decimal_digit(uint8_t c) { ++ return ('0' <= c) && (c <= '9'); + } + +-// -------- ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // ++wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) { ++ // In practice, almost all "dd.ddddE±xxx" numbers can be represented ++ // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10 ++ // exponent, adjusting "xxx" for the position (if present) of the decimal ++ // separator '.' or ','. ++ // ++ // This (u64 man, i32 exp10) data structure is superficially similar to the ++ // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent ++ // here is base-10, not base-2. ++ // ++ // If s's number fits in a (man, exp10), parse that pair with the ++ // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with ++ // the fallback algorithm is slower but comprehensive. ++ // ++ // † "Printing Floating-Point Numbers Quickly and Accurately with Integers" ++ // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf). ++ // Florian Loitsch is also the primary contributor to ++ // https://github.com/google/double-conversion ++ do { ++ // Calculating that (man, exp10) pair needs to stay within s's bounds. ++ // Provided that s isn't extremely long, work on a NUL-terminated copy of ++ // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx". ++ // ++ // As the pointer p walks the contents, it's faster to repeatedly check "is ++ // *p a valid digit" than "is p within bounds and *p a valid digit". ++ if (s.len >= 256) { ++ goto fallback; ++ } ++ uint8_t z[256]; ++ memcpy(&z[0], s.ptr, s.len); ++ z[s.len] = 0; ++ const uint8_t* p = &z[0]; + +-static uint64_t // +-wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888(uint8_t* dst_ptr, +- size_t dst_len, +- const uint8_t* src_ptr, +- size_t src_len, +- bool nonpremul) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Look for a leading minus sign. Technically, we could also look for an ++ // optional plus sign, but the "script/process-json-numbers.c with -p" ++ // benchmark is noticably slower if we do. It's optional and, in practice, ++ // usually absent. Let the fallback catch it. ++ bool negative = (*p == '-'); ++ if (negative) { ++ p++; ++ } + +- size_t n = len; +- while (n--) { +- uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s); +- if (nonpremul) { +- argb = +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb); ++ // After walking "dd.dddd", comparing p later with p now will produce the ++ // number of "d"s and "."s. ++ const uint8_t* const start_of_digits_ptr = p; ++ ++ // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0', ++ // it must be a single '0'. If it starts with a non-zero decimal digit, it ++ // can be a sequence of decimal digits. ++ // ++ // Update the man variable during the walk. It's OK if man overflows now. ++ // We'll detect that later. ++ uint64_t man; ++ if (*p == '0') { ++ man = 0; ++ p++; ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ } else if (wuffs_private_impl__is_decimal_digit(*p)) { ++ man = ((uint8_t)(*p - '0')); ++ p++; ++ for (; wuffs_private_impl__is_decimal_digit(*p); p++) { ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ } ++ } else { ++ goto fallback; + } +- uint32_t b5 = 0x1F & (argb >> (8 - 5)); +- uint32_t g6 = 0x3F & (argb >> (16 - 6)); +- uint32_t r5 = 0x1F & (argb >> (24 - 5)); +- uint32_t alpha = argb & 0xFF000000; +- wuffs_base__poke_u32le__no_bounds_check( +- d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0)); +- s += 4; +- d += 4; +- } +- return len; +-} + +-// -------- ++ // Walk the "d"s after the optional decimal separator ('.' or ','), ++ // updating the man and exp10 variables. ++ int32_t exp10 = 0; ++ if (*p == ++ ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ const uint8_t* first_after_separator_ptr = p; ++ if (!wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ p++; ++ for (; wuffs_private_impl__is_decimal_digit(*p); p++) { ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ } ++ exp10 = ((int32_t)(first_after_separator_ptr - p)); ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgb_bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Count the number of digits: ++ // - for an input of "314159", digit_count is 6. ++ // - for an input of "3.14159", digit_count is 7. ++ // ++ // This is off-by-one if there is a decimal separator. That's OK for now. ++ // We'll correct for that later. The "script/process-json-numbers.c with ++ // -p" benchmark is noticably slower if we try to correct for that now. ++ uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr); + +- size_t n = len; +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- s += 3; +- d += 3; +- } +- return len; +-} ++ // Update exp10 for the optional exponent, starting with 'E' or 'e'. ++ if ((*p | 0x20) == 'e') { ++ p++; ++ int32_t exp_sign = +1; ++ if (*p == '-') { ++ p++; ++ exp_sign = -1; ++ } else if (*p == '+') { ++ p++; ++ } ++ if (!wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ int32_t exp_num = ((uint8_t)(*p - '0')); ++ p++; ++ // The rest of the exp_num walking has a peculiar control flow but, once ++ // again, the "script/process-json-numbers.c with -p" benchmark is ++ // sensitive to alternative formulations. ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ while (wuffs_private_impl__is_decimal_digit(*p)) { ++ if (exp_num > 0x1000000) { ++ goto fallback; ++ } ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ exp10 += exp_sign * exp_num; ++ } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // The Wuffs API is that the original slice has no trailing data. It also ++ // allows underscores, which we don't catch here but the fallback should. ++ if (p != &z[s.len]) { ++ goto fallback; ++ } + +- __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, // +- +0x0B, +0x08, +0x09, +0x0A, // +- +0x07, +0x04, +0x05, +0x06, // +- +0x03, +0x00, +0x01, +0x02); ++ // Check that the uint64_t typed man variable has not overflowed, based on ++ // digit_count. ++ // ++ // For reference: ++ // - (1 << 63) is 9223372036854775808, which has 19 decimal digits. ++ // - (1 << 64) is 18446744073709551616, which has 20 decimal digits. ++ // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64 ++ // bits and 16 hexadecimal digits. ++ // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67 ++ // bits and 17 hexadecimal digits. ++ if (digit_count > 19) { ++ // Even if we have more than 19 pseudo-digits, it's not yet definitely an ++ // overflow. Recall that digit_count might be off-by-one (too large) if ++ // there's a decimal separator. It will also over-report the number of ++ // meaningful digits if the input looks something like "0.000dddExxx". ++ // ++ // We adjust by the number of leading '0's and '.'s and re-compare to 19. ++ // Once again, technically, we could skip ','s too, but that perturbs the ++ // "script/process-json-numbers.c with -p" benchmark. ++ const uint8_t* q = start_of_digits_ptr; ++ for (; (*q == '0') || (*q == '.'); q++) { ++ } ++ digit_count -= (uint32_t)(q - start_of_digits_ptr); ++ if (digit_count > 19) { ++ goto fallback; ++ } ++ } + +- while (n >= 4) { +- __m128i x; +- x = _mm_lddqu_si128((const __m128i*)(const void*)s); +- x = _mm_shuffle_epi8(x, shuffle); +- _mm_storeu_si128((__m128i*)(void*)d, x); ++ // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions ++ // include that exp10 is in the range [-307 ..= 288]. ++ if ((exp10 < -307) || (288 < exp10)) { ++ goto fallback; ++ } + +- s += 4 * 4; +- d += 4 * 4; +- n -= 4; +- } ++ // If both man and (10 ** exp10) are exactly representable by a double, we ++ // don't need to run the Eisel-Lemire algorithm. ++ if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) { ++ double d = (double)man; ++ if (exp10 >= 0) { ++ d *= wuffs_private_impl__f64_powers_of_10[+exp10]; ++ } else { ++ d /= wuffs_private_impl__f64_powers_of_10[-exp10]; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = negative ? -d : +d; ++ return ret; ++ } + +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- d[3] = s3; +- s += 4; +- d += 4; +- } +- return len; +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 ++ // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions ++ // include that man is non-zero. Parsing "0" should be caught by the "If ++ // both man and (10 ** exp10)" above, but "0e99" might not. ++ if (man == 0) { ++ goto fallback; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Our man and exp10 are in range. Run the Eisel-Lemire algorithm. ++ int64_t r = wuffs_private_impl__parse_number_f64_eisel_lemire(man, exp10); ++ if (r < 0) { ++ goto fallback; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ ((uint64_t)r) | (((uint64_t)negative) << 63)); ++ return ret; ++ } while (0); + +- size_t n = len; +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- d[3] = s3; +- s += 4; +- d += 4; +- } +- return len; ++fallback: ++ do { ++ wuffs_private_impl__high_prec_dec h; ++ wuffs_base__status status = ++ wuffs_private_impl__high_prec_dec__parse(&h, s, options); ++ if (status.repr) { ++ return wuffs_private_impl__parse_number_f64_special(s, options); ++ } ++ return wuffs_private_impl__high_prec_dec__to_f64(&h, options); ++ } while (0); + } + + // -------- + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_1_1(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len) ? dst_len : src_len; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len); ++static inline size_t // ++wuffs_private_impl__render_inf(wuffs_base__slice_u8 dst, ++ bool neg, ++ uint32_t options) { ++ if (neg) { ++ if (dst.len < 4) { ++ return 0; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le. ++ return 4; + } +- return len; +-} + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_2_2(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 2); ++ if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ if (dst.len < 4) { ++ return 0; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le. ++ return 4; + } +- return len; +-} + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_3_3(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 3); ++ if (dst.len < 3) { ++ return 0; + } +- return len; ++ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le. ++ return 3; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_4_4(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 4); ++static inline size_t // ++wuffs_private_impl__render_nan(wuffs_base__slice_u8 dst) { ++ if (dst.len < 3) { ++ return 0; + } +- return len; ++ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le. ++ return 3; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_8_8(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 8); ++static size_t // ++wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ wuffs_base__slice_u8 dst, ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t precision, ++ uint32_t options) { ++ size_t n = (h->negative || ++ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) ++ ? 1 ++ : 0; ++ if (h->decimal_point <= 0) { ++ n += 1; ++ } else { ++ n += (size_t)(h->decimal_point); ++ } ++ if (precision > 0) { ++ n += precision + 1; // +1 for the '.'. + } +- return len; +-} + +-// -------- ++ // Don't modify dst if the formatted number won't fit. ++ if (n > dst.len) { ++ return 0; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Align-left or align-right. ++ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? &dst.ptr[dst.len - n] ++ : &dst.ptr[0]; + +- // TODO: unroll. ++ // Leading "±". ++ if (h->negative) { ++ *ptr++ = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ *ptr++ = '+'; ++ } + +- while (n >= 1) { +- uint32_t b5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t r5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ // Integral digits. ++ if (h->decimal_point <= 0) { ++ *ptr++ = '0'; ++ } else { ++ uint32_t m = ++ wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point)); ++ uint32_t i = 0; ++ for (; i < m; i++) { ++ *ptr++ = (uint8_t)('0' | h->digits[i]); ++ } ++ for (; i < (uint32_t)(h->decimal_point); i++) { ++ *ptr++ = '0'; ++ } ++ } + +- s += 1 * 3; +- d += 1 * 2; +- n -= 1; ++ // Separator and then fractional digits. ++ if (precision > 0) { ++ *ptr++ = ++ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.'; ++ uint32_t i = 0; ++ for (; i < precision; i++) { ++ uint32_t j = ((uint32_t)(h->decimal_point)) + i; ++ *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0)); ++ } + } + +- return len; ++ return n; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++static size_t // ++wuffs_private_impl__high_prec_dec__render_exponent_present( ++ wuffs_base__slice_u8 dst, ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t precision, ++ uint32_t options) { ++ int32_t exp = 0; ++ if (h->num_digits > 0) { ++ exp = h->decimal_point - 1; ++ } ++ bool negative_exp = exp < 0; ++ if (negative_exp) { ++ exp = -exp; ++ } + +- while (n >= 1) { +- uint32_t b5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t r5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ size_t n = (h->negative || ++ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) ++ ? 4 ++ : 3; // Mininum 3 bytes: first digit and then "e±". ++ if (precision > 0) { ++ n += precision + 1; // +1 for the '.'. ++ } ++ n += (exp < 100) ? 2 : 3; + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ // Don't modify dst if the formatted number won't fit. ++ if (n > dst.len) { ++ return 0; + } + +- return len; +-} ++ // Align-left or align-right. ++ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? &dst.ptr[dst.len - n] ++ : &dst.ptr[0]; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Leading "±". ++ if (h->negative) { ++ *ptr++ = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ *ptr++ = '+'; ++ } + +- // TODO: unroll. ++ // Integral digit. ++ if (h->num_digits > 0) { ++ *ptr++ = (uint8_t)('0' | h->digits[0]); ++ } else { ++ *ptr++ = '0'; ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ // Separator and then fractional digits. ++ if (precision > 0) { ++ *ptr++ = ++ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.'; ++ uint32_t i = 1; ++ uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1); ++ for (; i < j; i++) { ++ *ptr++ = (uint8_t)('0' | h->digits[i]); ++ } ++ for (; i <= precision; i++) { ++ *ptr++ = '0'; ++ } ++ } + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ // Exponent: "e±" and then 2 or 3 digits. ++ *ptr++ = 'e'; ++ *ptr++ = negative_exp ? '-' : '+'; ++ if (exp < 10) { ++ *ptr++ = '0'; ++ *ptr++ = (uint8_t)('0' | exp); ++ } else if (exp < 100) { ++ *ptr++ = (uint8_t)('0' | (exp / 10)); ++ *ptr++ = (uint8_t)('0' | (exp % 10)); ++ } else { ++ int32_t e = exp / 100; ++ exp -= e * 100; ++ *ptr++ = (uint8_t)('0' | e); ++ *ptr++ = (uint8_t)('0' | (exp / 10)); ++ *ptr++ = (uint8_t)('0' | (exp % 10)); + } + +- return len; ++ return n; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, ++ double x, ++ uint32_t precision, ++ uint32_t options) { ++ // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits ++ // with a -1023 bias) and mantissa (52 bits). ++ uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x); ++ bool neg = (bits >> 63) != 0; ++ int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF; ++ uint64_t man = bits & 0x000FFFFFFFFFFFFFul; + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))))); ++ // Apply the exponent bias and set the implicit top bit of the mantissa, ++ // unless x is subnormal. Also take care of Inf and NaN. ++ if (exp2 == 0x7FF) { ++ if (man != 0) { ++ return wuffs_private_impl__render_nan(dst); ++ } ++ return wuffs_private_impl__render_inf(dst, neg, options); ++ } else if (exp2 == 0) { ++ exp2 = -1022; ++ } else { ++ exp2 -= 1023; ++ man |= 0x0010000000000000ul; ++ } + +- s += 1 * 8; +- d += 1 * 2; +- n -= 1; ++ // Ensure that precision isn't too large. ++ if (precision > 4095) { ++ precision = 4095; + } + +- return len; +-} ++ // Convert from the (neg, exp2, man) tuple to an HPD. ++ wuffs_private_impl__high_prec_dec h; ++ wuffs_private_impl__high_prec_dec__assign(&h, man, neg); ++ if (h.num_digits > 0) { ++ wuffs_private_impl__high_prec_dec__lshift(&h, ++ exp2 - 52); // 52 mantissa bits. ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Handle the "%e" and "%f" formats. ++ switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT | ++ WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) { ++ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format. ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point; ++ precision = ((uint32_t)(wuffs_base__i32__max(0, p))); ++ } else { ++ wuffs_private_impl__high_prec_dec__round_nearest( ++ &h, ((int32_t)precision) + h.decimal_point); ++ } ++ return wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ dst, &h, precision, options); + +- // TODO: unroll. ++ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format. ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0; ++ } else { ++ wuffs_private_impl__high_prec_dec__round_nearest( ++ &h, ((int32_t)precision) + 1); ++ } ++ return wuffs_private_impl__high_prec_dec__render_exponent_present( ++ dst, &h, precision, options); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ // We have the "%g" format and so precision means the number of significant ++ // digits, not the number of digits after the decimal separator. Perform ++ // rounding and determine whether to use "%e" or "%f". ++ int32_t e_threshold = 0; ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ precision = h.num_digits; ++ e_threshold = 6; ++ } else { ++ if (precision == 0) { ++ precision = 1; ++ } ++ wuffs_private_impl__high_prec_dec__round_nearest(&h, ((int32_t)precision)); ++ e_threshold = ((int32_t)precision); ++ int32_t nd = ((int32_t)(h.num_digits)); ++ if ((e_threshold > nd) && (nd >= h.decimal_point)) { ++ e_threshold = nd; ++ } ++ } + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ // Use the "%e" format if the exponent is large. ++ int32_t e = h.decimal_point - 1; ++ if ((e < -4) || (e_threshold <= e)) { ++ uint32_t p = wuffs_base__u32__min(precision, h.num_digits); ++ return wuffs_private_impl__high_prec_dec__render_exponent_present( ++ dst, &h, (p > 0) ? (p - 1) : 0, options); ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // Use the "%f" format otherwise. ++ int32_t p = ((int32_t)precision); ++ if (p > h.decimal_point) { ++ p = ((int32_t)(h.num_digits)); ++ } ++ precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point))); ++ return wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ dst, &h, precision, options); ++} + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; +- } ++// ---------------- Integer + +- return len; +-} ++// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits, ++// and (0x80 | v) for valid digits, where v is the 4 bit value. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static const uint8_t wuffs_base__parse_number__decimal_digits[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. ++ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + +- // TODO: unroll. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. ++ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + +- s += 1 * 8; +- d += 1 * 2; +- n -= 1; +- } ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- return len; +-} ++static const uint8_t wuffs_private_impl__encode_base16[16] = { ++ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07. ++ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F. ++}; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // ++wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) { ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ bool negative = false; ++ if (p >= q) { ++ goto fail_bad_argument; ++ } else if (*p == '-') { ++ p++; ++ negative = true; ++ } else if (*p == '+') { ++ p++; + } + +- return len; +-} ++ do { ++ wuffs_base__result_u64 r = wuffs_base__parse_number_u64( ++ wuffs_base__make_slice_u8(p, (size_t)(q - p)), options); ++ if (r.status.repr != NULL) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = r.status.repr; ++ ret.value = 0; ++ return ret; ++ } else if (negative) { ++ if (r.value < 0x8000000000000000) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = -(int64_t)(r.value); ++ return ret; ++ } else if (r.value == 0x8000000000000000) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = INT64_MIN; ++ return ret; ++ } ++ goto fail_out_of_bounds; ++ } else if (r.value > 0x7FFFFFFFFFFFFFFF) { ++ goto fail_out_of_bounds; ++ } else { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = +(int64_t)(r.value); ++ return ret; ++ } ++ } while (0); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++fail_bad_argument: ++ do { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- // TODO: unroll. ++fail_out_of_bounds: ++ do { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = wuffs_base__error__out_of_bounds; ++ ret.value = 0; ++ return ret; ++ } while (0); ++} + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // ++wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) { ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; +- +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); +- +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); +- +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } + } + +- return len; +-} ++ if (p >= q) { ++ goto fail_bad_argument; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ } else if (*p == '0') { ++ p++; ++ if (p >= q) { ++ goto ok_zero; ++ } ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ if (*p == '_') { ++ p++; ++ for (; p < q; p++) { ++ if (*p != '_') { ++ if (options & ++ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { ++ goto decimal; ++ } ++ goto fail_bad_argument; ++ } ++ } ++ goto ok_zero; ++ } ++ } + +- // TODO: unroll. ++ if ((*p == 'x') || (*p == 'X')) { ++ p++; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } ++ if (p < q) { ++ goto hexadecimal; ++ } + +- while (n >= 1) { +- uint32_t r5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t b5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ } else if ((*p == 'd') || (*p == 'D')) { ++ p++; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } ++ if (p < q) { ++ goto decimal; ++ } ++ } + +- s += 1 * 3; +- d += 1 * 2; +- n -= 1; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { ++ goto decimal; ++ } ++ goto fail_bad_argument; + } + +- return len; +-} ++decimal: ++ do { ++ uint64_t v = wuffs_base__parse_number__decimal_digits[*p++]; ++ if (v == 0) { ++ goto fail_bad_argument; ++ } ++ v &= 0x0F; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1). ++ const uint64_t max10 = 1844674407370955161u; ++ const uint8_t max1 = 5; + +- // TODO: unroll. ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ continue; ++ } ++ uint8_t digit = wuffs_base__parse_number__decimal_digits[*p]; ++ if (digit == 0) { ++ goto fail_bad_argument; ++ } ++ digit &= 0x0F; ++ if ((v > max10) || ((v == max10) && (digit > max1))) { ++ goto fail_out_of_bounds; ++ } ++ v = (10 * v) + ((uint64_t)(digit)); ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))))); ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = v; ++ return ret; ++ } while (0); + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; +- } ++hexadecimal: ++ do { ++ uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++]; ++ if (v == 0) { ++ goto fail_bad_argument; ++ } ++ v &= 0x0F; + +- return len; +-} ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ continue; ++ } ++ uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p]; ++ if (digit == 0) { ++ goto fail_bad_argument; ++ } ++ digit &= 0x0F; ++ if ((v >> 60) != 0) { ++ goto fail_out_of_bounds; ++ } ++ v = (v << 4) | ((uint64_t)(digit)); ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = v; ++ return ret; ++ } while (0); + +- // TODO: unroll. ++ok_zero: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++fail_bad_argument: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++fail_out_of_bounds: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = wuffs_base__error__out_of_bounds; ++ ret.value = 0; ++ return ret; ++ } while (0); ++} + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++// -------- + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++// wuffs_base__render_number__first_hundred contains the decimal encodings of ++// the first one hundred numbers [0 ..= 99]. ++static const uint8_t wuffs_base__render_number__first_hundred[200] = { ++ '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', // ++ '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', // ++ '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', // ++ '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', // ++ '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', // ++ '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', // ++ '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', // ++ '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', // ++ '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', // ++ '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', // ++ '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', // ++ '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', // ++ '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', // ++ '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', // ++ '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', // ++ '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', // ++ '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', // ++ '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', // ++ '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', // ++ '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', // ++}; + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++static size_t // ++wuffs_private_impl__render_number_u64(wuffs_base__slice_u8 dst, ++ uint64_t x, ++ uint32_t options, ++ bool neg) { ++ uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL]; ++ uint8_t* ptr = &buf[0] + sizeof(buf); + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ while (x >= 100) { ++ size_t index = ((size_t)((x % 100) * 2)); ++ x /= 100; ++ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; ++ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; ++ ptr -= 2; ++ ptr[0] = s0; ++ ptr[1] = s1; + } + +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ if (x < 10) { ++ ptr -= 1; ++ ptr[0] = (uint8_t)('0' + x); ++ } else { ++ size_t index = ((size_t)(x * 2)); ++ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; ++ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; ++ ptr -= 2; ++ ptr[0] = s0; ++ ptr[1] = s1; ++ } + +- // TODO: unroll. ++ if (neg) { ++ ptr -= 1; ++ ptr[0] = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ ptr -= 1; ++ ptr[0] = '+'; ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0])); ++ if (n > dst.len) { ++ return 0; ++ } ++ memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? (dst.len - n) ++ : 0), ++ ptr, n); ++ return n; ++} + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, ++ int64_t x, ++ uint32_t options) { ++ uint64_t u = (uint64_t)x; ++ bool neg = x < 0; ++ if (neg) { ++ u = 1 + ~u; + } ++ return wuffs_private_impl__render_number_u64(dst, u, options, neg); ++} + +- return len; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, ++ uint64_t x, ++ uint32_t options) { ++ return wuffs_private_impl__render_number_u64(dst, x, options, false); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ---------------- Base-16 + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t src_len2 = src.len / 2; ++ size_t len; ++ if (dst.len < src_len2) { ++ len = dst.len; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src_len2; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else if (src.len & 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ while (n--) { ++ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) | ++ (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F)); ++ d += 1; ++ s += 2; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ o.num_dst = len; ++ o.num_src = len * 2; ++ return o; ++} + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t src_len4 = src.len / 4; ++ size_t len = dst.len < src_len4 ? dst.len : src_len4; ++ if (dst.len < src_len4) { ++ len = dst.len; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src_len4; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else if (src.len & 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) | ++ (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F)); ++ d += 1; ++ s += 4; + } + +- return len; ++ o.num_dst = len; ++ o.num_src = len * 4; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t dst_len2 = dst.len / 2; ++ size_t len; ++ if (dst_len2 < src.len) { ++ len = dst_len2; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src.len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- uint32_t y5 = s[0] >> 3; +- uint32_t y6 = s[0] >> 2; +- uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ uint8_t c = *s; ++ d[0] = wuffs_private_impl__encode_base16[c >> 4]; ++ d[1] = wuffs_private_impl__encode_base16[c & 0x0F]; ++ d += 2; ++ s += 1; + } + +- return len; ++ o.num_dst = len * 2; ++ o.num_src = len; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t dst_len4 = dst.len / 4; ++ size_t len; ++ if (dst_len4 < src.len) { ++ len = dst_len4; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src.len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- uint32_t y5 = s[0] >> 3; +- uint32_t y6 = s[0] >> 2; +- uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 2; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ uint8_t c = *s; ++ d[0] = '\\'; ++ d[1] = 'x'; ++ d[2] = wuffs_private_impl__encode_base16[c >> 4]; ++ d[3] = wuffs_private_impl__encode_base16[c & 0x0F]; ++ d += 4; ++ s += 1; + } + +- return len; ++ o.num_dst = len * 4; ++ o.num_src = len; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ---------------- Base-64 + +- const size_t loop_unroll_count = 4; ++// The two base-64 alphabets, std and url, differ only in the last two codes. ++// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ++// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + +- while (n >= loop_unroll_count) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); ++static const uint8_t wuffs_base__base_64__decode_std[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. ++ 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. ++ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 2; +- n -= loop_unroll_count; +- } ++ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. ++ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. ++ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. ++ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F. ++ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. ++ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. ++ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. ++ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- return len; +-} ++static const uint8_t wuffs_base__base_64__decode_url[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. ++ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. ++ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. ++ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. ++ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F. ++ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. ++ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. ++ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. ++ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + +- // TODO: unroll. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2))); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0))); ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++static const uint8_t wuffs_base__base_64__encode_std[64] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. ++ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. ++ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. ++ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. ++ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. ++ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. ++ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F. ++}; + +- return len; +-} ++static const uint8_t wuffs_base__base_64__encode_url[64] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. ++ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. ++ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. ++ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. ++ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. ++ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. ++ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F. ++}; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) ++ ? wuffs_base__base_64__decode_url ++ : wuffs_base__base_64__decode_std; ++ wuffs_base__transform__output o; ++ uint8_t* d_ptr = dst.ptr; ++ size_t d_len = dst.len; ++ const uint8_t* s_ptr = src.ptr; ++ size_t s_len = src.len; ++ bool pad = false; + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0); +- } ++ while (s_len >= 4) { ++ uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ uint32_t s2 = alphabet[0xFF & (s >> 16)]; ++ uint32_t s3 = alphabet[0xFF & (s >> 24)]; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++ if (((s0 | s1 | s2 | s3) & 0xC0) != 0) { ++ if (s_len > 4) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } else if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) && ++ (s_ptr[3] == '=')) { ++ pad = true; ++ if (s_ptr[2] == '=') { ++ goto src2; ++ } ++ goto src3; ++ } ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } + +- return len; +-} ++ if (d_len < 3) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } + +-// -------- ++ s_ptr += 4; ++ s_len -= 4; ++ s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ *d_ptr++ = (uint8_t)(s >> 8); ++ *d_ptr++ = (uint8_t)(s >> 0); ++ d_len -= 3; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } + +- // TODO: unroll. ++ if (s_len == 0) { ++ o.status.repr = NULL; ++ goto done; ++ } else if (s_len == 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } else if (s_len == 2) { ++ goto src2; ++ } + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++src3: ++ do { ++ uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ uint32_t s2 = alphabet[0xFF & (s >> 16)]; ++ if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } ++ if (d_len < 2) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ s_ptr += pad ? 4 : 3; ++ s = (s0 << 18) | (s1 << 12) | (s2 << 6); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ *d_ptr++ = (uint8_t)(s >> 8); ++ o.status.repr = NULL; ++ goto done; ++ } while (0); + +- s += 1 * 2; +- d += 1 * 3; +- n -= 1; +- } ++src2: ++ do { ++ uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ if ((s0 & 0xC0) || (s1 & 0xCF)) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } ++ if (d_len < 1) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ s_ptr += pad ? 4 : 2; ++ s = (s0 << 18) | (s1 << 12); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ o.status.repr = NULL; ++ goto done; ++ } while (0); + +- return len; ++done: ++ o.num_dst = (size_t)(d_ptr - dst.ptr); ++ o.num_src = (size_t)(s_ptr - src.ptr); ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) ++ ? wuffs_base__base_64__encode_url ++ : wuffs_base__base_64__encode_std; ++ wuffs_base__transform__output o; ++ uint8_t* d_ptr = dst.ptr; ++ size_t d_len = dst.len; ++ const uint8_t* s_ptr = src.ptr; ++ size_t s_len = src.len; + +- // TODO: unroll. ++ do { ++ while (s_len >= 3) { ++ if (d_len < 4) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr); ++ s_ptr += 3; ++ s_len -= 3; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 6)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 0)]; ++ d_len -= 4; ++ } + +- while (n >= 1) { +- uint32_t s0 = +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++ if (s_len == 2) { ++ if (d_len < ++ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr))) ++ << 8; ++ s_ptr += 2; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 6)]; ++ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { ++ *d_ptr++ = '='; ++ } ++ o.status.repr = NULL; ++ goto done; + +- return len; +-} ++ } else if (s_len == 1) { ++ if (d_len < ++ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr))) ++ << 16; ++ s_ptr += 1; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { ++ *d_ptr++ = '='; ++ *d_ptr++ = '='; ++ } ++ o.status.repr = NULL; ++ goto done; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ } else { ++ o.status.repr = NULL; ++ goto done; ++ } ++ } while (0); + +- // TODO: unroll. ++done: ++ o.num_dst = (size_t)(d_ptr - dst.ptr); ++ o.num_src = (size_t)(s_ptr - src.ptr); ++ return o; ++} + +- while (n >= 1) { +- uint32_t s0 = +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +- return len; +-} ++// ---------------- Magic Numbers + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ICO doesn't start with a magic identifier. Instead, see if the opening bytes ++// are plausibly ICO. ++// ++// Callers should have already verified that (prefix_data.len >= 2) and the ++// first two bytes are 0x00. ++// ++// See: ++// - https://docs.fileformat.com/image/ico/ ++static int32_t // ++wuffs_base__magic_number_guess_fourcc__maybe_ico( ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // Allow-list for the Image Type field. ++ if (prefix_data.len < 4) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[3] != 0) { ++ return 0; ++ } ++ switch (prefix_data.ptr[2]) { ++ case 0x01: // ICO ++ case 0x02: // CUR ++ break; ++ default: ++ return 0; ++ } + +- // TODO: unroll. ++ // The Number Of Images should be positive. ++ if (prefix_data.len < 6) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) { ++ return 0; ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ // The first ICONDIRENTRY's fourth byte should be zero. ++ if (prefix_data.len < 10) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[9] != 0) { ++ return 0; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // TODO: have a separate FourCC for CUR? ++ return 0x49434F20; // 'ICO 'be ++} + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++// TGA doesn't start with a magic identifier. Instead, see if the opening bytes ++// are plausibly TGA. ++// ++// Callers should have already verified that (prefix_data.len >= 2) and the ++// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or ++// 0x01. ++// ++// See: ++// - https://docs.fileformat.com/image/tga/ ++// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf ++static int32_t // ++wuffs_base__magic_number_guess_fourcc__maybe_tga( ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // Allow-list for the Image Type field. ++ if (prefix_data.len < 3) { ++ return prefix_closed ? 0 : -1; ++ } ++ switch (prefix_data.ptr[2]) { ++ case 0x01: ++ case 0x02: ++ case 0x03: ++ case 0x09: ++ case 0x0A: ++ case 0x0B: ++ break; ++ default: ++ // TODO: 0x20 and 0x21 are invalid, according to the spec, but are ++ // apparently unofficial extensions. ++ return 0; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ // Allow-list for the Color Map Entry Size field (if the Color Map Type field ++ // is non-zero) or else all the Color Map fields should be zero. ++ if (prefix_data.len < 8) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[1] != 0x00) { ++ switch (prefix_data.ptr[7]) { ++ case 0x0F: ++ case 0x10: ++ case 0x18: ++ case 0x20: ++ break; ++ default: ++ return 0; ++ } ++ } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] | ++ prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) { ++ return 0; ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ // Allow-list for the Pixel Depth field. ++ if (prefix_data.len < 17) { ++ return prefix_closed ? 0 : -1; ++ } ++ switch (prefix_data.ptr[16]) { ++ case 0x01: ++ case 0x08: ++ case 0x0F: ++ case 0x10: ++ case 0x18: ++ case 0x20: ++ break; ++ default: ++ return 0; + } + +- return len; ++ return 0x54474120; // 'TGA 'be + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++WUFFS_BASE__MAYBE_STATIC int32_t // ++wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // This is similar to (but different from): ++ // - the magic/Magdir tables under https://github.com/file/file ++ // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/ + +- // TODO: unroll. ++ // table holds the 'magic numbers' (which are actually variable length ++ // strings). The strings may contain NUL bytes, so the "const char* magic" ++ // value starts with the length-minus-1 of the 'magic number'. ++ // ++ // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer ++ // matches) and finally by magic[2:]. When multiple entries match, the ++ // longest one wins. ++ // ++ // The fourcc field might be negated, in which case there's further ++ // specialization (see § below). ++ static struct { ++ int32_t fourcc; ++ const char* magic; ++ } table[] = { ++ {-0x30302020, "\x01\x00\x00"}, // '00 'be ++ {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ ++ {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD ++ {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 ++ {+0x424D5020, "\x01\x42\x4D"}, // BMP ++ {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF ++ {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) ++ {+0x4C5A4950, "\x04\x4C\x5A\x49\x50\x01"}, // LZIP ++ {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian) ++ {+0x4E50424D, "\x02\x50\x35\x0A"}, // NPBM (P5; *.pgm) ++ {+0x4E50424D, "\x02\x50\x36\x0A"}, // NPBM (P6; *.ppm) ++ {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF ++ {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"}, // LZMA ++ {+0x4C5A4D41, "\x02\x5D\x00\x00"}, // LZMA ++ {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE ++ {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI ++ {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB ++ {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG ++ {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"}, // XZ ++ {+0x4A504547, "\x01\xFF\xD8"}, // JPEG ++ }; ++ static const size_t table_len = sizeof(table) / sizeof(table[0]); + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ if (prefix_data.len == 0) { ++ return prefix_closed ? 0 : -1; ++ } ++ uint8_t pre_first_byte = prefix_data.ptr[0]; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ int32_t fourcc = 0; ++ size_t i; ++ for (i = 0; i < table_len; i++) { ++ uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1])); ++ if (pre_first_byte < mag_first_byte) { ++ break; ++ } else if (pre_first_byte > mag_first_byte) { ++ continue; ++ } ++ fourcc = table[i].fourcc; + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0])); ++ if (mag_remaining_len == 0) { ++ goto match; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ const char* mag_remaining_ptr = table[i].magic + 2; ++ uint8_t* pre_remaining_ptr = prefix_data.ptr + 1; ++ size_t pre_remaining_len = prefix_data.len - 1; ++ if (pre_remaining_len < mag_remaining_len) { ++ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) { ++ return prefix_closed ? 0 : -1; ++ } ++ } else { ++ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) { ++ goto match; ++ } ++ } ++ } + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; ++ if (prefix_data.len < 2) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) { ++ return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data, ++ prefix_closed); + } + +- return len; +-} ++ return 0; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++match: ++ // Negative FourCC values (see § above) are further specialized. ++ if (fourcc < 0) { ++ fourcc = -fourcc; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s1; +- d[2] = s2; ++ if (fourcc == 0x52494646) { // 'RIFF'be ++ if (prefix_data.len < 12) { ++ return prefix_closed ? 0 : -1; ++ } ++ uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8); ++ if (x == 0x57454250) { // 'WEBP'be ++ return 0x57454250; // 'WEBP'be ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ } else if (fourcc == 0x30302020) { // '00 'be ++ // Binary data starting with multiple 0x00 NUL bytes is quite common. ++ // Unfortunately, some file formats also don't start with a magic ++ // identifier, so we have to use heuristics (where the order matters, the ++ // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe ++ // it's TGA, ICO/CUR, etc. Maybe it's something else. ++ int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga( ++ prefix_data, prefix_closed); ++ if (tga != 0) { ++ return tga; ++ } ++ int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico( ++ prefix_data, prefix_closed); ++ if (ico != 0) { ++ return ico; ++ } ++ if (prefix_data.len < 4) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[2] != 0x00) && ++ ((prefix_data.ptr[2] >= 0x80) || ++ (prefix_data.ptr[3] != 0x00))) { ++ // Roughly speaking, this could be a non-degenerate (non-0-width and ++ // non-0-height) WBMP image. ++ return 0x57424D50; // 'WBMP'be ++ } ++ return 0; ++ } + } +- +- return len; ++ return fourcc; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++// ---------------- Pixel Swizzler + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + +- return len; +-} ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++// -------- + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++static inline uint32_t // ++wuffs_private_impl__swap_u32_argb_abgr(uint32_t u) { ++ uint32_t o = u & 0xFF00FF00ul; ++ uint32_t r = u & 0x00FF0000ul; ++ uint32_t b = u & 0x000000FFul; ++ return o | (r >> 16) | (b << 16); ++} + +- return len; ++static inline uint64_t // ++wuffs_private_impl__swap_u64_argb_abgr(uint64_t u) { ++ uint64_t o = u & 0xFFFF0000FFFF0000ull; ++ uint64_t r = u & 0x0000FFFF00000000ull; ++ uint64_t b = u & 0x000000000000FFFFull; ++ return o | (r >> 32) | (b << 32); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) { ++ uint32_t a = ((uint32_t)(0xFF & (c >> 56))); ++ uint32_t r = ((uint32_t)(0xFF & (c >> 40))); ++ uint32_t g = ((uint32_t)(0xFF & (c >> 24))); ++ uint32_t b = ((uint32_t)(0xFF & (c >> 8))); ++ return (a << 24) | (b << 16) | (g << 8) | (r << 0); ++} + +- // TODO: unroll. ++// -------- + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // ++wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, ++ uint32_t x, ++ uint32_t y) { ++ if (!pb || (x >= pb->pixcfg.private_impl.width) || ++ (y >= pb->pixcfg.private_impl.height)) { ++ return 0; ++ } + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return 0; + } + +- return len; +-} ++ size_t stride = pb->private_impl.planes[0].stride; ++ const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + +- // TODO: unroll. ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { ++ uint8_t* palette = pb->private_impl.planes[3].ptr; ++ return wuffs_base__peek_u32le__no_bounds_check(palette + ++ (4 * ((size_t)row[x]))); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ // Common formats above. Rarer formats below. + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x]))); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1]))); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0]))); ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ (((uint32_t)(row[(2 * x) + 1])) << 24) | ++ (((uint32_t)(row[(2 * x) + 0])) * 0x00010101)); + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: { ++ uint8_t* palette = pb->private_impl.planes[3].ptr; ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(palette + ++ (4 * ((size_t)row[x])))); ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return 0xFF000000 | ++ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return 0xFF000000 | ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ 0xFF000000 | ++ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(row + ++ (4 * ((size_t)x))))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ 0xFF000000 | ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ ++ default: ++ // TODO: support more formats. ++ break; + } + +- return len; ++ return 0; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_buffer__set_color_u32_at( ++ wuffs_base__pixel_buffer* pb, ++ uint32_t x, ++ uint32_t y, ++ wuffs_base__color_u32_argb_premul color) { ++ if (!pb) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if ((x >= pb->pixcfg.private_impl.width) || ++ (y >= pb->pixcfg.private_impl.height)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color); ++ break; + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ // Common formats above. Rarer formats below. + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ wuffs_base__poke_u8__no_bounds_check( ++ row + ((size_t)x), ++ wuffs_base__color_u32_argb_premul__as__color_u8_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ wuffs_base__poke_u16be__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul( ++ color)); ++ break; + +- return len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ wuffs_base__poke_u8__no_bounds_check( ++ row + ((size_t)x), wuffs_base__pixel_palette__closest_element( ++ wuffs_base__pixel_buffer__palette(pb), ++ pb->pixcfg.private_impl.pixfmt, color)); ++ break; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ wuffs_base__poke_u64le__no_bounds_check( ++ row + (8 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( ++ color)); ++ break; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ wuffs_base__poke_u24le__no_bounds_check( ++ row + (3 * ((size_t)x)), ++ wuffs_private_impl__swap_u32_argb_abgr(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr(color))); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_private_impl__swap_u32_argb_abgr(color)); ++ break; + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ default: ++ // TODO: support more formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +- return len; ++ return wuffs_base__make_status(NULL); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint16_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u16le__no_bounds_check(ptr, color); ++ ptr += 2; ++ } ++ return; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (2 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u16le__no_bounds_check(ptr, color); ++ ptr += 2; ++ } ++ } ++} + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint32_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u24le__no_bounds_check(ptr, color); ++ ptr += 3; ++ } ++ return; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (3 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u24le__no_bounds_check(ptr, color); ++ ptr += 3; ++ } ++ } ++} + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint32_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u32le__no_bounds_check(ptr, color); ++ ptr += 4; ++ } ++ return; + } + +- return len; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (4 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u32le__no_bounds_check(ptr, color); ++ ptr += 4; ++ } ++ } + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgbx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint64_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u64le__no_bounds_check(ptr, color); ++ ptr += 8; ++ } ++ return; ++ } + +- // TODO: unroll. ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (8 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u64le__no_bounds_check(ptr, color); ++ ptr += 8; ++ } ++ } ++} + +- while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_buffer__set_color_u32_fill_rect( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ wuffs_base__color_u32_argb_premul color) { ++ if (!pb) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) { ++ return wuffs_base__make_status(NULL); ++ } ++ wuffs_base__rect_ie_u32 bounds = ++ wuffs_base__pixel_config__bounds(&pb->pixcfg); ++ if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +- return len; +-} ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, ++ color); ++ return wuffs_base__make_status(NULL); + +-// -------- ++ // Common formats above. Rarer formats below. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); ++ return wuffs_base__make_status(NULL); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, ++ color); ++ return wuffs_base__make_status(NULL); + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ color)); ++ return wuffs_base__make_status(NULL); + +- return len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( ++ color)); ++ return wuffs_base__make_status(NULL); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr(color))); ++ return wuffs_base__make_status(NULL); + +- size_t n = len; +- while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u64__as__color_u32( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, wuffs_private_impl__swap_u32_argb_abgr(color)); ++ return wuffs_base__make_status(NULL); ++ } + +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint32_t x; ++ for (x = rect.min_incl_x; x < rect.max_excl_x; x++) { ++ wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color); ++ } + } +- return len; ++ return wuffs_base__make_status(NULL); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); ++// -------- + +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++WUFFS_BASE__MAYBE_STATIC uint8_t // ++wuffs_base__pixel_palette__closest_element( ++ wuffs_base__slice_u8 palette_slice, ++ wuffs_base__pixel_format palette_format, ++ wuffs_base__color_u32_argb_premul c) { ++ size_t n = palette_slice.len / 4; ++ if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4); + } ++ size_t best_index = 0; ++ uint64_t best_score = 0xFFFFFFFFFFFFFFFF; + +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Work in 16-bit color. ++ uint32_t ca = 0x101 * (0xFF & (c >> 24)); ++ uint32_t cr = 0x101 * (0xFF & (c >> 16)); ++ uint32_t cg = 0x101 * (0xFF & (c >> 8)); ++ uint32_t cb = 0x101 * (0xFF & (c >> 0)); + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); ++ switch (palette_format.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { ++ bool nonpremul = palette_format.repr == ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ size_t i; ++ for (i = 0; i < n; i++) { ++ // Work in 16-bit color. ++ uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0])); ++ uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1])); ++ uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2])); ++ uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3])); ++ ++ // Convert to premultiplied alpha. ++ if (nonpremul && (pa != 0xFFFF)) { ++ pb = (pb * pa) / 0xFFFF; ++ pg = (pg * pa) / 0xFFFF; ++ pr = (pr * pa) / 0xFFFF; ++ } ++ ++ // These deltas are conceptually int32_t (signed) but after squaring, ++ // it's equivalent to work in uint32_t (unsigned). ++ pb -= cb; ++ pg -= cg; ++ pr -= cr; ++ pa -= ca; ++ uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) + ++ ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa)); ++ if (best_score > score) { ++ best_score = score; ++ best_index = i; ++ } ++ } ++ break; ++ } + } + +- return len; ++ return (uint8_t)best_index; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); ++static inline uint32_t // ++wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx( ++ uint32_t dst_nonpremul, ++ uint32_t src_nonpremul) { ++ // Extract 16-bit color components. ++ // ++ // If the destination is transparent then SRC_OVER is equivalent to SRC: just ++ // return src_nonpremul. This isn't just an optimization (skipping the rest ++ // of the function's computation). It also preserves the nonpremul ++ // distinction between e.g. transparent red and transparent blue that would ++ // otherwise be lost by converting from nonpremul to premul and back. ++ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); ++ if (da == 0) { ++ return src_nonpremul; ++ } ++ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; ++static inline uint64_t // ++wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx( ++ uint64_t dst_nonpremul, ++ uint64_t src_nonpremul) { ++ // Extract components. ++ // ++ // If the destination is transparent then SRC_OVER is equivalent to SRC: just ++ // return src_nonpremul. This isn't just an optimization (skipping the rest ++ // of the function's computation). It also preserves the nonpremul ++ // distinction between e.g. transparent red and transparent blue that would ++ // otherwise be lost by converting from nonpremul to premul and back. ++ uint64_t da = 0xFFFF & (dst_nonpremul >> 48); ++ if (da == 0) { ++ return src_nonpremul; + } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); ++ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); ++ uint64_t db = 0xFFFF & (dst_nonpremul >> 0); ++ uint64_t sa = 0xFFFF & (src_nonpremul >> 48); ++ uint64_t sr = 0xFFFF & (src_nonpremul >> 32); ++ uint64_t sg = 0xFFFF & (src_nonpremul >> 16); ++ uint64_t sb = 0xFFFF & (src_nonpremul >> 0); + +- // TODO: unroll. ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; + +- s += 1 * 1; +- d += 1 * 4; +- n -= 1; ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul, ++ uint32_t src_premul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint64_t // ++wuffs_private_impl__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul, ++ uint64_t src_premul) { ++ // Extract components. ++ uint64_t da = 0xFFFF & (dst_nonpremul >> 48); ++ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); ++ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); ++ uint64_t db = 0xFFFF & (dst_nonpremul >> 0); ++ uint64_t sa = 0xFFFF & (src_premul >> 48); ++ uint64_t sr = 0xFFFF & (src_premul >> 32); ++ uint64_t sg = 0xFFFF & (src_premul >> 16); ++ uint64_t sb = 0xFFFF & (src_premul >> 0); + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__composite_premul_nonpremul_u32_axxx( ++ uint32_t dst_premul, ++ uint32_t src_nonpremul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; +- } ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); ++} ++ ++static inline uint64_t // ++wuffs_private_impl__composite_premul_nonpremul_u64_axxx( ++ uint64_t dst_premul, ++ uint64_t src_nonpremul) { ++ // Extract components. ++ uint64_t da = 0xFFFF & (dst_premul >> 48); ++ uint64_t dr = 0xFFFF & (dst_premul >> 32); ++ uint64_t dg = 0xFFFF & (dst_premul >> 16); ++ uint64_t db = 0xFFFF & (dst_premul >> 0); ++ uint64_t sa = 0xFFFF & (src_nonpremul >> 48); ++ uint64_t sr = 0xFFFF & (src_nonpremul >> 32); ++ uint64_t sg = 0xFFFF & (src_nonpremul >> 16); ++ uint64_t sb = 0xFFFF & (src_nonpremul >> 0); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++} ++ ++static inline uint32_t // ++wuffs_private_impl__composite_premul_premul_u32_axxx(uint32_t dst_premul, ++ uint32_t src_premul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + + // -------- + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(uint8_t* dst_ptr, ++ size_t dst_len, ++ const uint8_t* src_ptr, ++ size_t src_len, ++ bool nonpremul) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = s3; +- d[7] = s3; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s); ++ if (nonpremul) { ++ argb = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb); ++ } ++ uint32_t b5 = 0x1F & (argb >> (8 - 5)); ++ uint32_t g6 = 0x3F & (argb >> (16 - 6)); ++ uint32_t r5 = 0x1F & (argb >> (24 - 5)); ++ uint32_t alpha = argb & 0xFF000000; ++ wuffs_base__poke_u32le__no_bounds_check( ++ d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0)); ++ s += 4; ++ d += 4; + } + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_swap_rgb_bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ s += 3; ++ d += 3; + } + return len; + } + ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- s += 1 * 8; +- d += 1 * 8; +- n -= 1; ++ __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, // ++ +0x0B, +0x08, +0x09, +0x0A, // ++ +0x07, +0x04, +0x05, +0x06, // ++ +0x03, +0x00, +0x01, +0x02); ++ ++ while (n >= 4) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ _mm_storeu_si128((__m128i*)(void*)d, x); ++ ++ s += 4 * 4; ++ d += 4 * 4; ++ n -= 4; ++ } ++ ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ d[3] = s3; ++ s += 4; ++ d += 4; + } + return len; + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ d[3] = s3; ++ s += 4; ++ d += 4; + } + return len; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); ++// -------- + +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++static uint64_t // ++wuffs_private_impl__swizzle_copy_1_1(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len) ? dst_len : src_len; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len); + } + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; ++wuffs_private_impl__swizzle_copy_2_2(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 2); + } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); ++ return len; ++} + +- s += 1 * 1; +- d += 1 * 8; +- n -= 1; ++static uint64_t // ++wuffs_private_impl__swizzle_copy_3_3(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 3); + } +- + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_copy_4_4(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s2; +- d[2] = s1; +- d[3] = s1; +- d[4] = s0; +- d[5] = s0; +- d[6] = s3; +- d[7] = s3; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 4); + } + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_copy_8_8(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = +- wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 8); + } + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); +- wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); ++ uint32_t b5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t r5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 4; +- d += 1 * 8; ++ s += 1 * 3; ++ d += 1 * 2; + n -= 1; + } ++ + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr_565__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = +- wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); ++ uint32_t b5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t r5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 4; +- d += 1 * 8; ++ d += 1 * 2; + n -= 1; + } ++ + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22217,13 +23221,14 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + // TODO: unroll. + + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22231,16 +23236,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22248,13 +23253,14 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( + // TODO: unroll. + + while (n >= 1) { +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))))); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22262,16 +23268,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22279,13 +23285,38 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22293,16 +23324,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22310,16 +23341,38 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); ++ // Extract 16-bit color components. ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22327,16 +23380,15 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++wuffs_private_impl__swizzle_bgr_565__bgra_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22344,13 +23396,12 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22358,19 +23409,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22378,14 +23426,38 @@ wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 1; +- d += 1 * 4; ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22393,16 +23465,15 @@ wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22410,14 +23481,14 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + // TODO: unroll. + + while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ uint32_t r5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t b5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 4; +- d += 1 * 4; ++ s += 1 * 3; ++ d += 1 * 2; + n -= 1; + } + +@@ -22425,16 +23496,16 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22442,14 +23513,15 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22457,16 +23529,16 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22474,32 +23546,54 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src( + // TODO: unroll. + + while (n >= 1) { +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- s0))); +- +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 4; ++ d += 1 * 2; ++ n -= 1; + } + + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++wuffs_private_impl__swizzle_bgr_565__rgba_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22507,17 +23601,14 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__swap_u64_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + +- s += 1 * 8; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22525,47 +23616,70 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over( ++wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22573,12 +23687,13 @@ wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3))); ++ uint32_t y5 = (uint32_t)(s[0] >> 3); ++ uint32_t y6 = (uint32_t)(s[0] >> 2); ++ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 3; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + +@@ -22586,15 +23701,15 @@ wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++wuffs_private_impl__swizzle_bgr_565__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22602,12 +23717,13 @@ wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))); ++ uint32_t y5 = (uint32_t)(s[0] >> 3); ++ uint32_t y6 = (uint32_t)(s[0] >> 2); ++ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 2; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22615,15 +23731,15 @@ wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22631,100 +23747,121 @@ wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); + +- s += 1 * 4; +- d += 1 * 4; ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ s0))); ++ ++ s += 1 * 2; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, // +- +0x00, +0x06, +0x07, +0x08, // +- +0x00, +0x03, +0x04, +0x05, // +- +0x00, +0x00, +0x01, +0x02); +- __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00); ++ // TODO: unroll. + +- while (n >= 6) { +- __m128i x; +- x = _mm_lddqu_si128((const __m128i*)(const void*)s); +- x = _mm_shuffle_epi8(x, shuffle); +- x = _mm_or_si128(x, or_ff); +- _mm_storeu_si128((__m128i*)(void*)d, x); ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[1]); ++ uint32_t sy = 0x101 * ((uint32_t)s[0]); + +- s += 4 * 3; +- d += 4 * 4; +- n -= 4; +- } ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; + +- while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += 1 * 3; +- d += 1 * 4; ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sy * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sy * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sy * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 2; ++ d += 1 * 2; + n -= 1; + } + + return len; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ const size_t loop_unroll_count = 4; ++ ++ while (n >= loop_unroll_count) { ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); ++ ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 2; ++ n -= loop_unroll_count; ++ } ++ + while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); + +- s += 1 * 3; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + +@@ -22732,15 +23869,19 @@ wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22748,82 +23889,83 @@ wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2))); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0))); + +- s += 1 * 4; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = 0xFF; +- d[7] = 0xFF; ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0); ++ } + +- s += 1 * 3; +- d += 1 * 8; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 2; +- d += 1 * 8; ++ d += 1 * 3; + n -= 1; + } + +@@ -22831,87 +23973,46 @@ wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = 0xFF; +- d[7] = 0xFF; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; +- } +- +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // TODO: unroll. + + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s2; +- d[2] = s1; +- d[3] = s1; +- d[4] = s0; +- d[5] = s0; +- d[6] = 0xFF; +- d[7] = 0xFF; ++ uint32_t s0 = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 3; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22919,13 +24020,12 @@ wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint32_t s0 = ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 2; ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -22933,154 +24033,200 @@ wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 8; +- d += 1 * 4; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } ++ + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over( ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len3 = dst_len / 3; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__swap_u64_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgbw__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++wuffs_private_impl__swizzle_bgr__bgra_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s1; ++ d[2] = s2; + +- s += 1 * 2; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } ++wuffs_private_impl__swizzle_bgr__bgra_premul__src_over(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- // The comparison in the while condition is ">", not ">=", because with +- // ">=", the last 4-byte store could write past the end of the dst slice. +- // +- // Each 4-byte store writes one too many bytes, but a subsequent store +- // will overwrite that with the correct byte. There is always another +- // store, whether a 4-byte store in this loop or a 1-byte store in the +- // next loop. +- while (n > loop_unroll_count) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 3; +- n -= loop_unroll_count; ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; ++ d += 1 * 3; ++ n -= 1; + } + ++ return len; ++} ++ ++static uint64_t // ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23089,19 +24235,16 @@ wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -23109,14 +24252,12 @@ wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = +- wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 1; ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -23125,60 +24266,46 @@ wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; ++ // TODO: unroll. + +- while (n >= loop_unroll_count) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); +- } +- uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[1] * 4)); +- if (s1) { +- wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1); +- } +- uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[2] * 4)); +- if (s2) { +- wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2); +- } +- uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[3] * 4)); +- if (s3) { +- wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3); +- } ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 3; +- n -= loop_unroll_count; +- } ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); +- } ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; + +- s += 1 * 1; ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23187,15 +24314,16 @@ wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -23203,10 +24331,29 @@ wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); + +- s += 1 * 4; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -23215,27 +24362,28 @@ wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { + uint8_t s0 = s[0]; +- d[0] = s0; +- d[1] = s0; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s1; + d[2] = s0; + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23244,28 +24392,43 @@ wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_premul__src_over(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { +- uint8_t s0 = s[0]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s0; ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 2; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23273,114 +24436,63 @@ wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++wuffs_private_impl__swizzle_bgr__rgbx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; +- +- while (n >= loop_unroll_count) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); +- +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 4; +- n -= loop_unroll_count; +- } ++ // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; + +- s += 1 * 1; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; +- +- while (n >= loop_unroll_count) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); +- } +- uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[1] * 4)); +- if (s1) { +- wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1); +- } +- uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[2] * 4)); +- if (s2) { +- wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2); +- } +- uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[3] * 4)); +- if (s3) { +- wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3); +- } +- +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 4; +- n -= loop_unroll_count; +- } +- + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); +- } ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23388,75 +24500,88 @@ wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over( + return len; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; ++ + size_t n = len; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__color_u64__as__color_u32( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); + +- __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, // +- +0x02, +0x02, +0x02, +0x02, // +- +0x01, +0x01, +0x01, +0x01, // +- +0x00, +0x00, +0x00, +0x00); +- __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00); +- +- while (n >= 4) { +- __m128i x; +- x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s))); +- x = _mm_shuffle_epi8(x, shuffle); +- x = _mm_or_si128(x, or_ff); +- _mm_storeu_si128((__m128i*)(void*)d, x); +- +- s += 4 * 1; +- d += 4 * 4; +- n -= 4; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } ++ return len; ++} ++ ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + + while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, ++ s0))); + +- s += 1 * 1; ++ s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23465,24 +24590,28 @@ wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0)); + +- s += 1 * 2; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23490,33 +24619,36 @@ wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4)))); ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 1; +- d += 1 * 8; ++ d += 1 * 4; + n -= 1; + } + +@@ -23524,33 +24656,30 @@ wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0)); +- } ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + +- s += 1 * 1; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + +@@ -23558,24 +24687,29 @@ wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0])); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + +- s += 1 * 1; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + +@@ -23583,53 +24717,59 @@ wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- uint64_t s0 = +- ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0)); ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0)); + +- s += 1 * 2; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len < src_len2) ? dst_len : src_len2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- d[0] = s[0]; ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + + s += 1 * 2; +- d += 1 * 1; ++ d += 1 * 4; + n -= 1; + } + +@@ -23637,27 +24777,31 @@ wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; ++wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- d[0] = s1; +- d[1] = s0; ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 2; +- d += 1 * 2; ++ d += 1 * 4; + n -= 1; + } + +@@ -23667,6862 +24811,6000 @@ wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr, + // -------- + + static uint64_t // +-wuffs_base__pixel_swizzler__transparent_black_src( ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, +- uint64_t num_pixels, +- uint32_t dst_pixfmt_bytes_per_pixel) { +- uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; +- if (n > num_pixels) { +- n = num_pixels; ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = s3; ++ d[7] = s3; ++ ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel))); +- return n; ++ return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__transparent_black_src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, +- uint64_t num_pixels, +- uint32_t dst_pixfmt_bytes_per_pixel) { +- uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; +- if (n > num_pixels) { +- n = num_pixels; ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); ++ ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return n; ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__y(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return wuffs_base__pixel_swizzler__copy_1_1; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__y; ++ s += 1 * 8; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__xxx__y; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__xxxx__y__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__xxxx__y; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__xxxxxxxx__y; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__y_16be(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return wuffs_base__pixel_swizzler__y__y_16be; +- +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- return wuffs_base__pixel_swizzler__y_16le__y_16be; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- return wuffs_base__pixel_swizzler__copy_2_2; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__y_16be; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__xxx__y_16be; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__xxxx__y_16be; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__xxxxxxxx__y_16be; ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_1_1; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( +- dst_palette.ptr, dst_palette.len, src_palette.ptr, +- src_palette.len, true) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgr_565__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s2; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s0; ++ d[5] = s0; ++ d[6] = s3; ++ d[7] = s3; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_1_1; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( +- dst_palette.ptr, dst_palette.len, src_palette.ptr, +- src_palette.len, false) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgr_565( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__copy_2_2; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__bgr__bgr_565; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) | ++ ((uint64_t)(s[0]) * 0x0000010101010101); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__bgrw__bgr_565; ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__rgb__bgr_565; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) | ++ ((uint64_t)(s[0]) * 0x0000010101010101); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__rgbw__bgr_565; ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgr(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__bgr; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__copy_3_3; ++// -------- + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__bgrw__bgr; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__swap_rgb_bgr; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__bgrw__rgb; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; +- } +- return NULL; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_8_8; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over; +- } +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_premul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; +- } +- return NULL; ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; +- } +- return NULL; +- } +- return NULL; +-} ++ // TODO: unroll. + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgrx(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__bgrx; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__xxx__xxxx; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- return wuffs_base__pixel_swizzler__bgrw__bgrx; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__copy_4_4; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__bgr__rgbx; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__bgrw__rgbx; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgb(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__rgb; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__swap_rgb_bgr; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__bgrw__rgb; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__rgb; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__copy_3_3; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__bgrw__bgr; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} +- +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over; +- } +- return NULL; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgba_premul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over; +- } +- return NULL; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__pixel_format src_pixfmt, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- if (!p) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- p->private_impl.func = NULL; +- p->private_impl.transparent_black_func = NULL; +- p->private_impl.dst_pixfmt_bytes_per_pixel = 0; +- p->private_impl.src_pixfmt_bytes_per_pixel = 0; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- wuffs_base__pixel_swizzler__func func = NULL; +- wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func = +- NULL; ++ // TODO: unroll. + +- uint32_t dst_pixfmt_bits_per_pixel = +- wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt); +- if ((dst_pixfmt_bits_per_pixel == 0) || +- ((dst_pixfmt_bits_per_pixel & 7) != 0)) { +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3))); + +- uint32_t src_pixfmt_bits_per_pixel = +- wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt); +- if ((src_pixfmt_bits_per_pixel == 0) || +- ((src_pixfmt_bits_per_pixel & 7) != 0)) { +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; + } + +- // TODO: support many more formats. +- +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- transparent_black_func = +- wuffs_base__pixel_swizzler__transparent_black_src; +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- transparent_black_func = +- wuffs_base__pixel_swizzler__transparent_black_src_over; +- break; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- switch (src_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- func = wuffs_base__pixel_swizzler__prepare__y(p, dst_pixfmt, dst_palette, +- src_palette, blend); +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- func = wuffs_base__pixel_swizzler__prepare__y_16be( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))); + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- func = wuffs_base__pixel_swizzler__prepare__bgr_565( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- func = wuffs_base__pixel_swizzler__prepare__bgr( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- func = wuffs_base__pixel_swizzler__prepare__bgra_premul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- func = wuffs_base__pixel_swizzler__prepare__bgrx( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- func = wuffs_base__pixel_swizzler__prepare__rgb( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ __m128i shuffle = _mm_set_epi8(+0x00, +0x0B, +0x0A, +0x09, // ++ +0x00, +0x08, +0x07, +0x06, // ++ +0x00, +0x05, +0x04, +0x03, // ++ +0x00, +0x02, +0x01, +0x00); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 6) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- func = wuffs_base__pixel_swizzler__prepare__rgba_premul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 4 * 3; ++ d += 4 * 4; ++ n -= 4; + } + +- p->private_impl.func = func; +- p->private_impl.transparent_black_func = transparent_black_func; +- p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8; +- p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8; +- return wuffs_base__make_status( +- func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option); +-} ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b0; ++ d[1] = b1; ++ d[2] = b2; ++ d[3] = 0xFF; + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- uint32_t up_to_num_pixels, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- if (p && p->private_impl.func) { +- const uint8_t* iop_r = *ptr_iop_r; +- uint64_t src_len = wuffs_base__u64__min( +- ((uint64_t)up_to_num_pixels) * +- ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel), +- ((uint64_t)(io2_r - iop_r))); +- uint64_t n = +- (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, iop_r, (size_t)src_len); +- *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; +- return n; ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; + } +- return 0; +-} + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- if (p && p->private_impl.func) { +- const uint8_t* iop_r = *ptr_iop_r; +- uint64_t src_len = ((uint64_t)(io2_r - iop_r)); +- uint64_t n = +- (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, iop_r, (size_t)src_len); +- *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; +- return n; +- } +- return 0; ++ return len; + } + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src) { +- if (p && p->private_impl.func) { +- return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, src.ptr, src.len); +- } +- return 0; +-} ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- uint64_t num_pixels) { +- if (p && p->private_impl.transparent_black_func) { +- return (*p->private_impl.transparent_black_func)( +- dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels, +- p->private_impl.dst_pixfmt_bytes_per_pixel); ++ __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, // ++ +0x00, +0x06, +0x07, +0x08, // ++ +0x00, +0x03, +0x04, +0x05, // ++ +0x00, +0x00, +0x01, +0x02); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); ++ ++ while (n >= 6) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); ++ ++ s += 4 * 3; ++ d += 4 * 4; ++ n -= 4; + } +- return 0; +-} + +-// -------- ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; ++ } + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++ return len; ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#if defined(__GNUC__) && !defined(__clang__) +-// No-op. +-#else +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column); +-#endif +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// -------- ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-static inline uint32_t // +-wuffs_base__u32__max_of_4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { +- return wuffs_base__u32__max( // +- wuffs_base__u32__max(a, b), // +- wuffs_base__u32__max(c, d)); +-} ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; ++ } + +-static inline uint32_t // +-wuffs_base__u32__min_of_5(uint32_t a, +- uint32_t b, +- uint32_t c, +- uint32_t d, +- uint32_t e) { +- return wuffs_base__u32__min( // +- wuffs_base__u32__min( // +- wuffs_base__u32__min(a, b), // +- wuffs_base__u32__min(c, d)), // +- e); ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgbx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-typedef void (*wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func)( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3); ++ // TODO: unroll. + +-static void // +-wuffs_base__pixel_swizzler__swizzle_cmyk__convert_4_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3) { +- for (; x < x_end; x++) { +- // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's +- // RGBW: 0xFFu means no ink instead of full ink. Note that a double +- // inversion is a no-op, so inversions might be implicit in the code below. +- uint32_t r = ((uint32_t)(*up0++)); +- uint32_t g = ((uint32_t)(*up1++)); +- uint32_t b = ((uint32_t)(*up2++)); +- uint32_t w = ((uint32_t)(*up3++)); +- r = ((r * w) + 0x7Fu) / 0xFFu; +- g = ((g * w) + 0x7Fu) / 0xFFu; +- b = ((b * w) + 0x7Fu) / 0xFFu; +- wuffs_base__pixel_buffer__set_color_u32_at( +- dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); +- } +-} ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__convert_4_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3) { +- for (; x < x_end; x++) { +- // We invert once again: 0xFFu means no ink instead of full ink. +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- uint32_t r = 0xFFu - (0xFFu & (color >> 16u)); +- uint32_t g = 0xFFu - (0xFFu & (color >> 8u)); +- uint32_t b = 0xFFu - (0xFFu & (color >> 0u)); +- uint32_t w = ((uint32_t)(*up3++)); +- r = ((r * w) + 0x7Fu) / 0xFFu; +- g = ((g * w) + 0x7Fu) / 0xFFu; +- b = ((b * w) + 0x7Fu) / 0xFFu; +- wuffs_base__pixel_buffer__set_color_u32_at( +- dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } ++ ++ return len; + } + + // -------- + +-typedef void (*wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func)( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_rgb__convert_3_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- for (; x < x_end; x++) { +- uint32_t color = 0xFF000000u | // +- (((uint32_t)(*up0++)) << 16u) | // +- (((uint32_t)(*up1++)) << 8u) | // +- (((uint32_t)(*up2++)) << 0u); +- wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); +- } +-} ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = 0xFF; ++ d[7] = 0xFF; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ s += 1 * 3; ++ d += 1 * 8; ++ n -= 1; + } +-} +- +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); +- dst_iter += 4u; +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32_abgr( // +- *up0++, *up1++, *up2++); +- wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); +- dst_iter += 4u; ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; + } ++ ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upsamples to a +-// destination slice at least 480 (YCCK) or 672 (YCC) bytes long and whose +-// src_len (multiplied by 1, 2, 3 or 4) is positive but no more than that. This +-// 480 or 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice +-// length. Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048. +-// +-// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks +-// wide and each block is 8 pixels wide. We have: +-// 480 = 1 * 8 * 60, 672 = 1 * 8 * 84 +-// 480 = 2 * 8 * 30, 672 = 2 * 8 * 42 +-// 480 = 3 * 8 * 20, 672 = 3 * 8 * 28 +-// 480 = 4 * 8 * 15, 672 = 4 * 8 * 21 +-// +-// Box filters are equivalent to nearest neighbor upsampling. These ignore the +-// src_ptr_minor, h1v2_bias, first_column and last_column arguments. +-// +-// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2 +-// dimensions), which is higher quality (less blocky) but also higher +-// computational effort. +-// +-// In theory, we could use triangle filters for any (inv_h, inv_v) combination. +-// In practice, matching libjpeg-turbo, we only implement it for the common +-// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an +-// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2). +-typedef const uint8_t* ( +- *wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func)( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, // Nearest row. +- const uint8_t* src_ptr_minor, // Adjacent row, alternating above or below. +- size_t src_len, +- uint32_t h1v2_bias, +- bool first_column, +- bool last_column); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = 0xFF; ++ d[7] = 0xFF; + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- return src_ptr_major; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s2; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s0; ++ d[5] = s0; ++ d[6] = 0xFF; ++ d[7] = 0xFF; ++ ++ s += 1 * 3; ++ d += 1 * 8; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; ++// -------- ++ ++static uint64_t // ++wuffs_private_impl__swizzle_rgb__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ // TODO: unroll. ++ ++ while (n >= 1) { ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box( ++// -------- ++ ++static uint64_t // ++wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return dst_ptr; ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1v2_triangle( ++static uint64_t // ++wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; +- while (src_len--) { +- *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) + // +- (1u * ((uint32_t)(*sp_minor++))) + // +- h1v2_bias) >> +- 2u); ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, ++ s0))); ++ ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v1_triangle( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; ++// -------- + +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- return dst_ptr; +- } +- uint32_t svp1 = sp[+1]; +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } ++static uint64_t // ++wuffs_private_impl__swizzle_rgbw__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if (last_column) { +- src_len--; +- } ++ // TODO: unroll. + +- for (; src_len > 0u; src_len--) { +- uint32_t svm1 = sp[-1]; +- uint32_t svp1 = sp[+1]; +- uint32_t sv3 = 3u * (uint32_t)(*sp++); +- *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u); +- *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u); +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); + +- if (last_column) { +- uint32_t svm1 = sp[-1]; +- uint8_t sv = *sp++; +- *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u); +- *dp++ = sv; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } + +- return dst_ptr; ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; ++// -------- + +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // +- (4u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + 7u) >> 4u); +- return dst_ptr; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. +- uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; ++ const size_t loop_unroll_count = 4; + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } ++ // The comparison in the while condition is ">", not ">=", because with ++ // ">=", the last 4-byte store could write past the end of the dst slice. ++ // ++ // Each 4-byte store writes one too many bytes, but a subsequent store ++ // will overwrite that with the correct byte. There is always another ++ // store, whether a 4-byte store in this loop or a 1-byte store in the ++ // next loop. ++ while (n > loop_unroll_count) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); + +- if (last_column) { +- src_len--; ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 3; ++ n -= loop_unroll_count; + } + +- for (; src_len > 0u; src_len--) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } + +- if (last_column) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. +- uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ return len; ++} + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- return dst_ptr; +-} ++ // TODO: unroll. + +-// wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs is indexed by inv_h +-// and then inv_v. +-static const wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs[4][4] = { +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- }, +-}; ++ while (n >= 1) { ++ uint32_t d0 = ++ wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +-static inline uint32_t // +-wuffs_base__pixel_swizzler__has_triangle_upsampler(uint32_t inv_h, +- uint32_t inv_v) { +- if (inv_h == 1u) { +- return inv_v == 2u; +- } else if (inv_h == 2u) { +- return (inv_v == 1u) || (inv_v == 2u); ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } +- return false; ++ ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// All of the wuffs_base__pixel_swizzler__swizzle_ycc__etc functions have +-// preconditions. See all of the checks made in +-// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For +-// example, (width > 0) is a precondition, but there are many more. ++ const size_t loop_unroll_count = 4; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t y, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- const uint8_t* src_ptr3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_h3, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t inv_v3, +- uint32_t half_width_for_2to1, +- uint32_t h1v2_bias, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc3, +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func) { +- const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- uint32_t total_src_len3 = 0u; +- +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 480u; +- if (end > width) { +- end = width; ++ while (n >= loop_unroll_count) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ } ++ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[1] * 4)); ++ if (s1) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1); ++ } ++ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[2] * 4)); ++ if (s2) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2); ++ } ++ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[3] * 4)); ++ if (s3) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3); + } + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- total_src_len3 += src_len3; +- +- const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 480u), // +- src_ptr_x0, // +- src_ptr_x0, // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); +- +- const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 480u), // +- src_ptr_x1, // +- src_ptr_x1, // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); +- +- const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 480u), // +- src_ptr_x2, // +- src_ptr_x2, // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 3; ++ n -= loop_unroll_count; ++ } + +- const uint8_t* src_ptr_x3 = src3 + (x / inv_h3); +- const uint8_t* up3 = (*upfunc3)( // +- scratch_buffer_2k_ptr + (3u * 480u), // +- src_ptr_x3, // +- src_ptr_x3, // +- src_len3, // +- h1v2_bias, // +- first_column, // +- (total_src_len3 >= half_width_for_2to1)); ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ } + +- (*conv4func)(dst, x, end, y, up0, up1, up2, up3); +- x = end; ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } +-} +- +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- const uint8_t* src_ptr3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_h3, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t inv_v3, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc3 = +- (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; + +- // First row. +- uint32_t h1v2_bias = 1u; +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- dst, width, 0u, // +- src_ptr0, src_ptr1, src_ptr2, src_ptr3, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, upfunc3, conv4func); +- h1v2_bias = 2u; ++ return len; ++} + +- // Middle rows. +- bool last_row = height == 2u * half_height_for_2to1; +- uint32_t y_max_excl = last_row ? (height - 1u) : height; +- uint32_t y; +- for (y = 1u; y < y_max_excl; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src0_minor = +- (inv_v0 != 2u) +- ? src0_major +- : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src1_minor = +- (inv_v1 != 2u) +- ? src1_major +- : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src2_minor = +- (inv_v2 != 2u) +- ? src2_major +- : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); +- const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3); +- const uint8_t* src3_minor = +- (inv_v3 != 2u) +- ? src3_major +- : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3)); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- uint32_t total_src_len3 = 0u; ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__xxxx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 480u; +- if (end > width) { +- end = width; +- } ++ // TODO: unroll. + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- total_src_len3 += src_len3; ++ while (n >= 1) { ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 480u), // +- src0_major + (x / inv_h0), // +- src0_minor + (x / inv_h0), // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++ s += 1 * 4; ++ d += 1 * 3; ++ n -= 1; ++ } + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 480u), // +- src1_major + (x / inv_h1), // +- src1_minor + (x / inv_h1), // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++ return len; ++} + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 480u), // +- src2_major + (x / inv_h2), // +- src2_minor + (x / inv_h2), // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* up3 = (*upfunc3)( // +- scratch_buffer_2k_ptr + (3u * 480u), // +- src3_major + (x / inv_h3), // +- src3_minor + (x / inv_h3), // +- src_len3, // +- h1v2_bias, // +- first_column, // +- (total_src_len3 >= half_width_for_2to1)); ++ // TODO: unroll. + +- (*conv4func)(dst, x, end, y, up0, up1, up2, up3); +- x = end; +- } ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s0; + +- h1v2_bias ^= 3u; ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } + +- // Last row. +- if (y_max_excl != height) { +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- dst, width, height - 1u, // +- src_ptr0, src_ptr1, src_ptr2, src_ptr3, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, upfunc3, conv4func); +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t y, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t h1v2_bias, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2, +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } +- +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- +- const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src_ptr_x0, // +- src_ptr_x0, // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src_ptr_x1, // +- src_ptr_x1, // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++ // TODO: unroll. + +- const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src_ptr_x2, // +- src_ptr_x2, // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s0; + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } +-} + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ return len; ++} + +- // First row. +- uint32_t h1v2_bias = 1u; +- wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- dst, width, 0u, // +- src_ptr0, src_ptr1, src_ptr2, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, conv3func); +- h1v2_bias = 2u; ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Middle rows. +- bool last_row = height == 2u * half_height_for_2to1; +- uint32_t y_max_excl = last_row ? (height - 1u) : height; +- uint32_t y; +- for (y = 1u; y < y_max_excl; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src0_minor = +- (inv_v0 != 2u) +- ? src0_major +- : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src1_minor = +- (inv_v1 != 2u) +- ? src1_major +- : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src2_minor = +- (inv_v2 != 2u) +- ? src2_major +- : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; ++ // TODO: unroll. + +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } ++ while (n >= 1) { ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; ++ } + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src0_major + (x / inv_h0), // +- src0_minor + (x / inv_h0), // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++ return len; ++} + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src1_major + (x / inv_h1), // +- src1_minor + (x / inv_h1), // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src2_major + (x / inv_h2), // +- src2_minor + (x / inv_h2), // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ // TODO: unroll. + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; +- } ++ while (n >= 1) { ++ uint32_t d0 = ++ wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- h1v2_bias ^= 3u; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } + +- // Last row. +- if (y_max_excl != height) { +- wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- dst, width, height - 1u, // +- src_ptr0, src_ptr1, src_ptr2, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, conv3func); +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__box_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; +- +- uint32_t y; +- for (y = 0u; y < height; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++// -------- + +- uint32_t x = 0u; +- while (x < width) { +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ const size_t loop_unroll_count = 4; + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src0_major + (x / inv_h0), // +- src0_major + (x / inv_h0), // +- src_len0, // +- 0u, false, false); ++ while (n >= loop_unroll_count) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src1_major + (x / inv_h1), // +- src1_major + (x / inv_h1), // +- src_len1, // +- 0u, false, false); ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 4; ++ n -= loop_unroll_count; ++ } + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src2_major + (x / inv_h2), // +- src2_major + (x / inv_h2), // +- src_len2, // +- 0u, false, false); ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; +- } ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } +-} + +-// -------- ++ return len; ++} + +-// wuffs_base__pixel_swizzler__flattened_length is like +-// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and +-// also accounts for subsampling. + static uint64_t // +-wuffs_base__pixel_swizzler__flattened_length(uint32_t width, +- uint32_t height, +- uint32_t stride, +- uint32_t inv_h, +- uint32_t inv_v) { +- uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h; +- uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v; +- if (scaled_height <= 0u) { +- return 0u; ++wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } +- return ((scaled_height - 1u) * stride) + scaled_width; +-} ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__swizzle_ycck( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_buffer* dst, +- wuffs_base__slice_u8 dst_palette, +- uint32_t width, +- uint32_t height, +- wuffs_base__slice_u8 src0, +- wuffs_base__slice_u8 src1, +- wuffs_base__slice_u8 src2, +- wuffs_base__slice_u8 src3, +- uint32_t width0, +- uint32_t width1, +- uint32_t width2, +- uint32_t width3, +- uint32_t height0, +- uint32_t height1, +- uint32_t height2, +- uint32_t height3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint8_t h0, +- uint8_t h1, +- uint8_t h2, +- uint8_t h3, +- uint8_t v0, +- uint8_t v1, +- uint8_t v2, +- uint8_t v3, +- bool is_rgb_or_cmyk, +- bool triangle_filter_for_2to1, +- wuffs_base__slice_u8 scratch_buffer_2k) { +- if (!p) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } else if (!dst || (width > 0xFFFFu) || (height > 0xFFFFu) || // +- (4u <= ((unsigned int)h0 - 1u)) || // +- (4u <= ((unsigned int)h1 - 1u)) || // +- (4u <= ((unsigned int)h2 - 1u)) || // +- (4u <= ((unsigned int)v0 - 1u)) || // +- (4u <= ((unsigned int)v1 - 1u)) || // +- (4u <= ((unsigned int)v2 - 1u)) || // +- (scratch_buffer_2k.len < 2048u)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ const size_t loop_unroll_count = 4; ++ ++ while (n >= loop_unroll_count) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); ++ } ++ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[1] * 4)); ++ if (s1) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1); ++ } ++ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[2] * 4)); ++ if (s2) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2); ++ } ++ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[3] * 4)); ++ if (s3) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3); ++ } ++ ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 4; ++ n -= loop_unroll_count; + } +- if ((h3 != 0u) || (v3 != 0u)) { +- if ((4u <= ((unsigned int)h3 - 1u)) || // +- (4u <= ((unsigned int)v3 - 1u))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + } ++ ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- uint32_t max_incl_h = wuffs_base__u32__max_of_4(h0, h1, h2, h3); +- uint32_t max_incl_v = wuffs_base__u32__max_of_4(v0, v1, v2, v3); ++ return len; ++} + +- // Calculate the inverse h and v ratios. +- // +- // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and +- // max_incl_h=2). In both cases, the inv_h value is 2. +- uint32_t inv_h0 = max_incl_h / h0; +- uint32_t inv_h1 = max_incl_h / h1; +- uint32_t inv_h2 = max_incl_h / h2; +- uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u; +- uint32_t inv_v0 = max_incl_v / v0; +- uint32_t inv_v1 = max_incl_v / v1; +- uint32_t inv_v2 = max_incl_v / v2; +- uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u; ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t half_width_for_2to1 = (width + 1u) / 2u; +- uint32_t half_height_for_2to1 = (height + 1u) / 2u; +- +- width = wuffs_base__u32__min_of_5( // +- width, // +- width0 * inv_h0, // +- width1 * inv_h1, // +- width2 * inv_h2, // +- wuffs_base__pixel_config__width(&dst->pixcfg)); +- height = wuffs_base__u32__min_of_5( // +- height, // +- height0 * inv_v0, // +- height1 * inv_v1, // +- height2 * inv_v2, // +- wuffs_base__pixel_config__height(&dst->pixcfg)); ++ __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, // ++ +0x02, +0x02, +0x02, +0x02, // ++ +0x01, +0x01, +0x01, +0x01, // ++ +0x00, +0x00, +0x00, +0x00); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); + +- if (((h0 * inv_h0) != max_incl_h) || // +- ((h1 * inv_h1) != max_incl_h) || // +- ((h2 * inv_h2) != max_incl_h) || // +- ((v0 * inv_v0) != max_incl_v) || // +- ((v1 * inv_v1) != max_incl_v) || // +- ((v2 * inv_v2) != max_incl_v) || // +- (src0.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride0, inv_h0, inv_v0)) || +- (src1.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride1, inv_h1, inv_v1)) || +- (src2.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride2, inv_h2, inv_v2))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((h3 != 0u) || (v3 != 0u)) { +- if (((h3 * inv_h3) != max_incl_h) || // +- ((v3 * inv_v3) != max_incl_v) || // +- (src3.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride3, inv_h3, inv_v3))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++ while (n >= 4) { ++ __m128i x; ++ x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s))); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); + +- if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) { +- // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 4 * 1; ++ d += 4 * 4; ++ n -= 4; + } + +- switch (dst->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + +- default: +- // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- if ((width <= 0u) || (height <= 0u)) { +- return wuffs_base__make_status(NULL); +- } ++ return len; ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func = NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if (is_rgb_or_cmyk) { +- conv3func = &wuffs_base__pixel_swizzler__swizzle_rgb__convert_3_general; +- } else { +- switch (dst->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- conv3func = +- &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2; +- break; +- } +-#endif +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx; +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- conv3func = +- &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2; +- break; +- } +-#endif +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx; +- break; +- default: +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_general; +- break; +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- void (*func)( +- wuffs_base__pixel_buffer * dst, // +- uint32_t width, // +- uint32_t height, // +- const uint8_t* src_ptr0, // +- const uint8_t* src_ptr1, // +- const uint8_t* src_ptr2, // +- uint32_t stride0, // +- uint32_t stride1, // +- uint32_t stride2, // +- uint32_t inv_h0, // +- uint32_t inv_h1, // +- uint32_t inv_h2, // +- uint32_t inv_v0, // +- uint32_t inv_v1, // +- uint32_t inv_v2, // +- uint32_t half_width_for_2to1, // +- uint32_t half_height_for_2to1, // +- uint8_t* scratch_buffer_2k_ptr, // +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func(*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) = +- &wuffs_base__pixel_swizzler__swizzle_ycc__general__box_filter; +- +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfuncs[4][4]; +- memcpy(&upfuncs, &wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs, +- sizeof upfuncs); ++ return len; ++} + +- if (triangle_filter_for_2to1 && +- (wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h0, inv_v0) || +- wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h1, inv_v1) || +- wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h2, inv_v2))) { +- func = &wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter; +- +- upfuncs[0][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1v2_triangle; +- upfuncs[1][0] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v1_triangle; +- upfuncs[1][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle; +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-#if defined(__GNUC__) && !defined(__clang__) +- // Don't use our AVX2 implementation for GCC (but do use it for clang). For +- // some unknown reason, GCC performs noticably better on the non-SIMD +- // version. Possibly because GCC's auto-vectorizer is smarter (just with +- // SSE2, not AVX2) than our hand-written code, but that's just a guess. +- // +- // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and +- // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers. +- // +- // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11 +- // versus gcc 10, where only gcc auto-vectorizes, although later clang +- // versions will also auto-vectorize. +-#else +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- upfuncs[1][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2; +- } +-#endif +-#endif +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if ((h3 != 0u) || (v3 != 0u)) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func = +- is_rgb_or_cmyk +- ? &wuffs_base__pixel_swizzler__swizzle_cmyk__convert_4_general +- : &wuffs_base__pixel_swizzler__swizzle_ycck__convert_4_general; +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter( // +- dst, width, height, // +- src0.ptr, src1.ptr, src2.ptr, src3.ptr, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, half_height_for_2to1, // +- scratch_buffer_2k.ptr, &upfuncs, conv4func); ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + +- } else { +- (*func)( // +- dst, width, height, // +- src0.ptr, src1.ptr, src2.ptr, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, half_height_for_2to1, // +- scratch_buffer_2k.ptr, &upfuncs, conv3func); ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } + +- return wuffs_base__make_status(NULL); ++ return len; + } + + // -------- + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- if ((x + 32u) > x_end) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( // +- dst, x, x_end, y, up0, up1, up2); +- return; ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); +- +- // u0001 = u16x16 [0x0001 .. 0x0001] +- // u00FF = u16x16 [0x00FF .. 0x00FF] +- // uFF80 = u16x16 [0xFF80 .. 0xFF80] +- // uFFFF = u16x16 [0xFFFF .. 0xFFFF] +- const __m256i u0001 = _mm256_set1_epi16(+0x0001); +- const __m256i u00FF = _mm256_set1_epi16(+0x00FF); +- const __m256i uFF80 = _mm256_set1_epi16(-0x0080); +- const __m256i uFFFF = _mm256_set1_epi16(-0x0001); ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4)))); + +- // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000] +- const __m256i p8000_p0000 = _mm256_set_epi16( // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000); ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Per wuffs_base__color_ycc__as__color_u32, the formulae: +- // +- // R = Y + 1.40200 * Cr +- // G = Y - 0.34414 * Cb - 0.71414 * Cr +- // B = Y + 1.77200 * Cb +- // +- // When scaled by 1<<16: +- // +- // 0.34414 becomes 0x0581A = 22554. +- // 0.71414 becomes 0x0B6D2 = 46802. +- // 1.40200 becomes 0x166E9 = 91881. +- // 1.77200 becomes 0x1C5A2 = 116130. +- // +- // Separate the integer and fractional parts, since we work with signed +- // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as +- // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point). +- // +- // -0x3A5E = -0x20000 + 0x1C5A2 The B:Cb factor. +- // +0x66E9 = -0x10000 + 0x166E9 The R:Cr factor. +- // -0x581A = +0x00000 - 0x0581A The G:Cb factor. +- // +0x492E = +0x10000 - 0x0B6D2 The G:Cr factor. +- const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); +- const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); +- const __m256i m581A_p492E = _mm256_set_epi16( // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A); ++ return len; ++} + +- while (x < x_end) { +- // Load chroma values in even and odd columns (the high 8 bits of each +- // u16x16 element are zero) and then subtract 0x0080. +- // +- // cb_all = u8x32 [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F] +- // cb_eve = i16x16 [cb.00-0x80 cb.02-0x80 .. cb.1C-0x80 cb.1E-0x80 ] +- // cb_odd = i16x16 [cb.01-0x80 cb.03-0x80 .. cb.1D-0x80 cb.1F-0x80 ] +- // +- // Ditto for the cr_xxx Chroma-Red values. +- __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); +- __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); +- __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); +- __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); +- __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); +- __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // ---- ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0)); ++ } + +- // Calculate: +- // +- // B-Y = (+1.77200 * Cb) as floating-point +- // R-Y = (+1.40200 * Cr) as floating-point +- // +- // B-Y = ((0x2_0000 - 0x3A5E) * Cb) as fixed-point +- // R-Y = ((0x1_0000 + 0x66E9) * Cr) as fixed-point +- // +- // B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb)) +- // R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr)) ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a +- // doubling (add x to itself), adding-of-1 and halving (shift right by 1). +- // That makes multiply-and-take-high round to nearest (instead of down). +- __m256i tmp_by_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), +- 1); +- __m256i tmp_by_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), +- 1); +- __m256i tmp_ry_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), +- 1); +- __m256i tmp_ry_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), +- 1); ++ return len; ++} + +- // Add (2 * Cb) and (1 * Cr). +- __m256i by_eve = +- _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); +- __m256i by_odd = +- _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); +- __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); +- __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // ---- ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0])); + +- // Calculate: +- // +- // G-Y = (-0.34414 * Cb) + +- // (-0.71414 * Cr) as floating-point +- // +- // G-Y = ((+0x0_0000 - 0x581A) * Cb) + +- // ((-0x1_0000 + 0x492E) * Cr) as fixed-point +- // +- // G-Y = (-0x581A * Cb) + +- // (+0x492E * Cr) - ("1.0" * Cr) ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)). +- __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); +- __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); ++ return len; ++} + +- // Divide the i32x8 vectors by (1 << 16), rounding to nearest. +- __m256i tmp1_gy_eve_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); +- __m256i tmp1_gy_eve_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); +- __m256i tmp1_gy_odd_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); +- __m256i tmp1_gy_odd_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr. +- __m256i gy_eve = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); +- __m256i gy_odd = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); ++ while (n >= 1) { ++ uint64_t s0 = ++ ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0)); + +- // ---- ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R. +- // +- // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..= +- // 23 of the 32-element vectors matter (since we'll unpacklo but not +- // unpackhi them). Let … denote 8 ignored consecutive u8 values and let % +- // denote 0xFF. We'll end this section with: +- // +- // packed_b_eve = u8x32 [b00 b02 .. b0C b0E … b10 b12 .. b1C b1E …] +- // packed_b_odd = u8x32 [b01 b03 .. b0D b0F … b11 b13 .. b1D b1F …] +- // packed_g_eve = u8x32 [g00 g02 .. g0C g0E … g10 g12 .. g1C g1E …] +- // packed_g_odd = u8x32 [g01 g03 .. g0D g0F … g11 g13 .. g1D g1F …] +- // packed_r_eve = u8x32 [r00 r02 .. r0C r0E … r10 r12 .. r1C r1E …] +- // packed_r_odd = u8x32 [r01 r03 .. r0D r0F … r11 r13 .. r1D r1F …] +- // uFFFF = u8x32 [ % % .. % % … % % .. % % …] ++ return len; ++} + +- __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); +- __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); +- __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); ++// -------- + +- __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); +- __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); +- __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); +- __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgra_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); +- __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); +- __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); +- __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); ++ while (n >= 1) { ++ uint32_t s0 = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0); + +- __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); +- __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); +- __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); +- __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; ++ } + +- // ---- ++ return len; ++} + +- // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the +- // desired BGRX/RGBX order. +- // +- // From here onwards, all of our __m256i registers are u8x32. ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E] +- // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F] +- // mix02 = [r00 % r02 % .. r0E % r10 % .. r1C % r1E %] +- // mix03 = [r01 % r03 % .. r0F % r11 % .. r1D % r1F %] +- // +- // See also § below. +- __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve); +- __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd); +- __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF); +- __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF); ++ while (n >= 1) { ++ uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0]))); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray( ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- // mix10 = [b00 g00 r00 % b02 g02 r02 % b04 g04 r04 % b06 g06 r06 % +- // b10 g10 r10 % b12 g12 r12 % b14 g14 r14 % b16 g16 r16 %] +- // mix11 = [b01 g01 r01 % b03 g03 r03 % b05 g05 r05 % b07 g07 r07 % +- // b11 g11 r11 % b13 g13 r13 % b15 g15 r15 % b17 g17 r17 %] +- // mix12 = [b08 g08 r08 % b0A g0A r0A % b0C g0C r0C % b0E g0E r0E % +- // b18 g18 r18 % b1A g1A r1A % b1C g1C r1C % b1E g1E r1E %] +- // mix13 = [b09 g09 r09 % b0B g0B r0B % b0D g0D r0D % b0F g0F r0F % +- // b19 g19 r19 % b1B g1B r1B % b1D g1D r1D % b1F g1F r1F %] +- __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); +- __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); +- __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); +- __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; ++ } + +- // mix20 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % +- // b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 %] +- // mix21 = [b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 % +- // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] +- // mix22 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % +- // b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B %] +- // mix23 = [b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F % +- // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] +- __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); +- __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); +- __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); +- __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); ++ return len; ++} + +- // mix30 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % +- // b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 %] +- // mix31 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % +- // b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F %] +- // mix32 = [b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 % +- // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] +- // mix33 = [b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B % +- // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] +- __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); +- __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); +- __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); +- __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels). +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); ++ while (n >= 1) { ++ uint32_t s0 = ++ 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0); + +- // Advance by up to 32 pixels. The first iteration might be smaller than 32 +- // so that all of the remaining steps are exactly 32. +- uint32_t n = 32u - (31u & (x - x_end)); +- dst_iter += 4u * n; +- up0 += n; +- up1 += n; +- up2 += n; +- x += n; ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; + } ++ ++ return len; + } + +-// The rgbx flavor (below) is exactly the same as the bgrx flavor (above) +-// except for the lines marked with a § and that comments were stripped. +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- if ((x + 32u) > x_end) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( // +- dst, x, x_end, y, up0, up1, up2); +- return; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_y__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len < src_len2) ? dst_len : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ while (n >= 1) { ++ d[0] = s[0]; + +- const __m256i u0001 = _mm256_set1_epi16(+0x0001); +- const __m256i u00FF = _mm256_set1_epi16(+0x00FF); +- const __m256i uFF80 = _mm256_set1_epi16(-0x0080); +- const __m256i uFFFF = _mm256_set1_epi16(-0x0001); ++ s += 1 * 2; ++ d += 1 * 1; ++ n -= 1; ++ } + +- const __m256i p8000_p0000 = _mm256_set_epi16( // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000); ++ return len; ++} + +- const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); +- const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); +- const __m256i m581A_p492E = _mm256_set_epi16( // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A); ++static uint64_t // ++wuffs_private_impl__swizzle_y_16le__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- while (x < x_end) { +- __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); +- __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); +- __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); +- __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); +- __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); +- __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ d[0] = s1; ++ d[1] = s0; + +- __m256i tmp_by_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), +- 1); +- __m256i tmp_by_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), +- 1); +- __m256i tmp_ry_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), +- 1); +- __m256i tmp_ry_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), +- 1); ++ s += 1 * 2; ++ d += 1 * 2; ++ n -= 1; ++ } + +- __m256i by_eve = +- _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); +- __m256i by_odd = +- _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); +- __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); +- __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); ++ return len; ++} + +- __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); +- __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); ++// -------- + +- __m256i tmp1_gy_eve_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); +- __m256i tmp1_gy_eve_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); +- __m256i tmp1_gy_odd_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); +- __m256i tmp1_gy_odd_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); ++static uint64_t // ++wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- __m256i gy_eve = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); +- __m256i gy_odd = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); ++ while (n >= 1) { ++ uint32_t d0 = ((uint32_t)(d[1]) << 24) | ((uint32_t)(d[0]) * 0x010101); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ uint32_t c0 = ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)(c0 >> 16)); + +- __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); +- __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); +- __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); ++ s += 1 * 2; ++ d += 1 * 2; ++ n -= 1; ++ } + +- __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); +- __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); +- __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); +- __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); ++ return len; ++} + +- __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); +- __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); +- __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); +- __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); ++// -------- + +- __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); +- __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); +- __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); +- __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_transparent_black_src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ uint64_t num_pixels, ++ uint32_t dst_pixfmt_bytes_per_pixel) { ++ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; ++ if (n > num_pixels) { ++ n = num_pixels; ++ } ++ memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel))); ++ return n; ++} + +- // § Note the swapped B and R channels. +- __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve); +- __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd); +- __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF); +- __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF); ++static uint64_t // ++wuffs_private_impl__swizzle_transparent_black_src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ uint64_t num_pixels, ++ uint32_t dst_pixfmt_bytes_per_pixel) { ++ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; ++ if (n > num_pixels) { ++ n = num_pixels; ++ } ++ return n; ++} + +- __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); +- __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); +- __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); +- __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); ++// -------- + +- __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); +- __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); +- __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); +- __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__y( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_copy_1_1; + +- __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); +- __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); +- __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); +- __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__y; + +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_xxx__y; + +- uint32_t n = 32u - (31u & (x - x_end)); +- dst_iter += 4u * n; +- up0 += n; +- up1 += n; +- up2 += n; +- x += n; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_xxxx__y__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_xxxx__y; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_xxxxxxxx__y; + } ++ return NULL; + } + +-#if defined(__GNUC__) && !defined(__clang__) +-// No-op. +-#else +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; +- +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // +- (4u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + 7u) >> 4u); +- return dst_ptr; +- } +- +- uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. +- uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; +- +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } +- +- if (last_column) { +- src_len--; +- } +- +- if (src_len < 32) { +- // This fallback is the same as the non-SIMD-capable code path. +- for (; src_len > 0u; src_len--) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; +- +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- } +- +- } else { +- while (src_len > 0u) { +- // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor +- // (nxx) rows. +- // +- // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31] // p0 = "plus 0" +- // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31] // p0 = "plus 0" +- // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30] // m1 = "minus 1" +- // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30] // m1 = "minus 1" +- // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32] // p1 = "plus 1" +- // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32] // p1 = "plus 1" +- __m256i major_p0 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0)); +- __m256i minor_p0 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0)); +- __m256i major_m1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1)); +- __m256i minor_m1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1)); +- __m256i major_p1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1)); +- __m256i minor_p1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1)); +- +- // Unpack, staying with u8x32 vectors. +- // +- // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07 j16 n16 j17 n17 .. j23 n23] +- // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15 j24 n24 j25 n25 .. j31 n31] +- // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06 j15 n15 j16 n16 .. j22 n22] +- // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14 j23 n23 j24 n24 .. j30 n30] +- // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08 j17 n17 j18 n18 .. j24 n24] +- // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16 j25 n25 j26 n26 .. j32 n32] +- __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0); +- __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0); +- __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1); +- __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1); +- __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1); +- __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1); +- +- // Multiply-add to get u16x16 vectors. +- // +- // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23] +- // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31] +- // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22] +- // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30] +- // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24] +- // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32] +- const __m256i k0309 = _mm256_set1_epi16(0x0309); +- const __m256i k0103 = _mm256_set1_epi16(0x0103); +- __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309); +- __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309); +- __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103); +- __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103); +- __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103); +- __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103); +- +- // Compute the weighted sums of (p0, m1) and (p0, p1). For example: +- // +- // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16 +- // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16 +- __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo); +- __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi); +- __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo); +- __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__y_16be( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_y__y_16be; + +- // Bias by 8 (on the left) or 7 (on the right) and then divide by 16 +- // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift +- // the u16 right value by 4. On the right (p1), shift right by 4 and then +- // shift left by 8 so that, when still in the u16x16 little-endian +- // interpretation, we have: +- // - m1_element = (etcetera + 8) >> 4 +- // - p1_element = ((etcetera + 7) >> 4) << 8 +- // +- // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??] +- // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00] +- // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??] +- // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00] +- __m256i step4_m1_lo = _mm256_srli_epi16( +- _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4); +- __m256i step4_p1_lo = _mm256_slli_epi16( +- _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)), +- 4), +- 8); +- __m256i step4_m1_hi = _mm256_srli_epi16( +- _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4); +- __m256i step4_p1_hi = _mm256_slli_epi16( +- _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)), +- 4), +- 8); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ return wuffs_private_impl__swizzle_y_16le__y_16be; + +- // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do +- // that twice. Once for the low columns and once for the high columns. +- // +- // In terms of jxx (major row) or nxx (minor row) source samples: +- // - low columns means ( 0 .. 8; 16 .. 24). +- // - high columns means ( 8 .. 16; 24 .. 32). +- // +- // In terms of dxx destination samples (there are twice as many): +- // - low columns means ( 0 .. 16; 32 .. 48). +- // - high columns means (16 .. 32; 48 .. 64). +- // +- // step5_lo = [d00 d01 .. d14 d15 d32 d33 .. d46 d47] +- // step5_hi = [d16 d17 .. d30 d31 d48 d49 .. d62 d63] +- // +- // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums. +- // The d01, d03 ... d63 odd elements come from (p0, p1) weighted sums. +- __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo); +- __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ return wuffs_private_impl__swizzle_copy_2_2; + +- // Permute and store. +- // +- // step6_00_31 = [d00 d01 .. d14 d15 d16 d17 .. d30 d31] +- // step6_32_63 = [d32 d33 .. d46 d47 d48 d49 .. d62 d63] +- __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20); +- __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31); +- _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31); +- _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__y_16be; + +- // Advance by up to 32 source samples (64 destination samples). The first +- // iteration might be smaller than 32 so that all of the remaining steps +- // are exactly 32. +- size_t n = 32u - (31u & (0u - src_len)); +- dp += 2u * n; +- sp_major += n; +- sp_minor += n; +- src_len -= n; +- } +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_xxx__y_16be; + +- if (last_column) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. +- uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_xxxx__y_16be; + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_xxxxxxxx__y_16be; + } +- +- return dst_ptr; ++ return NULL; + } +-#endif +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__UTF8) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_2_2; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Unicode and UTF-8 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) { +- if (code_point <= 0x7F) { +- if (dst.len >= 1) { +- dst.ptr[0] = (uint8_t)(code_point); +- return 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0x07FF) { +- if (dst.len >= 2) { +- dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 2; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0xFFFF) { +- if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) { +- dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); +- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 3; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0x10FFFF) { +- if (dst.len >= 4) { +- dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F)); +- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); +- dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 4; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over; ++ } ++ return NULL; + } +- +- return 0; ++ return NULL; + } + +-// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a +-// UTF-8 encoded code point, based on the encoding's initial byte. +-// - 0x00 is 1-byte UTF-8 (ASCII). +-// - 0x01 is the start of 2-byte UTF-8. +-// - 0x02 is the start of 3-byte UTF-8. +-// - 0x03 is the start of 4-byte UTF-8. +-// - 0x40 is a UTF-8 tail byte. +-// - 0x80 is invalid UTF-8. +-// +-// RFC 3629 (UTF-8) gives this grammar for valid UTF-8: +-// UTF8-1 = %x00-7F +-// UTF8-2 = %xC2-DF UTF8-tail +-// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / +-// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) +-// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / +-// %xF4 %x80-8F 2( UTF8-tail ) +-// UTF8-tail = %x80-BF +-static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. +- +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. +- +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF. ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_1_1; ++ } ++ return NULL; + +- 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF. +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7. +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF. +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888( ++ dst_palette.ptr, dst_palette.len, src_palette.ptr, ++ src_palette.len, true) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgr_565__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +-wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) { +- if (s_len == 0) { +- return wuffs_base__make_utf_8__next__output(0, 0); +- } +- uint32_t c = s_ptr[0]; +- switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) { +- case 0: +- return wuffs_base__make_utf_8__next__output(c, 1); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +- case 1: +- if (s_len < 2) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- c = wuffs_base__peek_u16le__no_bounds_check(s_ptr); +- if ((c & 0xC000) != 0x8000) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over; + } +- c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8)); +- return wuffs_base__make_utf_8__next__output(c, 2); ++ return NULL; + +- case 2: +- if (s_len < 3) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- c = wuffs_base__peek_u24le__no_bounds_check(s_ptr); +- if ((c & 0xC0C000) != 0x808000) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over; + } +- c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) | +- (0x00003F & (c >> 16)); +- if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) { +- break; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over; + } +- return wuffs_base__make_utf_8__next__output(c, 3); ++ return NULL; + +- case 3: +- if (s_len < 4) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over; + } +- c = wuffs_base__peek_u32le__no_bounds_check(s_ptr); +- if ((c & 0xC0C0C000) != 0x80808000) { +- break; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; + } +- c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) | +- (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24)); +- if ((c <= 0xFFFF) || (0x110000 <= c)) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over; + } +- return wuffs_base__make_utf_8__next__output(c, 4); +- } ++ return NULL; + +- return wuffs_base__make_utf_8__next__output( +- WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +-wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) { +- if (s_len == 0) { +- return wuffs_base__make_utf_8__next__output(0, 0); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; + } +- const uint8_t* ptr = &s_ptr[s_len - 1]; +- if (*ptr < 0x80) { +- return wuffs_base__make_utf_8__next__output(*ptr, 1); ++ return NULL; ++} + +- } else if (*ptr < 0xC0) { +- const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0]; +- uint32_t n = 1; +- while (ptr != too_far) { +- ptr--; +- n++; +- if (*ptr < 0x80) { +- break; +- } else if (*ptr < 0xC0) { +- continue; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n); +- if (o.byte_length != n) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_1_1; + } +- return o; +- } +- } +- +- return wuffs_base__make_utf_8__next__output( +- WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +-} ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { +- // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time). +- // +- // TODO: possibly optimize this by manually inlining the +- // wuffs_base__utf_8__next calls. +- size_t original_len = s_len; +- while (s_len > 0) { +- wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len); +- if ((o.code_point > 0x7F) && (o.byte_length == 1)) { +- break; +- } +- s_ptr += o.byte_length; +- s_len -= o.byte_length; +- } +- return original_len - s_len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888( ++ dst_palette.ptr, dst_palette.len, src_palette.ptr, ++ src_palette.len, false) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { +- // TODO: possibly optimize this by checking 4 or 8 bytes at a time. +- const uint8_t* original_ptr = s_ptr; +- const uint8_t* p = s_ptr; +- const uint8_t* q = s_ptr + s_len; +- for (; (p != q) && ((*p & 0x80) == 0); p++) { +- } +- return (size_t)(p - original_ptr); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__UTF8) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#ifdef __cplusplus +-} // extern "C" +-#endif ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-// ---------------- Status Codes Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over; ++ } ++ return NULL; ++ } ++ return NULL; ++} + +-// ---------------- Private Consts ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgr_565( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_copy_2_2; + +-// ---------------- Private Initializer Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_bgr__bgr_565; + +-// ---------------- Private Function Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return wuffs_private_impl__swizzle_bgrw__bgr_565; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up__choosy_default( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_rgb__bgr_565; + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_arm_neon( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_rgbw__bgr_565; ++ } ++ return NULL; ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_x86_sse42( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgr( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__bgr; + +-// ---------------- VTables ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_copy_3_3; + +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_adler32__hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_adler32__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_adler32__hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32), +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__bgr; + +-// ---------------- Initializer Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgr; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_adler32__hasher__initialize( +- wuffs_adler32__hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_swap_rgb_bgr; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42; ++ } + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ return wuffs_private_impl__swizzle_bgrw__rgb; + } ++ return NULL; ++} + +- self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_y__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over; ++ } ++ return NULL; + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32); +- return wuffs_base__make_status(NULL); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-wuffs_adler32__hasher* +-wuffs_adler32__hasher__alloc(void) { +- wuffs_adler32__hasher* x = +- (wuffs_adler32__hasher*)(calloc(sizeof(wuffs_adler32__hasher), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_adler32__hasher__initialize( +- x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-size_t +-sizeof__wuffs_adler32__hasher(void) { +- return sizeof(wuffs_adler32__hasher); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Function Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.get_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_adler32__hasher__get_quirk( +- const wuffs_adler32__hasher* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +- return 0u; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.set_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_adler32__hasher__set_quirk( +- wuffs_adler32__hasher* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; + } + +-// -------- func adler32.hasher.update ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_adler32__hasher__update( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +- if ( ! self->private_impl.f_started) { +- self->private_impl.f_started = true; +- self->private_impl.f_state = 1u; +- self->private_impl.choosy_up = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 : +-#endif +- self->private_impl.choosy_up); +- } +- wuffs_adler32__hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.update_u32 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_8_8; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_adler32__hasher__update_u32( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +- wuffs_adler32__hasher__update(self, a_x); +- return self->private_impl.f_state; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +-// -------- func adler32.hasher.up ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- return (*self->private_impl.choosy_up)(self, a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over; ++ } ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over; ++ } ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; + } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up__choosy_default( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5552u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u); +- } +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_premul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over; + } +- v_p.len = 0; +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; +- } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func adler32.hasher.checksum_u32 +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_adler32__hasher__checksum_u32( +- const wuffs_adler32__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return self->private_impl.f_state; +-} +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func adler32.hasher.up_arm_neon ++ return NULL; + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_arm_neon( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- uint8x16_t v_p__left = {0}; +- uint8x16_t v_p_right = {0}; +- uint32x4_t v_v1 = {0}; +- uint32x4_t v_v2 = {0}; +- uint16x8_t v_col0 = {0}; +- uint16x8_t v_col1 = {0}; +- uint16x8_t v_col2 = {0}; +- uint16x8_t v_col3 = {0}; +- uint32x2_t v_sum1 = {0}; +- uint32x2_t v_sum2 = {0}; +- uint32x2_t v_sum12 = {0}; +- uint32_t v_num_iterate_bytes = 0; +- uint64_t v_tail_index = 0; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over; ++ } ++ return NULL; + +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s1 += ((uint32_t)(a_x.ptr[0u])); +- v_s2 += v_s1; +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5536u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); +- } +- v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); +- v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); +- v_v1 = vdupq_n_u32(0u); +- v_v2 = vdupq_n_u32(0u); +- v_col0 = vdupq_n_u16(0u); +- v_col1 = vdupq_n_u16(0u); +- v_col2 = vdupq_n_u16(0u); +- v_col3 = vdupq_n_u16(0u); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_p__left = vld1q_u8(v_p.ptr); +- v_p_right = vld1q_u8(v_p.ptr + 16u); +- v_v2 = vaddq_u32(v_v2, v_v1); +- v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right)); +- v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left)); +- v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left)); +- v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right)); +- v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right)); +- v_p.ptr += 32; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over; + } +- v_p.len = 0; +- } +- v_v2 = vshlq_n_u32(v_v2, 5u); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u})); +- v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1)); +- v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2)); +- v_sum12 = vpadd_u32(v_sum1, v_sum2); +- v_s1 += vget_lane_u32(v_sum12, 0u); +- v_s2 += vget_lane_u32(v_sum12, 1u); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over; + } +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; +- } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon ++ return NULL; + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func adler32.hasher.up_x86_sse42 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over; ++ } ++ return NULL; + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_x86_sse42( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_zeroes = {0}; +- __m128i v_ones = {0}; +- __m128i v_weights__left = {0}; +- __m128i v_weights_right = {0}; +- __m128i v_q__left = {0}; +- __m128i v_q_right = {0}; +- __m128i v_v1 = {0}; +- __m128i v_v2 = {0}; +- __m128i v_v2j = {0}; +- __m128i v_v2k = {0}; +- uint32_t v_num_iterate_bytes = 0; +- uint64_t v_tail_index = 0; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over; ++ } ++ return NULL; + +- v_zeroes = _mm_set1_epi16((int16_t)(0u)); +- v_ones = _mm_set1_epi16((int16_t)(1u)); +- v_weights__left = _mm_set_epi8((int8_t)(17u), (int8_t)(18u), (int8_t)(19u), (int8_t)(20u), (int8_t)(21u), (int8_t)(22u), (int8_t)(23u), (int8_t)(24u), (int8_t)(25u), (int8_t)(26u), (int8_t)(27u), (int8_t)(28u), (int8_t)(29u), (int8_t)(30u), (int8_t)(31u), (int8_t)(32u)); +- v_weights_right = _mm_set_epi8((int8_t)(1u), (int8_t)(2u), (int8_t)(3u), (int8_t)(4u), (int8_t)(5u), (int8_t)(6u), (int8_t)(7u), (int8_t)(8u), (int8_t)(9u), (int8_t)(10u), (int8_t)(11u), (int8_t)(12u), (int8_t)(13u), (int8_t)(14u), (int8_t)(15u), (int8_t)(16u)); +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5536u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); +- } +- v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); +- v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); +- v_v1 = _mm_setzero_si128(); +- v_v2j = _mm_setzero_si128(); +- v_v2k = _mm_setzero_si128(); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr)); +- v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)); +- v_v2j = _mm_add_epi32(v_v2j, v_v1); +- v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes)); +- v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes)); +- v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left))); +- v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right))); +- v_p.ptr += 32; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over; + } +- v_p.len = 0; +- } +- v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u))); +- v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u))); +- v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1))); +- v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u))); +- v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u))); +- v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u))); +- v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over; + } +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; ++ return NULL; + } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); ++ return NULL; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgrx( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_y__bgrx; + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__bgrx; + +-// ---------------- Status Codes Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_xxx__xxxx; + +-const char wuffs_bmp__error__bad_header[] = "#bmp: bad header"; +-const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression"; +-const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input"; +-const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file"; +-const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read"; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ return wuffs_private_impl__swizzle_bgrw__bgrx; + +-// ---------------- Private Consts ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgrx; + +-#define WUFFS_BMP__COMPRESSION_NONE 0 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return wuffs_private_impl__swizzle_copy_4_4; + +-#define WUFFS_BMP__COMPRESSION_RLE8 1 ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_bgr__rgbx; + +-#define WUFFS_BMP__COMPRESSION_RLE4 2 ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_bgrw__rgbx; ++ } ++ return NULL; ++} + +-#define WUFFS_BMP__COMPRESSION_BITFIELDS 3 ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgb( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__rgb; + +-#define WUFFS_BMP__COMPRESSION_JPEG 4 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_swap_rgb_bgr; + +-#define WUFFS_BMP__COMPRESSION_PNG 5 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__rgb; + +-#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__rgb; + +-#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256 ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_copy_3_3; + +-#define WUFFS_BMP__RLE_STATE_NEUTRAL 0 ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__bgr; ++ } ++ return NULL; ++} + +-#define WUFFS_BMP__RLE_STATE_RUN 1 ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_ESCAPE 2 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_LITERAL 3 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_DELTA_X 4 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_DELTA_Y 5 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Private Initializer Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +-// ---------------- Private Function Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_none( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgba_premul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_rle( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_bitfields( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_low_bit_depth( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__read_palette( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__process_masks( +- wuffs_bmp__decoder* self); ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over; ++ } ++ return NULL; + +-// ---------------- VTables ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over; ++ } ++ return NULL; + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_bmp__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_bmp__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_bmp__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_bmp__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len), +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over; ++ } ++ return NULL; ++ } ++ return NULL; ++} + +-// ---------------- Initializer Implementations ++// -------- + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_bmp__decoder__initialize( +- wuffs_bmp__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__pixel_format src_pixfmt, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ if (!p) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ p->private_impl.func = NULL; ++ p->private_impl.transparent_black_func = NULL; ++ p->private_impl.dst_pixfmt_bytes_per_pixel = 0; ++ p->private_impl.src_pixfmt_bytes_per_pixel = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++ // ---- ++ ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst_pixfmt.repr) { ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ break; + #endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ break; + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ break; ++#endif ++ default: ++ return wuffs_base__make_status( ++ wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist); + } ++#endif // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} ++ // ---- + +-wuffs_bmp__decoder* +-wuffs_bmp__decoder__alloc(void) { +- wuffs_bmp__decoder* x = +- (wuffs_bmp__decoder*)(calloc(sizeof(wuffs_bmp__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_bmp__decoder__initialize( +- x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ wuffs_base__pixel_swizzler__func func = NULL; ++ wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func = ++ NULL; ++ ++ uint32_t dst_pixfmt_bits_per_pixel = ++ wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt); ++ if ((dst_pixfmt_bits_per_pixel == 0) || ++ ((dst_pixfmt_bits_per_pixel & 7) != 0)) { ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); + } +- return x; +-} + +-size_t +-sizeof__wuffs_bmp__decoder(void) { +- return sizeof(wuffs_bmp__decoder); +-} ++ uint32_t src_pixfmt_bits_per_pixel = ++ wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt); ++ if ((src_pixfmt_bits_per_pixel == 0) || ++ ((src_pixfmt_bits_per_pixel & 7) != 0)) { ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } + +-// ---------------- Function Implementations ++ // TODO: support many more formats. + +-// -------- func bmp.decoder.get_quirk ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ transparent_black_func = ++ wuffs_private_impl__swizzle_transparent_black_src; ++ break; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__get_quirk( +- const wuffs_bmp__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ transparent_black_func = ++ wuffs_private_impl__swizzle_transparent_black_src_over; ++ break; + } + +- return 0u; +-} ++ switch (src_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ func = wuffs_private_impl__pixel_swizzler__prepare__y( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + +-// -------- func bmp.decoder.set_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ func = wuffs_private_impl__pixel_swizzler__prepare__y_16be( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__set_quirk( +- wuffs_bmp__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ func = ++ wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ func = wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgr_565( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgr( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_premul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgrx( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgb( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgba_premul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ p->private_impl.func = func; ++ p->private_impl.transparent_black_func = transparent_black_func; ++ p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8; ++ p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8; ++ return wuffs_base__make_status( ++ func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option); + } + +-// -------- func bmp.decoder.decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ uint32_t up_to_num_pixels, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ if (p && p->private_impl.func) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ uint64_t src_len = wuffs_base__u64__min( ++ ((uint64_t)up_to_num_pixels) * ++ ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel), ++ ((uint64_t)(io2_r - iop_r))); ++ uint64_t n = ++ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, iop_r, (size_t)src_len); ++ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; ++ return n; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ if (p && p->private_impl.func) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ uint64_t src_len = ((uint64_t)(io2_r - iop_r)); ++ uint64_t n = ++ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, iop_r, (size_t)src_len); ++ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; ++ return n; + } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src) { ++ if (p && p->private_impl.func) { ++ return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, src.ptr, src.len); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint64_t num_pixels) { ++ if (p && p->private_impl.transparent_black_func) { ++ return (*p->private_impl.transparent_black_func)( ++ dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels, ++ p->private_impl.dst_pixfmt_bytes_per_pixel); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ return 0; ++} + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++// -------- + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; +- } ++#if defined(__GNUC__) && !defined(__clang__) ++// No-op. ++#else ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column); ++#endif ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++static inline uint32_t // ++wuffs_private_impl__u32__max_of_4(uint32_t a, ++ uint32_t b, ++ uint32_t c, ++ uint32_t d) { ++ return wuffs_base__u32__max( // ++ wuffs_base__u32__max(a, b), // ++ wuffs_base__u32__max(c, d)); + } + +-// -------- func bmp.decoder.do_decode_image_config ++static inline uint32_t // ++wuffs_private_impl__u32__min_of_5(uint32_t a, ++ uint32_t b, ++ uint32_t c, ++ uint32_t d, ++ uint32_t e) { ++ return wuffs_base__u32__min( // ++ wuffs_base__u32__min( // ++ wuffs_base__u32__min(a, b), // ++ wuffs_base__u32__min(c, d)), // ++ e); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// -------- + +- uint32_t v_magic = 0; +- uint32_t v_width = 0; +- uint32_t v_height = 0; +- uint32_t v_planes = 0; +- uint32_t v_dst_pixfmt = 0; +- uint32_t v_byte_width = 0; ++typedef void (*wuffs_private_impl__swizzle_ycc__convert_4_func)( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++static void // ++wuffs_private_impl__swizzle_cmyk__convert_4_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3) { ++ for (; x < x_end; x++) { ++ // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's ++ // RGBW: 0xFFu means no ink instead of full ink. Note that a double ++ // inversion is a no-op, so inversions might be implicit in the code below. ++ uint32_t r = ((uint32_t)(*up0++)); ++ uint32_t g = ((uint32_t)(*up1++)); ++ uint32_t b = ((uint32_t)(*up2++)); ++ uint32_t w = ((uint32_t)(*up3++)); ++ r = ((r * w) + 0x7Fu) / 0xFFu; ++ g = ((g * w) + 0x7Fu) / 0xFFu; ++ b = ((b * w) + 0x7Fu) / 0xFFu; ++ wuffs_base__pixel_buffer__set_color_u32_at( ++ dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); + } ++} + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static void // ++wuffs_private_impl__swizzle_ycck__convert_4_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3) { ++ for (; x < x_end; x++) { ++ // We invert once again: 0xFFu means no ink instead of full ink. ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ uint32_t r = 0xFFu - (0xFFu & (color >> 16u)); ++ uint32_t g = 0xFFu - (0xFFu & (color >> 8u)); ++ uint32_t b = 0xFFu - (0xFFu & (color >> 0u)); ++ uint32_t w = ((uint32_t)(*up3++)); ++ r = ((r * w) + 0x7Fu) / 0xFFu; ++ g = ((g * w) + 0x7Fu) / 0xFFu; ++ b = ((b * w) + 0x7Fu) / 0xFFu; ++ wuffs_base__pixel_buffer__set_color_u32_at( ++ dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); ++ } ++} + +- if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_io_redirect_fourcc != 0u) { +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_magic = t_0; +- } +- if (v_magic != 19778u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = 8u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++// -------- ++ ++typedef void (*wuffs_private_impl__swizzle_ycc__convert_3_func)( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); ++ ++static void // ++wuffs_private_impl__swizzle_rgb__convert_3_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ for (; x < x_end; x++) { ++ uint32_t color = 0xFF000000u | // ++ (((uint32_t)(*up0++)) << 16u) | // ++ (((uint32_t)(*up1++)) << 8u) | // ++ (((uint32_t)(*up2++)) << 0u); ++ wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx(wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); ++ dst_iter += 4u; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx(wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32_abgr( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); ++ dst_iter += 4u; ++ } ++} ++ ++// -------- ++ ++// wuffs_private_impl__swizzle_ycc__upsample_func upsamples to a destination ++// slice at least 480 (YCCK) or 672 (YCC) bytes long and whose src_len ++// (multiplied by 1, 2, 3 or 4) is positive but no more than that. This 480 or ++// 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice length. ++// Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048. ++// ++// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks ++// wide and each block is 8 pixels wide. We have: ++// 480 = 1 * 8 * 60, 672 = 1 * 8 * 84 ++// 480 = 2 * 8 * 30, 672 = 2 * 8 * 42 ++// 480 = 3 * 8 * 20, 672 = 3 * 8 * 28 ++// 480 = 4 * 8 * 15, 672 = 4 * 8 * 21 ++// ++// Box filters are equivalent to nearest neighbor upsampling. These ignore the ++// src_ptr_minor, h1v2_bias, first_column and last_column arguments. ++// ++// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2 ++// dimensions), which is higher quality (less blocky) but also higher ++// computational effort. ++// ++// In theory, we could use triangle filters for any (inv_h, inv_v) combination. ++// In practice, matching libjpeg-turbo, we only implement it for the common ++// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an ++// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2). ++typedef const uint8_t* (*wuffs_private_impl__swizzle_ycc__upsample_func)( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, // Nearest row. ++ const uint8_t* src_ptr_minor, // Adjacent row, alternating above or below. ++ size_t src_len, ++ uint32_t h1v2_bias, ++ bool first_column, ++ bool last_column); ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ return src_ptr_major; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; ++ while (src_len--) { ++ *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) + // ++ (1u * ((uint32_t)(*sp_minor++))) + // ++ h1v2_bias) >> ++ 2u); ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ return dst_ptr; + } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_padding = t_1; ++ uint32_t svp1 = sp[+1]; ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u); ++ if (src_len <= 0u) { ++ return dst_ptr; + } +- if (self->private_impl.f_padding < 14u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++ } ++ ++ if (last_column) { ++ src_len--; ++ } ++ ++ for (; src_len > 0u; src_len--) { ++ uint32_t svm1 = sp[-1]; ++ uint32_t svp1 = sp[+1]; ++ uint32_t sv3 = 3u * (uint32_t)(*sp++); ++ *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u); ++ *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u); ++ } ++ ++ if (last_column) { ++ uint32_t svm1 = sp[-1]; ++ uint8_t sv = *sp++; ++ *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u); ++ *dp++ = sv; ++ } ++ ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; ++ ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // ++ (4u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + 7u) >> 4u); ++ return dst_ptr; + } +- self->private_impl.f_padding -= 14u; +- self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- self->private_impl.f_bitmap_info_len = t_2; ++ ++ uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. ++ uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ if (src_len <= 0u) { ++ return dst_ptr; + } +- if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++ } ++ ++ if (last_column) { ++ src_len--; ++ } ++ ++ for (; src_len > 0u; src_len--) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } ++ ++ if (last_column) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. ++ uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } ++ ++ return dst_ptr; ++} ++ ++// wuffs_private_impl__swizzle_ycc__upsample_funcs is indexed by inv_h and then ++// inv_v. ++static const wuffs_private_impl__swizzle_ycc__upsample_func ++ wuffs_private_impl__swizzle_ycc__upsample_funcs[4][4] = { ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ }, ++}; ++ ++static inline uint32_t // ++wuffs_private_impl__swizzle_has_triangle_upsampler(uint32_t inv_h, ++ uint32_t inv_v) { ++ if (inv_h == 1u) { ++ return inv_v == 2u; ++ } else if (inv_h == 2u) { ++ return (inv_v == 1u) || (inv_v == 2u); ++ } ++ return false; ++} ++ ++// -------- ++ ++// All of the wuffs_private_impl__swizzle_ycc__etc functions have ++// preconditions. See all of the checks made in ++// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For ++// example, (width > 0) is a precondition, but there are many more. ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t width, ++ uint32_t y, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t h1v2_bias, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3, ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ uint32_t total_src_len3 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < width) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 480u; ++ if (end > width) { ++ end = width; + } +- self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len; +- if (self->private_impl.f_bitmap_info_len == 12u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; +- } +- } +- self->private_impl.f_width = t_3; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ total_src_len3 += src_len3; ++ ++ const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src_ptr_x0, // ++ src_ptr_x0, // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src_ptr_x1, // ++ src_ptr_x1, // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src_ptr_x2, // ++ src_ptr_x2, // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x3 = src3 + (x / inv_h3); ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src_ptr_x3, // ++ src_ptr_x3, // ++ src_len3, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len3 >= half_width_for_2to1)); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__triangle_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ if ((x_min_incl != 0) || (y_min_incl != 0)) { ++ return; ++ } ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 = ++ (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; ++ ++ // First row. ++ uint32_t h1v2_bias = 1u; ++ wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ dst, x_max_excl, 0u, // ++ src_ptr0, src_ptr1, src_ptr2, src_ptr3, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, upfunc3, conv4func); ++ h1v2_bias = 2u; ++ ++ // Middle rows. ++ bool last_row = y_max_excl == 2u * half_height_for_2to1; ++ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl; ++ uint32_t y; ++ for (y = 1u; y < middle_y_max_excl; y++) { ++ const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src0_minor = ++ (inv_v0 != 2u) ++ ? src0_major ++ : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); ++ const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src1_minor = ++ (inv_v1 != 2u) ++ ? src1_major ++ : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); ++ const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src2_minor = ++ (inv_v2 != 2u) ++ ? src2_major ++ : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); ++ const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3); ++ const uint8_t* src3_minor = ++ (inv_v3 != 2u) ++ ? src3_major ++ : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3)); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ uint32_t total_src_len3 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < x_max_excl) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 480u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_height = t_4; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ total_src_len3 += src_len3; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src0_major + (x / inv_h0), // ++ src0_minor + (x / inv_h0), // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src1_major + (x / inv_h1), // ++ src1_minor + (x / inv_h1), // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src2_major + (x / inv_h2), // ++ src2_minor + (x / inv_h2), // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src3_major + (x / inv_h3), // ++ src3_minor + (x / inv_h3), // ++ src_len3, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len3 >= half_width_for_2to1)); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++ ++ h1v2_bias ^= 3u; ++ } ++ ++ // Last row. ++ if (middle_y_max_excl != y_max_excl) { ++ wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ dst, x_max_excl, middle_y_max_excl, // ++ src_ptr0, src_ptr1, src_ptr2, src_ptr3, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, upfunc3, conv4func); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t width, ++ uint32_t y, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t h1v2_bias, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2, ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < width) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 672u; ++ if (end > width) { ++ end = width; ++ } ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ ++ const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src_ptr_x0, // ++ src_ptr_x0, // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src_ptr_x1, // ++ src_ptr_x1, // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src_ptr_x2, // ++ src_ptr_x2, // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__triangle_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ if ((x_min_incl != 0) || (y_min_incl != 0)) { ++ return; ++ } ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ ++ // First row. ++ uint32_t h1v2_bias = 1u; ++ wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ dst, x_max_excl, 0u, // ++ src_ptr0, src_ptr1, src_ptr2, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, conv3func); ++ h1v2_bias = 2u; ++ ++ // Middle rows. ++ bool last_row = y_max_excl == 2u * half_height_for_2to1; ++ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl; ++ uint32_t y; ++ for (y = 1u; y < middle_y_max_excl; y++) { ++ const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src0_minor = ++ (inv_v0 != 2u) ++ ? src0_major ++ : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); ++ const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src1_minor = ++ (inv_v1 != 2u) ++ ? src1_major ++ : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); ++ const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src2_minor = ++ (inv_v2 != 2u) ++ ? src2_major ++ : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < x_max_excl) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 672u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; +- if (num_bits_5 == 8) { +- t_5 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)) << 56; +- } +- } +- v_planes = t_5; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src0_major + (x / inv_h0), // ++ src0_minor + (x / inv_h0), // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src1_major + (x / inv_h1), // ++ src1_minor + (x / inv_h1), // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src2_major + (x / inv_h2), // ++ src2_minor + (x / inv_h2), // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++ ++ h1v2_bias ^= 3u; ++ } ++ ++ // Last row. ++ if (middle_y_max_excl != y_max_excl) { ++ wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ dst, x_max_excl, middle_y_max_excl, // ++ src_ptr0, src_ptr1, src_ptr2, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, conv3func); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__box_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ ++ uint32_t y; ++ for (y = y_min_incl; y < y_max_excl; y++) { ++ const uint8_t* src0_major = ++ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0); ++ const uint8_t* src1_major = ++ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1); ++ const uint8_t* src2_major = ++ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2); ++ ++ uint32_t x = x_min_incl; ++ while (x < x_max_excl) { ++ uint32_t end = x + 672u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src_len0, // ++ 0u, false, false); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src_len1, // ++ 0u, false, false); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src_len2, // ++ 0u, false, false); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__box_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 = ++ (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; ++ ++ uint32_t y; ++ for (y = y_min_incl; y < y_max_excl; y++) { ++ const uint8_t* src0_major = ++ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0); ++ const uint8_t* src1_major = ++ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1); ++ const uint8_t* src2_major = ++ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2); ++ const uint8_t* src3_major = ++ src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3); ++ ++ uint32_t x = x_min_incl; ++ while (x < x_max_excl) { ++ uint32_t end = x + 480u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- uint32_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)) << 56; +- } +- } +- self->private_impl.f_bits_per_pixel = t_6; +- } +- } else if (self->private_impl.f_bitmap_info_len == 16u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- uint32_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; +- if (num_bits_7 == 24) { +- t_7 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)) << 56; +- } +- } +- v_width = t_7; +- } +- if (v_width > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_width > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_width; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); +- uint32_t t_8; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; +- if (num_bits_8 == 24) { +- t_8 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_8 += 8u; +- *scratch |= ((uint64_t)(num_bits_8)) << 56; +- } +- } +- v_height = t_8; +- } +- if (v_height > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_height; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); +- uint32_t t_9; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; +- if (num_bits_9 == 8) { +- t_9 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_9 += 8u; +- *scratch |= ((uint64_t)(num_bits_9)) << 56; +- } +- } +- v_planes = t_9; +- } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- uint32_t t_10; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; +- if (num_bits_10 == 8) { +- t_10 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_10 += 8u; +- *scratch |= ((uint64_t)(num_bits_10)) << 56; +- } +- } +- self->private_impl.f_bits_per_pixel = t_10; +- } +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); +- uint32_t t_11; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; +- if (num_bits_11 == 24) { +- t_11 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_11 += 8u; +- *scratch |= ((uint64_t)(num_bits_11)) << 56; +- } +- } +- v_width = t_11; +- } +- if (v_width > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_width > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_width; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); +- uint32_t t_12; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; +- if (num_bits_12 == 24) { +- t_12 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_12 += 8u; +- *scratch |= ((uint64_t)(num_bits_12)) << 56; +- } +- } +- v_height = t_12; +- } +- if (v_height == 2147483648u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_height > 2147483648u) { +- v_height = ((uint32_t)(0u - v_height)); +- if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_height; +- self->private_impl.f_top_down = true; +- } else if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } else { +- self->private_impl.f_height = v_height; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); +- uint32_t t_13; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13; +- if (num_bits_13 == 8) { +- t_13 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_13 += 8u; +- *scratch |= ((uint64_t)(num_bits_13)) << 56; +- } ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src_len0, // ++ 0u, false, false); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src_len1, // ++ 0u, false, false); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src_len2, // ++ 0u, false, false); ++ ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src3_major + ((x - x_min_incl) / inv_h3), // ++ src3_major + ((x - x_min_incl) / inv_h3), // ++ src_len3, // ++ 0u, false, false); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++ } ++} ++ ++// -------- ++ ++// wuffs_private_impl__swizzle_flattened_length is like ++// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and ++// also accounts for subsampling. ++static uint64_t // ++wuffs_private_impl__swizzle_flattened_length(uint32_t width, ++ uint32_t height, ++ uint32_t stride, ++ uint32_t inv_h, ++ uint32_t inv_v) { ++ uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h; ++ uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v; ++ if (scaled_height <= 0u) { ++ return 0u; ++ } ++ return ((scaled_height - 1u) * stride) + scaled_width; ++} ++ ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__swizzle_ycck( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_buffer* dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ wuffs_base__slice_u8 src0, ++ wuffs_base__slice_u8 src1, ++ wuffs_base__slice_u8 src2, ++ wuffs_base__slice_u8 src3, ++ uint32_t width0, ++ uint32_t width1, ++ uint32_t width2, ++ uint32_t width3, ++ uint32_t height0, ++ uint32_t height1, ++ uint32_t height2, ++ uint32_t height3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint8_t h0, ++ uint8_t h1, ++ uint8_t h2, ++ uint8_t h3, ++ uint8_t v0, ++ uint8_t v1, ++ uint8_t v2, ++ uint8_t v3, ++ bool is_rgb_or_cmyk, ++ bool triangle_filter_for_2to1, ++ wuffs_base__slice_u8 scratch_buffer_2k) { ++ if (!p) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } else if (!dst || // ++ (x_min_incl > x_max_excl) || // ++ (x_max_excl > 0xFFFFu) || // ++ (y_min_incl > y_max_excl) || // ++ (y_max_excl > 0xFFFFu) || // ++ (4u <= ((unsigned int)h0 - 1u)) || // ++ (4u <= ((unsigned int)h1 - 1u)) || // ++ (4u <= ((unsigned int)h2 - 1u)) || // ++ (4u <= ((unsigned int)v0 - 1u)) || // ++ (4u <= ((unsigned int)v1 - 1u)) || // ++ (4u <= ((unsigned int)v2 - 1u)) || // ++ (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) || ++ (scratch_buffer_2k.len < 2048u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((h3 != 0u) || (v3 != 0u)) { ++ if ((4u <= ((unsigned int)h3 - 1u)) || // ++ (4u <= ((unsigned int)v3 - 1u))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ uint32_t max_incl_h = wuffs_private_impl__u32__max_of_4(h0, h1, h2, h3); ++ uint32_t max_incl_v = wuffs_private_impl__u32__max_of_4(v0, v1, v2, v3); ++ ++ // Calculate the inverse h and v ratios. ++ // ++ // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and ++ // max_incl_h=2). In both cases, the inv_h value is 2. ++ uint32_t inv_h0 = max_incl_h / h0; ++ uint32_t inv_h1 = max_incl_h / h1; ++ uint32_t inv_h2 = max_incl_h / h2; ++ uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u; ++ uint32_t inv_v0 = max_incl_v / v0; ++ uint32_t inv_v1 = max_incl_v / v1; ++ uint32_t inv_v2 = max_incl_v / v2; ++ uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u; ++ ++ if (x_min_incl != 0) { ++ if ((x_min_incl % inv_h0) || (x_min_incl % inv_h1) || ++ (x_min_incl % inv_h2) || (inv_h3 && (x_min_incl % inv_h3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ if (y_min_incl != 0) { ++ if ((y_min_incl % inv_v0) || (y_min_incl % inv_v1) || ++ (y_min_incl % inv_v2) || (inv_v3 && (y_min_incl % inv_v3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ uint32_t half_width_for_2to1 = ((x_max_excl - x_min_incl) + 1u) / 2u; ++ if (inv_h0 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width0); ++ } ++ if (inv_h1 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width1); ++ } ++ if (inv_h2 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width2); ++ } ++ if (inv_h3 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width3); ++ } ++ ++ uint32_t half_height_for_2to1 = ((y_max_excl - y_min_incl) + 1u) / 2u; ++ if (inv_v0 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height0); ++ } ++ if (inv_v1 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height1); ++ } ++ if (inv_v2 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height2); ++ } ++ if (inv_v3 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height3); ++ } ++ ++ x_max_excl = wuffs_base__u32__min( // ++ wuffs_base__pixel_config__width(&dst->pixcfg), // ++ x_min_incl + wuffs_private_impl__u32__min_of_5( // ++ x_max_excl - x_min_incl, // ++ width0 * inv_h0, // ++ width1 * inv_h1, // ++ width2 * inv_h2, // ++ inv_h3 ? (width3 * inv_h3) : 0xFFFFFFFF)); ++ y_max_excl = wuffs_base__u32__min( // ++ wuffs_base__pixel_config__height(&dst->pixcfg), // ++ y_min_incl + wuffs_private_impl__u32__min_of_5( // ++ y_max_excl - y_min_incl, // ++ height0 * inv_v0, // ++ height1 * inv_v1, // ++ height2 * inv_v2, // ++ inv_v3 ? (height3 * inv_v3) : 0xFFFFFFFF)); ++ ++ if ((x_min_incl >= x_max_excl) || (y_min_incl >= y_max_excl)) { ++ return wuffs_base__make_status(NULL); ++ } ++ uint32_t width = x_max_excl - x_min_incl; ++ uint32_t height = y_max_excl - y_min_incl; ++ ++ if (((h0 * inv_h0) != max_incl_h) || // ++ ((h1 * inv_h1) != max_incl_h) || // ++ ((h2 * inv_h2) != max_incl_h) || // ++ ((v0 * inv_v0) != max_incl_v) || // ++ ((v1 * inv_v1) != max_incl_v) || // ++ ((v2 * inv_v2) != max_incl_v) || // ++ (src0.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride0, inv_h0, inv_v0)) || ++ (src1.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride1, inv_h1, inv_v1)) || ++ (src2.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride2, inv_h2, inv_v2))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((h3 != 0u) || (v3 != 0u)) { ++ if (((h3 * inv_h3) != max_incl_h) || // ++ ((v3 * inv_v3) != max_incl_v) || // ++ (src3.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride3, inv_h3, inv_v3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) { ++ // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } ++ ++ // ---- ++ ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ break; ++#endif ++ default: ++ return wuffs_base__make_status( ++ wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist); ++ } ++#else // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ break; ++ ++ default: ++ // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } ++#endif // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ ++ // ---- ++ ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func = NULL; ++ ++ if (is_rgb_or_cmyk) { ++ conv3func = &wuffs_private_impl__swizzle_rgb__convert_3_general; ++ } else { ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2; ++ break; + } +- v_planes = t_13; +- } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); +- uint32_t t_14; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14; +- if (num_bits_14 == 8) { +- t_14 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_14 += 8u; +- *scratch |= ((uint64_t)(num_bits_14)) << 56; +- } ++#endif ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx; ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2; ++ break; + } +- self->private_impl.f_bits_per_pixel = t_14; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); +- uint32_t t_15; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; +- if (num_bits_15 == 24) { +- t_15 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_15 += 8u; +- *scratch |= ((uint64_t)(num_bits_15)) << 56; +- } +- } +- self->private_impl.f_compression = t_15; +- } +- if (self->private_impl.f_bits_per_pixel == 0u) { +- if (self->private_impl.f_compression == 4u) { +- self->private_impl.f_io_redirect_fourcc = 1246774599u; +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } else if (self->private_impl.f_compression == 5u) { +- self->private_impl.f_io_redirect_fourcc = 1347307296u; +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = 20u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- if (self->private_impl.f_bitmap_info_len == 40u) { +- if (self->private_impl.f_bits_per_pixel >= 16u) { +- if (self->private_impl.f_padding >= 16u) { +- self->private_impl.f_bitmap_info_len = 56u; +- self->private_impl.f_padding -= 16u; +- } else if (self->private_impl.f_padding >= 12u) { +- self->private_impl.f_bitmap_info_len = 52u; +- self->private_impl.f_padding -= 12u; +- } +- } +- } else if ((self->private_impl.f_bitmap_info_len != 52u) && +- (self->private_impl.f_bitmap_info_len != 56u) && +- (self->private_impl.f_bitmap_info_len != 64u) && +- (self->private_impl.f_bitmap_info_len != 108u) && +- (self->private_impl.f_bitmap_info_len != 124u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- if (self->private_impl.f_compression == 6u) { +- self->private_impl.f_compression = 3u; +- } +- if (self->private_impl.f_compression == 3u) { +- if (self->private_impl.f_bitmap_info_len >= 52u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35); +- uint32_t t_16; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; +- if (num_bits_16 == 24) { +- t_16 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_16 += 8u; +- *scratch |= ((uint64_t)(num_bits_16)) << 56; +- } +- } +- self->private_impl.f_channel_masks[2u] = t_16; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37); +- uint32_t t_17; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17; +- if (num_bits_17 == 24) { +- t_17 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_17 += 8u; +- *scratch |= ((uint64_t)(num_bits_17)) << 56; +- } +- } +- self->private_impl.f_channel_masks[1u] = t_17; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39); +- uint32_t t_18; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; +- if (num_bits_18 == 24) { +- t_18 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_18 += 8u; +- *scratch |= ((uint64_t)(num_bits_18)) << 56; +- } +- } +- self->private_impl.f_channel_masks[0u] = t_18; +- } +- if (self->private_impl.f_bitmap_info_len >= 56u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41); +- uint32_t t_19; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19; +- if (num_bits_19 == 24) { +- t_19 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_19 += 8u; +- *scratch |= ((uint64_t)(num_bits_19)) << 56; +- } +- } +- self->private_impl.f_channel_masks[3u] = t_19; +- } +- self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- } +- if ((self->private_impl.f_channel_masks[0u] == 255u) && (self->private_impl.f_channel_masks[1u] == 65280u) && (self->private_impl.f_channel_masks[2u] == 16711680u)) { +- if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_compression = 0u; +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) { +- self->private_impl.f_compression = 0u; +- } +- } +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44); +- status = wuffs_bmp__decoder__process_masks(self); +- if (status.repr) { +- goto suspend; +- } +- } +- } else if (self->private_impl.f_bitmap_info_len >= 40u) { +- self->private_data.s_do_decode_image_config[0].scratch = (self->private_impl.f_bitmap_info_len - 40u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } +- if (self->private_impl.f_compression != 3u) { +- if (self->private_impl.f_bits_per_pixel < 16u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46); +- status = wuffs_bmp__decoder__read_palette(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- } +- if (self->private_impl.f_compression == 0u) { +- if ((self->private_impl.f_bits_per_pixel == 1u) || (self->private_impl.f_bits_per_pixel == 2u) || (self->private_impl.f_bits_per_pixel == 4u)) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- self->private_impl.f_compression = 256u; +- } else if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else if (self->private_impl.f_bits_per_pixel == 16u) { +- self->private_impl.f_compression = 3u; +- self->private_impl.f_channel_masks[0u] = 31u; +- self->private_impl.f_channel_masks[1u] = 992u; +- self->private_impl.f_channel_masks[2u] = 31744u; +- self->private_impl.f_channel_masks[3u] = 0u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47); +- status = wuffs_bmp__decoder__process_masks(self); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_src_pixfmt = 2164308923u; +- } else if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_src_pixfmt = 2147485832u; +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- if (self->private_impl.f_channel_masks[3u] == 0u) { +- self->private_impl.f_src_pixfmt = 2415954056u; +- } else { +- self->private_impl.f_src_pixfmt = 2164295816u; +- } +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 1u) { +- if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 2u) { +- if (self->private_impl.f_bits_per_pixel == 4u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 3u) { +- if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) { +- self->private_impl.f_src_pixfmt = 2164308923u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) && +- (self->private_impl.f_bits_per_pixel != 1u) && +- (self->private_impl.f_bits_per_pixel != 4u) && +- (self->private_impl.f_bits_per_pixel != 8u) && +- (self->private_impl.f_bits_per_pixel != 24u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 4u) { +- v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 16u) { +- self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u); +- } else if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- self->private_impl.f_pad_per_row = 0u; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- v_dst_pixfmt = 2164295816u; +- if ((self->private_impl.f_channel_num_bits[0u] > 8u) || +- (self->private_impl.f_channel_num_bits[1u] > 8u) || +- (self->private_impl.f_channel_num_bits[2u] > 8u) || +- (self->private_impl.f_channel_num_bits[3u] > 8u)) { +- v_dst_pixfmt = 2164308923u; +- } +- wuffs_base__image_config__set( +- a_dst, +- v_dst_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- (self->private_impl.f_channel_masks[3u] == 0u)); ++#endif ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx; ++ break; ++ default: ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_general; ++ break; + } +- self->private_impl.f_call_sequence = 32u; +- +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ void (*func3)(wuffs_base__pixel_buffer * dst, // ++ uint32_t x_min_incl, // ++ uint32_t x_max_excl, // ++ uint32_t y_min_incl, // ++ uint32_t y_max_excl, // ++ const uint8_t* src_ptr0, // ++ const uint8_t* src_ptr1, // ++ const uint8_t* src_ptr2, // ++ uint32_t stride0, // ++ uint32_t stride1, // ++ uint32_t stride2, // ++ uint32_t inv_h0, // ++ uint32_t inv_h1, // ++ uint32_t inv_h2, // ++ uint32_t inv_v0, // ++ uint32_t inv_v1, // ++ uint32_t inv_v2, // ++ uint32_t half_width_for_2to1, // ++ uint32_t half_height_for_2to1, // ++ uint8_t* scratch_buffer_2k_ptr, // ++ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) = ++ &wuffs_private_impl__swizzle_ycc__general__box_filter; ++ ++ void (*func4)(wuffs_base__pixel_buffer * dst, // ++ uint32_t x_min_incl, // ++ uint32_t x_max_excl, // ++ uint32_t y_min_incl, // ++ uint32_t y_max_excl, // ++ const uint8_t* src_ptr0, // ++ const uint8_t* src_ptr1, // ++ const uint8_t* src_ptr2, // ++ const uint8_t* src_ptr3, // ++ uint32_t stride0, // ++ uint32_t stride1, // ++ uint32_t stride2, // ++ uint32_t stride3, // ++ uint32_t inv_h0, // ++ uint32_t inv_h1, // ++ uint32_t inv_h2, // ++ uint32_t inv_h3, // ++ uint32_t inv_v0, // ++ uint32_t inv_v1, // ++ uint32_t inv_v2, // ++ uint32_t inv_v3, // ++ uint32_t half_width_for_2to1, // ++ uint32_t half_height_for_2to1, // ++ uint8_t* scratch_buffer_2k_ptr, // ++ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) = ++ &wuffs_private_impl__swizzle_ycck__general__box_filter; ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4]; ++ memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs, ++ sizeof upfuncs); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (triangle_filter_for_2to1 && ++ (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) { ++ func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter; ++ func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter; ++ ++ upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle; ++ upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle; ++ upfuncs[1][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle; ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++#if defined(__GNUC__) && !defined(__clang__) ++ // Don't use our AVX2 implementation for GCC (but do use it for clang). For ++ // some unknown reason, GCC performs noticably better on the non-SIMD ++ // version. Possibly because GCC's auto-vectorizer is smarter (just with ++ // SSE2, not AVX2) than our hand-written code, but that's just a guess. ++ // ++ // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and ++ // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers. ++ // ++ // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11 ++ // versus gcc 10, where only gcc auto-vectorizes, although later clang ++ // versions will also auto-vectorize. ++#else ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ upfuncs[1][1] = ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2; ++ } ++#endif ++#endif + } + +- return status; +-} +- +-// -------- func bmp.decoder.decode_frame_config ++ if ((h3 != 0u) || (v3 != 0u)) { ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func = ++ is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general ++ : &wuffs_private_impl__swizzle_ycck__convert_4_general; ++ (*func4)( // ++ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, // ++ src0.ptr, src1.ptr, src2.ptr, src3.ptr, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, half_height_for_2to1, // ++ scratch_buffer_2k.ptr, &upfuncs, conv4func); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } else { ++ (*func3)( // ++ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, // ++ src0.ptr, src1.ptr, src2.ptr, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, half_height_for_2to1, // ++ scratch_buffer_2k.ptr, &upfuncs, conv3func); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ return wuffs_base__make_status(NULL); ++} + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++// -------- + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ if ((x + 32u) > x_end) { ++ wuffs_private_impl__swizzle_ycc__convert_3_bgrx( // ++ dst, x, x_end, y, up0, up1, up2); ++ return; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++ // u0001 = u16x16 [0x0001 .. 0x0001] ++ // u00FF = u16x16 [0x00FF .. 0x00FF] ++ // uFF80 = u16x16 [0xFF80 .. 0xFF80] ++ // uFFFF = u16x16 [0xFFFF .. 0xFFFF] ++ const __m256i u0001 = _mm256_set1_epi16(+0x0001); ++ const __m256i u00FF = _mm256_set1_epi16(+0x00FF); ++ const __m256i uFF80 = _mm256_set1_epi16(-0x0080); ++ const __m256i uFFFF = _mm256_set1_epi16(-0x0001); + +-// -------- func bmp.decoder.do_decode_frame_config ++ // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000] ++ const __m256i p8000_p0000 = _mm256_set_epi16( // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // Per wuffs_base__color_ycc__as__color_u32, the formulae: ++ // ++ // R = Y + 1.40200 * Cr ++ // G = Y - 0.34414 * Cb - 0.71414 * Cr ++ // B = Y + 1.77200 * Cb ++ // ++ // When scaled by 1<<16: ++ // ++ // 0.34414 becomes 0x0581A = 22554. ++ // 0.71414 becomes 0x0B6D2 = 46802. ++ // 1.40200 becomes 0x166E9 = 91881. ++ // 1.77200 becomes 0x1C5A2 = 116130. ++ // ++ // Separate the integer and fractional parts, since we work with signed ++ // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as ++ // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point). ++ // ++ // -0x3A5E = -0x20000 + 0x1C5A2 The B:Cb factor. ++ // +0x66E9 = -0x10000 + 0x166E9 The R:Cr factor. ++ // -0x581A = +0x00000 - 0x0581A The G:Cb factor. ++ // +0x492E = +0x10000 - 0x0B6D2 The G:Cr factor. ++ const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); ++ const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); ++ const __m256i m581A_p492E = _mm256_set_epi16( // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ while (x < x_end) { ++ // Load chroma values in even and odd columns (the high 8 bits of each ++ // u16x16 element are zero) and then subtract 0x0080. ++ // ++ // cb_all = u8x32 [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F] ++ // cb_eve = i16x16 [cb.00-0x80 cb.02-0x80 .. cb.1C-0x80 cb.1E-0x80 ] ++ // cb_odd = i16x16 [cb.01-0x80 cb.03-0x80 .. cb.1D-0x80 cb.1F-0x80 ] ++ // ++ // Ditto for the cr_xxx Chroma-Red values. ++ __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); ++ __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); ++ __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); ++ __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); ++ __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); ++ __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // ---- + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); +- } +- self->private_impl.f_call_sequence = 64u; ++ // Calculate: ++ // ++ // B-Y = (+1.77200 * Cb) as floating-point ++ // R-Y = (+1.40200 * Cr) as floating-point ++ // ++ // B-Y = ((0x2_0000 - 0x3A5E) * Cb) as fixed-point ++ // R-Y = ((0x1_0000 + 0x66E9) * Cr) as fixed-point ++ // ++ // B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb)) ++ // R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr)) + +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } ++ // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a ++ // doubling (add x to itself), adding-of-1 and halving (shift right by 1). ++ // That makes multiply-and-take-high round to nearest (instead of down). ++ __m256i tmp_by_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), ++ 1); ++ __m256i tmp_by_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), ++ 1); ++ __m256i tmp_ry_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), ++ 1); ++ __m256i tmp_ry_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), ++ 1); + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ // Add (2 * Cb) and (1 * Cr). ++ __m256i by_eve = ++ _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); ++ __m256i by_odd = ++ _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); ++ __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); ++ __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ // ---- + +- return status; +-} ++ // Calculate: ++ // ++ // G-Y = (-0.34414 * Cb) + ++ // (-0.71414 * Cr) as floating-point ++ // ++ // G-Y = ((+0x0_0000 - 0x581A) * Cb) + ++ // ((-0x1_0000 + 0x492E) * Cr) as fixed-point ++ // ++ // G-Y = (-0x581A * Cb) + ++ // (+0x492E * Cr) - ("1.0" * Cr) + +-// -------- func bmp.decoder.decode_frame ++ // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)). ++ __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); ++ __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // Divide the i32x8 vectors by (1 << 16), rounding to nearest. ++ __m256i tmp1_gy_eve_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_eve_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr. ++ __m256i gy_eve = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); ++ __m256i gy_odd = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // ---- + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R. ++ // ++ // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..= ++ // 23 of the 32-element vectors matter (since we'll unpacklo but not ++ // unpackhi them). Let … denote 8 ignored consecutive u8 values and let % ++ // denote 0xFF. We'll end this section with: ++ // ++ // packed_b_eve = u8x32 [b00 b02 .. b0C b0E … b10 b12 .. b1C b1E …] ++ // packed_b_odd = u8x32 [b01 b03 .. b0D b0F … b11 b13 .. b1D b1F …] ++ // packed_g_eve = u8x32 [g00 g02 .. g0C g0E … g10 g12 .. g1C g1E …] ++ // packed_g_odd = u8x32 [g01 g03 .. g0D g0F … g11 g13 .. g1D g1F …] ++ // packed_r_eve = u8x32 [r00 r02 .. r0C r0E … r10 r12 .. r1C r1E …] ++ // packed_r_odd = u8x32 [r01 r03 .. r0D r0F … r11 r13 .. r1D r1F …] ++ // uFFFF = u8x32 [ % % .. % % … % % .. % % …] + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } ++ __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); ++ __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); ++ __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); ++ __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); ++ __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); ++ __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++ __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); ++ __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); ++ __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); ++ __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); + +-// -------- func bmp.decoder.do_decode_frame ++ __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); ++ __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); ++ __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); ++ __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // ---- + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the ++ // desired BGRX/RGBX order. ++ // ++ // From here onwards, all of our __m256i registers are u8x32. + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E] ++ // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F] ++ // mix02 = [r00 % r02 % .. r0E % r10 % .. r1C % r1E %] ++ // mix03 = [r01 % r03 % .. r0F % r11 % .. r1D % r1F %] ++ // ++ // See also § below. ++ __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve); ++ __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd); ++ __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF); ++ __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF); + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // mix10 = [b00 g00 r00 % b02 g02 r02 % b04 g04 r04 % b06 g06 r06 % ++ // b10 g10 r10 % b12 g12 r12 % b14 g14 r14 % b16 g16 r16 %] ++ // mix11 = [b01 g01 r01 % b03 g03 r03 % b05 g05 r05 % b07 g07 r07 % ++ // b11 g11 r11 % b13 g13 r13 % b15 g15 r15 % b17 g17 r17 %] ++ // mix12 = [b08 g08 r08 % b0A g0A r0A % b0C g0C r0C % b0E g0E r0E % ++ // b18 g18 r18 % b1A g1A r1A % b1C g1C r1C % b1E g1E r1E %] ++ // mix13 = [b09 g09 r09 % b0B g0B r0B % b0D g0D r0D % b0F g0F r0F % ++ // b19 g19 r19 % b1B g1B r1B % b1D g1D r1D % b1F g1F r1F %] ++ __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); ++ __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); ++ __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); ++ __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_padding; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) { +- self->private_impl.f_dst_x = 0u; +- if (self->private_impl.f_top_down) { +- self->private_impl.f_dst_y = 0u; +- self->private_impl.f_dst_y_inc = 1u; +- } else { +- self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); +- self->private_impl.f_dst_y_inc = 4294967295u; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- while (true) { +- if (self->private_impl.f_compression == 0u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else if (self->private_impl.f_compression < 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else if (self->private_impl.f_compression == 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_pending_pad; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_pending_pad = 0u; +- } +- self->private_impl.f_call_sequence = 96u; ++ // mix20 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % ++ // b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 %] ++ // mix21 = [b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 % ++ // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] ++ // mix22 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % ++ // b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B %] ++ // mix23 = [b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F % ++ // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] ++ __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); ++ __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); ++ __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); ++ __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); + +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; +- } ++ // mix30 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % ++ // b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 %] ++ // mix31 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % ++ // b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F %] ++ // mix32 = [b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 % ++ // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] ++ // mix33 = [b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B % ++ // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] ++ __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); ++ __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); ++ __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); ++ __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels). ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ // Advance by up to 32 pixels. The first iteration might be smaller than 32 ++ // so that all of the remaining steps are exactly 32. ++ uint32_t n = 32u - (31u & (x - x_end)); ++ dst_iter += 4u * n; ++ up0 += n; ++ up1 += n; ++ up2 += n; ++ x += n; + } +- +- return status; + } + +-// -------- func bmp.decoder.swizzle_none ++// The rgbx flavor (below) is exactly the same as the bgrx flavor (above) ++// except for the lines marked with a § and that comments were stripped. ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ if ((x + 32u) > x_end) { ++ wuffs_private_impl__swizzle_ycc__convert_3_bgrx( // ++ dst, x, x_end, y, up0, up1, up2); ++ return; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_none( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; ++ const __m256i u0001 = _mm256_set1_epi16(+0x0001); ++ const __m256i u00FF = _mm256_set1_epi16(+0x00FF); ++ const __m256i uFF80 = _mm256_set1_epi16(-0x0080); ++ const __m256i uFFFF = _mm256_set1_epi16(-0x0001); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ const __m256i p8000_p0000 = _mm256_set_epi16( // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- label__outer__continue:; +- while (true) { +- while (self->private_impl.f_pending_pad > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- self->private_impl.f_pending_pad -= 1u; +- iop_a_src += 1u; +- } +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- if (self->private_impl.f_height > 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- } +- goto label__outer__break; +- } else if (self->private_impl.f_pad_per_row != 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- goto label__outer__continue; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_bits_per_pixel > 32u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u); +- if (v_src_bytes_per_pixel == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); +- } +- v_j -= 8u; +- } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); +- } +- v_j -= 1u; +- } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- v_dst_palette, +- &iop_a_src, +- io2_a_src); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- } +- label__outer__break:; +- status = wuffs_base__make_status(NULL); +- goto ok; ++ const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); ++ const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); ++ const __m256i m581A_p492E = _mm256_set_epi16( // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ while (x < x_end) { ++ __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); ++ __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); ++ __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); ++ __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); ++ __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); ++ __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); + +- return status; +-} ++ __m256i tmp_by_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), ++ 1); ++ __m256i tmp_by_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), ++ 1); ++ __m256i tmp_ry_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), ++ 1); ++ __m256i tmp_ry_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), ++ 1); + +-// -------- func bmp.decoder.swizzle_rle ++ __m256i by_eve = ++ _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); ++ __m256i by_odd = ++ _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); ++ __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); ++ __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_rle( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); ++ __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_row = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint8_t v_code = 0; +- uint8_t v_indexes[2] = {0}; +- uint32_t v_rle_state = 0; +- uint32_t v_chunk_bits = 0; +- uint32_t v_chunk_count = 0; ++ __m256i tmp1_gy_eve_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_eve_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ __m256i gy_eve = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); ++ __m256i gy_odd = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_rle_state = self->private_impl.f_rle_state; +- label__outer__continue:; +- while (true) { +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- label__middle__continue:; +- while (true) { +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i <= ((uint64_t)(v_row.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- while (true) { +- while (true) { +- if (v_rle_state == 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (v_code == 0u) { +- v_rle_state = 2u; +- continue; +- } +- self->private_impl.f_rle_length = ((uint32_t)(v_code)); +- v_rle_state = 1u; +- continue; +- } else if (v_rle_state == 1u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (self->private_impl.f_bits_per_pixel == 8u) { +- v_p0 = 0u; +- while (v_p0 < self->private_impl.f_rle_length) { +- self->private_data.f_scratch[v_p0] = v_code; +- v_p0 += 1u; +- } +- } else { +- v_indexes[0u] = ((uint8_t)((v_code >> 4u))); +- v_indexes[1u] = (v_code & 15u); +- v_p0 = 0u; +- while (v_p0 < self->private_impl.f_rle_length) { +- self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u]; +- self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u]; +- v_p0 += 2u; +- } +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); +- v_rle_state = 0u; +- goto label__middle__continue; +- } else if (v_rle_state == 2u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (v_code < 2u) { +- if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u); +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (v_code > 0u) { +- goto label__outer__break; +- } +- v_rle_state = 0u; +- goto label__outer__continue; +- } else if (v_code == 2u) { +- v_rle_state = 4u; +- continue; +- } +- self->private_impl.f_rle_length = ((uint32_t)(v_code)); +- self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && ((v_code & 1u) != 0u)); +- v_rle_state = 3u; +- continue; +- } else if (v_rle_state == 3u) { +- if (self->private_impl.f_bits_per_pixel == 8u) { +- v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- self->private_impl.f_rle_length, +- v_dst, +- v_dst_palette, +- &iop_a_src, +- io2_a_src); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n))); +- } else { +- v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u); +- v_p0 = 0u; +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) { +- v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 255u) + 4u); +- v_chunk_count -= 1u; +- } +- v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); +- } +- if (self->private_impl.f_rle_length > 0u) { +- goto label__goto_suspend__break; +- } +- if (self->private_impl.f_rle_padded) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- iop_a_src += 1u; +- self->private_impl.f_rle_padded = false; +- } +- v_rle_state = 0u; +- goto label__middle__continue; +- } else if (v_rle_state == 4u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- v_rle_state = 5u; +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (self->private_impl.f_rle_delta_x > 0u) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x))); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x))); +- self->private_impl.f_rle_delta_x = 0u; +- if (self->private_impl.f_dst_x > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- } +- if (v_code > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_code -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- while (true) { +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- if (v_code <= 0u) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x))); +- break; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_code -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- v_rle_state = 0u; +- goto label__middle__continue; +- } +- } +- label__goto_suspend__break:; +- self->private_impl.f_rle_state = v_rle_state; +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- } +- label__outer__break:; +- while (self->private_impl.f_dst_y < self->private_impl.f_height) { +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; ++ __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); ++ __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); ++ __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); ++ __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); ++ __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); ++ __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); + +- return status; +-} ++ __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); ++ __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); ++ __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); ++ __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); + +-// -------- func bmp.decoder.swizzle_bitfields ++ __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); ++ __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); ++ __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); ++ __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_bitfields( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // § Note the swapped B and R channels. ++ __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve); ++ __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd); ++ __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF); ++ __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint32_t v_p1 = 0; +- uint32_t v_p1_temp = 0; +- uint32_t v_num_bits = 0; +- uint32_t v_c = 0; +- uint32_t v_c32 = 0; +- uint32_t v_channel = 0; ++ __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); ++ __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); ++ __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); ++ __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); ++ __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); ++ __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); ++ __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- label__outer__continue:; +- while (true) { +- while (self->private_impl.f_pending_pad > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- self->private_impl.f_pending_pad -= 1u; +- iop_a_src += 1u; +- } +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- if (self->private_impl.f_height > 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- } +- goto label__outer__break; +- } else if (self->private_impl.f_pad_per_row != 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- goto label__outer__continue; +- } +- } +- v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)); +- v_p1 = wuffs_base__u32__min(v_p1_temp, 256u); +- v_p0 = 0u; +- while (v_p0 < v_p1) { +- if (self->private_impl.f_bits_per_pixel == 16u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- break; +- } +- v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- break; +- } +- v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- } +- v_channel = 0u; +- while (v_channel < 4u) { +- if (self->private_impl.f_channel_num_bits[v_channel] == 0u) { +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u; +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u; +- } else { +- v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]); +- v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel])); +- while (v_num_bits < 16u) { +- v_c |= ((uint32_t)(v_c << v_num_bits)); +- v_num_bits *= 2u; +- } +- v_c >>= (v_num_bits - 16u); +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u))); +- } +- v_channel += 1u; +- } +- v_p0 += 1u; +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_n = ((uint64_t)(v_p0)); +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8u * v_p0))); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- } +- label__outer__break:; +- status = wuffs_base__make_status(NULL); +- goto ok; ++ __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); ++ __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); ++ __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); ++ __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); + +- return status; ++ uint32_t n = 32u - (31u & (x - x_end)); ++ dst_iter += 4u * n; ++ up0 += n; ++ up1 += n; ++ up2 += n; ++ x += n; ++ } + } + +-// -------- func bmp.decoder.swizzle_low_bit_depth ++#if defined(__GNUC__) && !defined(__clang__) ++// No-op. ++#else ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_low_bit_depth( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // ++ (4u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + 7u) >> 4u); ++ return dst_ptr; ++ } + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint32_t v_chunk_bits = 0; +- uint32_t v_chunk_count = 0; +- uint32_t v_pixels_per_chunk = 0; ++ uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. ++ uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ if (src_len <= 0u) { ++ return dst_ptr; ++ } + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); +- v_pixels_per_chunk = 32u; +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); +- v_pixels_per_chunk = 16u; +- } else { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); +- v_pixels_per_chunk = 8u; +- } +- while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) { +- iop_a_src += 256u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64u)))); +- v_chunk_count -= 64u; +- } +- while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) { +- iop_a_src += 32u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8u)))); +- v_chunk_count -= 8u; +- } +- while (v_chunk_count > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- iop_a_src += 4u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1u)))); +- v_chunk_count -= 1u; +- } +- continue; +- } +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); +- v_p0 = 0u; +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u)))); +- self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u)))); +- self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u)))); +- self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u)))); +- self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u)))); +- self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u)))); +- self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u)))); +- self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u)))); +- self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u)))); +- self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u)))); +- self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u)))); +- self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u)))); +- self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u)))); +- self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u)))); +- self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u)))); +- self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u)))); +- self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u)))); +- self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u)))); +- self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 32u); +- v_chunk_count -= 1u; +- } +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u)))); +- self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u)))); +- self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u)))); +- self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u)))); +- self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 16u); +- v_chunk_count -= 1u; +- } +- } else { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 8u); +- v_chunk_count -= 1u; +- } +- } +- v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bmp.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_bmp__decoder__frame_dirty_rect( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ if (last_column) { ++ src_len--; + } + +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} ++ if (src_len < 32) { ++ // This fallback is the same as the non-SIMD-capable code path. ++ for (; src_len > 0u; src_len--) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; + +-// -------- func bmp.decoder.num_animation_loops ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_bmp__decoder__num_animation_loops( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ } else { ++ while (src_len > 0u) { ++ // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor ++ // (nxx) rows. ++ // ++ // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31] // p0 = "plus 0" ++ // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31] // p0 = "plus 0" ++ // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30] // m1 = "minus 1" ++ // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30] // m1 = "minus 1" ++ // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32] // p1 = "plus 1" ++ // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32] // p1 = "plus 1" ++ __m256i major_p0 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0)); ++ __m256i minor_p0 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0)); ++ __m256i major_m1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1)); ++ __m256i minor_m1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1)); ++ __m256i major_p1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1)); ++ __m256i minor_p1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1)); + +- return 0u; +-} ++ // Unpack, staying with u8x32 vectors. ++ // ++ // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07 j16 n16 j17 n17 .. j23 n23] ++ // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15 j24 n24 j25 n25 .. j31 n31] ++ // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06 j15 n15 j16 n16 .. j22 n22] ++ // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14 j23 n23 j24 n24 .. j30 n30] ++ // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08 j17 n17 j18 n18 .. j24 n24] ++ // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16 j25 n25 j26 n26 .. j32 n32] ++ __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0); ++ __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0); ++ __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1); ++ __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1); ++ __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1); ++ __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1); + +-// -------- func bmp.decoder.num_decoded_frame_configs ++ // Multiply-add to get u16x16 vectors. ++ // ++ // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23] ++ // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31] ++ // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22] ++ // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30] ++ // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24] ++ // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32] ++ const __m256i k0309 = _mm256_set1_epi16(0x0309); ++ const __m256i k0103 = _mm256_set1_epi16(0x0103); ++ __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309); ++ __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309); ++ __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103); ++ __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103); ++ __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103); ++ __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__num_decoded_frame_configs( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Compute the weighted sums of (p0, m1) and (p0, p1). For example: ++ // ++ // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16 ++ // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16 ++ __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo); ++ __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi); ++ __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo); ++ __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi); + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} ++ // Bias by 8 (on the left) or 7 (on the right) and then divide by 16 ++ // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift ++ // the u16 right value by 4. On the right (p1), shift right by 4 and then ++ // shift left by 8 so that, when still in the u16x16 little-endian ++ // interpretation, we have: ++ // - m1_element = (etcetera + 8) >> 4 ++ // - p1_element = ((etcetera + 7) >> 4) << 8 ++ // ++ // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??] ++ // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00] ++ // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??] ++ // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00] ++ __m256i step4_m1_lo = _mm256_srli_epi16( ++ _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4); ++ __m256i step4_p1_lo = _mm256_slli_epi16( ++ _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)), ++ 4), ++ 8); ++ __m256i step4_m1_hi = _mm256_srli_epi16( ++ _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4); ++ __m256i step4_p1_hi = _mm256_slli_epi16( ++ _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)), ++ 4), ++ 8); + +-// -------- func bmp.decoder.num_decoded_frames ++ // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do ++ // that twice. Once for the low columns and once for the high columns. ++ // ++ // In terms of jxx (major row) or nxx (minor row) source samples: ++ // - low columns means ( 0 .. 8; 16 .. 24). ++ // - high columns means ( 8 .. 16; 24 .. 32). ++ // ++ // In terms of dxx destination samples (there are twice as many): ++ // - low columns means ( 0 .. 16; 32 .. 48). ++ // - high columns means (16 .. 32; 48 .. 64). ++ // ++ // step5_lo = [d00 d01 .. d14 d15 d32 d33 .. d46 d47] ++ // step5_hi = [d16 d17 .. d30 d31 d48 d49 .. d62 d63] ++ // ++ // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums. ++ // The d01, d03 ... d63 odd elements come from (p0, p1) weighted sums. ++ __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo); ++ __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__num_decoded_frames( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Permute and store. ++ // ++ // step6_00_31 = [d00 d01 .. d14 d15 d16 d17 .. d30 d31] ++ // step6_32_63 = [d32 d33 .. d46 d47 d48 d49 .. d62 d63] ++ __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20); ++ __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31); ++ _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31); ++ _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63); + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; ++ // Advance by up to 32 source samples (64 destination samples). The first ++ // iteration might be smaller than 32 so that all of the remaining steps ++ // are exactly 32. ++ size_t n = 32u - (31u & (0u - src_len)); ++ dp += 2u * n; ++ sp_major += n; ++ sp_minor += n; ++ src_len -= n; ++ } + } +- return 0u; +-} + +-// -------- func bmp.decoder.restart_frame ++ if (last_column) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. ++ uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__restart_frame( +- wuffs_bmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; +- return wuffs_base__make_status(NULL); ++ return dst_ptr; + } ++#endif ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-// -------- func bmp.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_bmp__decoder__set_report_metadata( +- wuffs_bmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +-// -------- func bmp.decoder.tell_me_more ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ---------------- Unicode and UTF-8 + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) { ++ if (code_point <= 0x7F) { ++ if (dst.len >= 1) { ++ dst.ptr[0] = (uint8_t)(code_point); ++ return 1; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ } else if (code_point <= 0x07FF) { ++ if (dst.len >= 2) { ++ dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 2; ++ } + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } else if (code_point <= 0xFFFF) { ++ if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) { ++ dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); ++ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 3; + } + +- ok: +- self->private_impl.p_tell_me_more[0] = 0; +- goto exit; ++ } else if (code_point <= 0x10FFFF) { ++ if (dst.len >= 4) { ++ dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F)); ++ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); ++ dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 4; ++ } + } + +- goto suspend; +- suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ return 0; + } + +-// -------- func bmp.decoder.do_tell_me_more +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a ++// UTF-8 encoded code point, based on the encoding's initial byte. ++// - 0x00 is 1-byte UTF-8 (ASCII). ++// - 0x01 is the start of 2-byte UTF-8. ++// - 0x02 is the start of 3-byte UTF-8. ++// - 0x03 is the start of 4-byte UTF-8. ++// - 0x40 is a UTF-8 tail byte. ++// - 0x80 is invalid UTF-8. ++// ++// RFC 3629 (UTF-8) gives this grammar for valid UTF-8: ++// UTF8-1 = %x00-7F ++// UTF8-2 = %xC2-DF UTF8-tail ++// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / ++// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) ++// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / ++// %xF4 %x80-8F 2( UTF8-tail ) ++// UTF8-tail = %x80-BF ++static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. + +- if (self->private_impl.f_io_redirect_fourcc <= 1u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- } +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 1u, +- self->private_impl.f_io_redirect_fourcc, +- 0u, +- self->private_impl.f_io_redirect_pos, +- 18446744073709551615u); +- } +- self->private_impl.f_io_redirect_fourcc = 1u; ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- goto ok; +- ok: +- goto exit; +- exit: +- return status; +-} ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF. + +-// -------- func bmp.decoder.history_retain_length ++ 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF. ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7. ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF. ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__history_retain_length( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // ++wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) { ++ if (s_len == 0) { ++ return wuffs_base__make_utf_8__next__output(0, 0); + } ++ uint32_t c = s_ptr[0]; ++ switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) { ++ case 0: ++ return wuffs_base__make_utf_8__next__output(c, 1); + +- return 0u; +-} ++ case 1: ++ if (s_len < 2) { ++ break; ++ } ++ c = wuffs_base__peek_u16le__no_bounds_check(s_ptr); ++ if ((c & 0xC000) != 0x8000) { ++ break; ++ } ++ c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8)); ++ return wuffs_base__make_utf_8__next__output(c, 2); + +-// -------- func bmp.decoder.workbuf_len ++ case 2: ++ if (s_len < 3) { ++ break; ++ } ++ c = wuffs_base__peek_u24le__no_bounds_check(s_ptr); ++ if ((c & 0xC0C000) != 0x808000) { ++ break; ++ } ++ c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) | ++ (0x00003F & (c >> 16)); ++ if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) { ++ break; ++ } ++ return wuffs_base__make_utf_8__next__output(c, 3); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_bmp__decoder__workbuf_len( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ case 3: ++ if (s_len < 4) { ++ break; ++ } ++ c = wuffs_base__peek_u32le__no_bounds_check(s_ptr); ++ if ((c & 0xC0C0C000) != 0x80808000) { ++ break; ++ } ++ c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) | ++ (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24)); ++ if ((c <= 0xFFFF) || (0x110000 <= c)) { ++ break; ++ } ++ return wuffs_base__make_utf_8__next__output(c, 4); + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__make_utf_8__next__output( ++ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); + } + +-// -------- func bmp.decoder.read_palette +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__read_palette( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- uint32_t v_argb = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_read_palette[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_read_palette[0].v_i; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // ++wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) { ++ if (s_len == 0) { ++ return wuffs_base__make_utf_8__next__output(0, 0); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ const uint8_t* ptr = &s_ptr[s_len - 1]; ++ if (*ptr < 0x80) { ++ return wuffs_base__make_utf_8__next__output(*ptr, 1); + +- if (self->private_impl.f_bitmap_info_len == 12u) { +- while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) { +- self->private_impl.f_padding -= 3u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_read_palette[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 16) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_argb = t_0; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ } else if (*ptr < 0xC0) { ++ const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0]; ++ uint32_t n = 1; ++ while (ptr != too_far) { ++ ptr--; ++ n++; ++ if (*ptr < 0x80) { ++ break; ++ } else if (*ptr < 0xC0) { ++ continue; + } +- } else { +- while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) { +- self->private_impl.f_padding -= 4u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_read_palette[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- v_argb = t_1; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n); ++ if (o.byte_length != n) { ++ break; + } ++ return o; + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_read_palette[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_read_palette[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_read_palette[0].v_i = v_i; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return status; ++ return wuffs_base__make_utf_8__next__output( ++ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); + } + +-// -------- func bmp.decoder.process_masks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__process_masks( +- wuffs_bmp__decoder* self) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- uint32_t v_mask = 0; +- uint32_t v_n = 0; +- +- while (v_i < 4u) { +- v_mask = self->private_impl.f_channel_masks[v_i]; +- if (v_mask != 0u) { +- v_n = 0u; +- while ((v_mask & 1u) == 0u) { +- v_n += 1u; +- v_mask >>= 1u; +- } +- self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u))); +- v_n = 0u; +- while ((v_mask & 1u) == 1u) { +- v_n += 1u; +- v_mask >>= 1u; +- } +- if ((v_mask != 0u) || (v_n > 32u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n)); +- } else if (v_i != 3u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { ++ // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time). ++ // ++ // TODO: possibly optimize this by manually inlining the ++ // wuffs_base__utf_8__next calls. ++ size_t original_len = s_len; ++ while (s_len > 0) { ++ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len); ++ if ((o.code_point > 0x7F) && (o.byte_length == 1)) { ++ break; + } +- v_i += 1u; ++ s_ptr += o.byte_length; ++ s_len -= o.byte_length; + } ++ return original_len - s_len; ++} + +- goto ok; +- ok: +- goto exit; +- exit: +- return status; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { ++ // TODO: possibly optimize this by checking 4 or 8 bytes at a time. ++ const uint8_t* original_ptr = s_ptr; ++ const uint8_t* p = s_ptr; ++ const uint8_t* q = s_ptr + s_len; ++ for (; (p != q) && ((*p & 0x80) == 0); p++) { ++ } ++ return (size_t)(p - original_ptr); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-// ---------------- Status Codes Implementations ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +-const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; +-const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; +-const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; +-const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; +-const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; +-const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; +-const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; +-const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input"; +-const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; +-const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; ++// ---------------- Status Codes Implementations + + // ---------------- Private Consts + +-static const uint8_t +-WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 2, 3, 4, 5, 5, 5, +-}; +- +-static const uint32_t +-WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, +- 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, +- 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, +- 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, +- 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, +- 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, +- 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, +- 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, +- 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, +- 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, +- 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, +- 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, +- 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, +- 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, +- 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, +- 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, +- 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, +- 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, +- 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, +- 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, +- 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, +- 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, +- 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, +- 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, +- 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, +- 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, +- 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, +- 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, +- 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, +- 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, +- 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, +- 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188, +-}; +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__do_transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__prepare_block( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__read_code_lengths( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__build_huffman_tree( +- wuffs_bzip2__decoder* self, +- uint32_t a_which); +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__build_huffman_table( +- wuffs_bzip2__decoder* self, +- uint32_t a_which); ++wuffs_adler32__hasher__up( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__invert_bwt( +- wuffs_bzip2__decoder* self); ++wuffs_adler32__hasher__up__choosy_default( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__flush_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__flush_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_adler32__hasher__up_arm_neon( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_x86_sse42( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + + // ---------------- VTables + +-const wuffs_base__io_transformer__func_ptrs +-wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_bzip2__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_bzip2__decoder__history_retain_length), ++ uint32_t))(&wuffs_adler32__hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_bzip2__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), ++ uint64_t))(&wuffs_adler32__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_adler32__hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_bzip2__decoder__initialize( +- wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__initialize( ++ wuffs_adler32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -30559,23 +30841,25 @@ wuffs_bzip2__decoder__initialize( + } + } + ++ self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default; ++ + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_bzip2__decoder* +-wuffs_bzip2__decoder__alloc(void) { +- wuffs_bzip2__decoder* x = +- (wuffs_bzip2__decoder*)(calloc(sizeof(wuffs_bzip2__decoder), 1)); ++wuffs_adler32__hasher* ++wuffs_adler32__hasher__alloc(void) { ++ wuffs_adler32__hasher* x = ++ (wuffs_adler32__hasher*)(calloc(1, sizeof(wuffs_adler32__hasher))); + if (!x) { + return NULL; + } +- if (wuffs_bzip2__decoder__initialize( +- x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_adler32__hasher__initialize( ++ x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -30583,18 +30867,18 @@ wuffs_bzip2__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_bzip2__decoder(void) { +- return sizeof(wuffs_bzip2__decoder); ++sizeof__wuffs_adler32__hasher(void) { ++ return sizeof(wuffs_adler32__hasher); + } + + // ---------------- Function Implementations + +-// -------- func bzip2.decoder.get_quirk ++// -------- func adler32.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__get_quirk( +- const wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__get_quirk( ++ const wuffs_adler32__hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -30607,12 +30891,12 @@ wuffs_bzip2__decoder__get_quirk( + return 0u; + } + +-// -------- func bzip2.decoder.set_quirk ++// -------- func adler32.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bzip2__decoder__set_quirk( +- wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__set_quirk( ++ wuffs_adler32__hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -30625,369 +30909,699 @@ wuffs_bzip2__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func bzip2.decoder.history_retain_length ++// -------- func adler32.hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__history_retain_length( +- const wuffs_bzip2__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_adler32__hasher__update( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; ++ if ( ! self->private_impl.f_started) { ++ self->private_impl.f_started = true; ++ self->private_impl.f_state = 1u; ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); ++ } ++ wuffs_adler32__hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func bzip2.decoder.workbuf_len ++// -------- func adler32.hasher.update_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_bzip2__decoder__workbuf_len( +- const wuffs_bzip2__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_adler32__hasher__update_u32( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ wuffs_adler32__hasher__update(self, a_x); ++ return self->private_impl.f_state; + } + +-// -------- func bzip2.decoder.transform_io ++// -------- func adler32.hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bzip2__decoder__transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up__choosy_default( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); +- v_status = t_0; ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5552u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u); ++ } ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input); +- goto exit; ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_p.len = 0; + } +- +- ok: +- self->private_impl.p_transform_io[0] = 0; +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; + } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- func adler32.hasher.checksum_u32 + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_adler32__hasher__checksum_u32( ++ const wuffs_adler32__hasher* self) { ++ if (!self) { ++ return 0; + } +- return status; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return self->private_impl.f_state; + } + +-// -------- func bzip2.decoder.do_transform_io ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func adler32.hasher.up_arm_neon + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__do_transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint64_t v_tag = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_final_checksum_want = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_arm_neon( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8x16_t v_p__left = {0}; ++ uint8x16_t v_p_right = {0}; ++ uint32x4_t v_v1 = {0}; ++ uint32x4_t v_v2 = {0}; ++ uint16x8_t v_col0 = {0}; ++ uint16x8_t v_col1 = {0}; ++ uint16x8_t v_col2 = {0}; ++ uint16x8_t v_col3 = {0}; ++ uint32x2_t v_sum1 = {0}; ++ uint32x2_t v_sum2 = {0}; ++ uint32x2_t v_sum12 = {0}; ++ uint32_t v_num_iterate_bytes = 0; ++ uint64_t v_tail_index = 0; + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_transform_io[0].v_i; +- v_tag = self->private_data.s_do_transform_io[0].v_tag; +- v_final_checksum_want = self->private_data.s_do_transform_io[0].v_final_checksum_want; ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s1 += ((uint32_t)(a_x.ptr[0u])); ++ v_s2 += v_s1; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 66u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5536u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); + } ++ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); ++ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); ++ v_v1 = vdupq_n_u32(0u); ++ v_v2 = vdupq_n_u32(0u); ++ v_col0 = vdupq_n_u16(0u); ++ v_col1 = vdupq_n_u16(0u); ++ v_col2 = vdupq_n_u16(0u); ++ v_col3 = vdupq_n_u16(0u); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_p__left = vld1q_u8(v_p.ptr); ++ v_p_right = vld1q_u8(v_p.ptr + 16u); ++ v_v2 = vaddq_u32(v_v2, v_v1); ++ v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right)); ++ v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left)); ++ v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left)); ++ v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right)); ++ v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right)); ++ v_p.ptr += 32; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 90u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_p.len = 0; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_v2 = vshlq_n_u32(v_v2, 5u); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u})); ++ v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1)); ++ v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2)); ++ v_sum12 = vpadd_u32(v_sum1, v_sum2); ++ v_s1 += vget_lane_u32(v_sum12, 0u); ++ v_s2 += vget_lane_u32(v_sum12, 1u); ++ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); ++ if (v_tail_index < ((uint64_t)(a_x.len))) { ++ { ++ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; + } +- if (v_c != 104u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; ++ } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon ++ ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func adler32.hasher.up_x86_sse42 ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_x86_sse42( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; ++ __m128i v_zeroes = {0}; ++ __m128i v_ones = {0}; ++ __m128i v_weights__left = {0}; ++ __m128i v_weights_right = {0}; ++ __m128i v_q__left = {0}; ++ __m128i v_q_right = {0}; ++ __m128i v_v1 = {0}; ++ __m128i v_v2 = {0}; ++ __m128i v_v2j = {0}; ++ __m128i v_v2k = {0}; ++ uint32_t v_num_iterate_bytes = 0; ++ uint64_t v_tail_index = 0; ++ ++ v_zeroes = _mm_set1_epi16((int16_t)(0u)); ++ v_ones = _mm_set1_epi16((int16_t)(1u)); ++ v_weights__left = _mm_set_epi8((int8_t)(17u), (int8_t)(18u), (int8_t)(19u), (int8_t)(20u), (int8_t)(21u), (int8_t)(22u), (int8_t)(23u), (int8_t)(24u), (int8_t)(25u), (int8_t)(26u), (int8_t)(27u), (int8_t)(28u), (int8_t)(29u), (int8_t)(30u), (int8_t)(31u), (int8_t)(32u)); ++ v_weights_right = _mm_set_epi8((int8_t)(1u), (int8_t)(2u), (int8_t)(3u), (int8_t)(4u), (int8_t)(5u), (int8_t)(6u), (int8_t)(7u), (int8_t)(8u), (int8_t)(9u), (int8_t)(10u), (int8_t)(11u), (int8_t)(12u), (int8_t)(13u), (int8_t)(14u), (int8_t)(15u), (int8_t)(16u)); ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5536u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); + } ++ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); ++ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); ++ v_v1 = _mm_setzero_si128(); ++ v_v2j = _mm_setzero_si128(); ++ v_v2k = _mm_setzero_si128(); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c < 49u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; +- } +- self->private_impl.f_max_incl_block_size = (((uint32_t)((v_c - 48u))) * 100000u); +- while (true) { +- v_tag = 0u; +- v_i = 0u; +- while (v_i < 48u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- v_tag <<= 1u; +- v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u))); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if (v_tag == 25779555029136u) { +- break; +- } else if (v_tag != 54156738319193u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_bzip2__decoder__prepare_block(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_block_size = 0u; +- self->private_impl.f_decode_huffman_finished = false; +- self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[0u] & 7u)]; +- self->private_impl.f_decode_huffman_ticks = 50u; +- self->private_impl.f_decode_huffman_section = 0u; +- self->private_impl.f_decode_huffman_run_shift = 0u; +- while ( ! self->private_impl.f_decode_huffman_finished) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } else if (self->private_impl.f_decode_huffman_finished) { +- break; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- wuffs_bzip2__decoder__invert_bwt(self); +- self->private_impl.f_block_checksum_have = 4294967295u; +- if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; +- } +- self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u); +- self->private_impl.f_flush_repeat_count = 0u; +- self->private_impl.f_flush_prev = 0u; +- while (self->private_impl.f_block_size > 0u) { +- wuffs_bzip2__decoder__flush_fast(self, a_dst); +- if (self->private_impl.f_block_size <= 0u) { +- break; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_bzip2__decoder__flush_slow(self, a_dst); +- if (status.repr) { +- goto suspend; +- } +- } +- self->private_impl.f_block_checksum_have ^= 4294967295u; +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); +- goto exit; ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr)); ++ v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)); ++ v_v2j = _mm_add_epi32(v_v2j, v_v1); ++ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes)); ++ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes)); ++ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left))); ++ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right))); ++ v_p.ptr += 32; + } +- self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31u) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1u)))); ++ v_p.len = 0; + } +- v_final_checksum_want = 0u; +- v_i = 0u; +- while (v_i < 32u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; ++ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u))); ++ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u))); ++ v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1))); ++ v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u))); ++ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u))); ++ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u))); ++ v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2))); ++ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); ++ if (v_tail_index < ((uint64_t)(a_x.len))) { ++ { ++ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_p.len = 0; + } +- v_final_checksum_want <<= 1u; +- v_final_checksum_want |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; + } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); +- goto exit; +- } +- +- goto ok; +- ok: +- self->private_impl.p_do_transform_io[0] = 0; +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; + } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- goto suspend; +- suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_i = v_i; +- self->private_data.s_do_transform_io[0].v_tag = v_tag; +- self->private_data.s_do_transform_io[0].v_final_checksum_want = v_final_checksum_want; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +- return status; +-} ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +-// -------- func bzip2.decoder.prepare_block ++// ---------------- Status Codes Implementations + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__prepare_block( +- wuffs_bzip2__decoder* self, ++const char wuffs_bmp__error__bad_header[] = "#bmp: bad header"; ++const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression"; ++const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input"; ++const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file"; ++const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_BMP__COMPRESSION_NONE 0u ++ ++#define WUFFS_BMP__COMPRESSION_RLE8 1u ++ ++#define WUFFS_BMP__COMPRESSION_RLE4 2u ++ ++#define WUFFS_BMP__COMPRESSION_BITFIELDS 3u ++ ++#define WUFFS_BMP__COMPRESSION_JPEG 4u ++ ++#define WUFFS_BMP__COMPRESSION_PNG 5u ++ ++#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6u ++ ++#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256u ++ ++#define WUFFS_BMP__RLE_STATE_NEUTRAL 0u ++ ++#define WUFFS_BMP__RLE_STATE_RUN 1u ++ ++#define WUFFS_BMP__RLE_STATE_ESCAPE 2u ++ ++#define WUFFS_BMP__RLE_STATE_LITERAL 3u ++ ++#define WUFFS_BMP__RLE_STATE_DELTA_X 4u ++ ++#define WUFFS_BMP__RLE_STATE_DELTA_Y 5u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_none( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_rle( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_bitfields( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_low_bit_depth( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__read_palette( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__process_masks( ++ wuffs_bmp__decoder* self); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_bmp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_bmp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_bmp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_bmp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_bmp__decoder__initialize( ++ wuffs_bmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_bmp__decoder* ++wuffs_bmp__decoder__alloc(void) { ++ wuffs_bmp__decoder* x = ++ (wuffs_bmp__decoder*)(calloc(1, sizeof(wuffs_bmp__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_bmp__decoder__initialize( ++ x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_bmp__decoder(void) { ++ return sizeof(wuffs_bmp__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func bmp.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__get_quirk( ++ const wuffs_bmp__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func bmp.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__set_quirk( ++ wuffs_bmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func bmp.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_selector = 0; +- uint32_t v_sel_ff = 0; +- uint8_t v_movee = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func bmp.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_magic = 0; ++ uint32_t v_width = 0; ++ uint32_t v_height = 0; ++ uint32_t v_planes = 0; ++ uint32_t v_n = 0; ++ uint32_t v_dst_pixfmt = 0; ++ uint32_t v_byte_width = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -30999,797 +31613,1141 @@ wuffs_bzip2__decoder__prepare_block( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_prepare_block[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_prepare_block[0].v_i; +- v_selector = self->private_data.s_prepare_block[0].v_selector; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_block_checksum_want = 0u; +- v_i = 0u; +- while (v_i < 32u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_io_redirect_fourcc != 0u) { ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- self->private_impl.f_block_checksum_want <<= 1u; +- self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 8) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_magic = t_0; + } +- if ((self->private_impl.f_bits >> 31u) != 0u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); ++ if (v_magic != 19778u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- self->private_impl.f_original_pointer = 0u; +- v_i = 0u; +- while (v_i < 24u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ self->private_data.s_do_decode_image_config.scratch = 8u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- self->private_impl.f_original_pointer <<= 1u; +- self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; ++ self->private_impl.f_padding = t_1; + } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_data.f_presence[v_i] = 0u; +- v_i += 1u; ++ if (self->private_impl.f_padding < 14u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; + } +- v_i = 0u; +- while (v_i < 256u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ self->private_impl.f_padding -= 14u; ++ self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- if ((self->private_impl.f_bits >> 31u) != 0u) { +- self->private_data.f_presence[v_i] = 1u; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 16u; ++ self->private_impl.f_bitmap_info_len = t_2; + } +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 256u) { +- if (self->private_data.f_presence[v_i] == 0u) { +- v_i += 16u; +- continue; +- } +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len; ++ if (self->private_impl.f_bitmap_info_len == 12u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- self->private_data.f_scratch += (self->private_impl.f_bits >> 31u); +- self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u))); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- if ((v_i & 15u) == 0u) { +- break; + } ++ self->private_impl.f_width = t_3; + } +- } +- if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u); +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 3u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ self->private_impl.f_height = t_4; + } +- self->private_data.f_scratch <<= 1u; +- self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 15u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)) << 56; + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_planes = t_5; + } +- self->private_data.f_scratch <<= 1u; +- self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_sections = self->private_data.f_scratch; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_huffman_codes) { +- self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_sections) { +- v_selector = 0u; +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_7 = *iop_a_src++; +- v_c = t_7; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- break; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_selector += 1u; +- if (v_selector >= self->private_impl.f_num_huffman_codes) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; ++ self->private_impl.f_bits_per_pixel = t_6; ++ } ++ } else if (self->private_impl.f_bitmap_info_len == 16u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } + } ++ v_width = t_7; + } +- if (v_selector == 0u) { +- self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u]; +- } else { +- v_sel_ff = (v_selector & 255u); +- v_movee = self->private_data.f_mtft[v_sel_ff]; +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); +- self->private_data.f_mtft[0u] = v_movee; +- self->private_data.f_huffman_selectors[v_i] = v_movee; ++ if (v_width > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_width > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; + } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_huffman_codes) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.f_width = v_width; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ uint32_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 24) { ++ t_8 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_height = t_8; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ if (v_height > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ self->private_impl.f_height = v_height; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; ++ if (num_bits_9 == 8) { ++ t_9 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)) << 56; ++ } ++ } ++ v_planes = t_9; + } +- v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- wuffs_bzip2__decoder__build_huffman_table(self, v_i); +- v_i += 1u; +- } +- v_i = 0u; +- v_j = 0u; +- while (v_i < 256u) { +- if (self->private_data.f_presence[v_i] != 0u) { +- self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i)); +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_data.f_letter_counts[v_i] = 0u; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_prepare_block[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_prepare_block[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_prepare_block[0].v_i = v_i; +- self->private_data.s_prepare_block[0].v_selector = v_selector; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bzip2.decoder.read_code_lengths +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__read_code_lengths( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_code_length = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_read_code_lengths[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_read_code_lengths[0].v_i; +- v_code_length = self->private_data.s_read_code_lengths[0].v_code_length; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.f_code_lengths_bitmask = 0u; +- v_i = 0u; +- while (v_i < 5u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ uint32_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; ++ if (num_bits_10 == 8) { ++ t_10 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)) << 56; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ self->private_impl.f_bits_per_pixel = t_10; + } +- v_code_length <<= 1u; +- v_code_length |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_symbols) { +- while (true) { +- if ((v_code_length < 1u) || (20u < v_code_length)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ uint32_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; ++ if (num_bits_11 == 24) { ++ t_11 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- break; +- } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ v_width = t_11; ++ } ++ if (v_width > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_width > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_width; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ uint32_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; ++ if (num_bits_12 == 24) { ++ t_12 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- v_code_length += 1u; ++ v_height = t_12; ++ } ++ if (v_height == 2147483648u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_height > 2147483648u) { ++ v_height = ((uint32_t)(0u - v_height)); ++ if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_height; ++ self->private_impl.f_top_down = true; ++ } else if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } else { ++ self->private_impl.f_height = v_height; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ uint32_t t_13; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; + } else { +- v_code_length -= 1u; ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13; ++ if (num_bits_13 == 8) { ++ t_13 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_13 += 8u; ++ *scratch |= ((uint64_t)(num_bits_13)) << 56; ++ } + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; ++ v_planes = t_13; + } +- self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u)); +- self->private_data.f_bwt[v_i] = v_code_length; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_read_code_lengths[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_read_code_lengths[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_read_code_lengths[0].v_i = v_i; +- self->private_data.s_read_code_lengths[0].v_code_length = v_code_length; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bzip2.decoder.build_huffman_tree +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__build_huffman_tree( +- wuffs_bzip2__decoder* self, +- uint32_t a_which) { +- uint32_t v_code_length = 0; +- uint32_t v_symbol_index = 0; +- uint32_t v_num_branch_nodes = 0; +- uint32_t v_stack_height = 0; +- uint32_t v_stack_values[21] = {0}; +- uint32_t v_node_index = 0; +- uint16_t v_leaf_value = 0; +- +- self->private_data.f_huffman_trees[a_which][0u][0u] = 0u; +- self->private_data.f_huffman_trees[a_which][0u][1u] = 0u; +- v_num_branch_nodes = 1u; +- v_stack_height = 1u; +- v_stack_values[0u] = 0u; +- v_code_length = 1u; +- while (v_code_length <= 20u) { +- if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) { +- v_code_length += 1u; +- continue; +- } +- v_symbol_index = 0u; +- while (v_symbol_index < self->private_impl.f_num_symbols) { +- if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { +- v_symbol_index += 1u; +- continue; ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- while (true) { +- if (v_stack_height <= 0u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); +- } else if (v_stack_height >= v_code_length) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ uint32_t t_14; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14; ++ if (num_bits_14 == 8) { ++ t_14 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_14 += 8u; ++ *scratch |= ((uint64_t)(num_bits_14)) << 56; ++ } + } +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { +- self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes)); ++ self->private_impl.f_bits_per_pixel = t_14; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ uint32_t t_15; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; ++ if (num_bits_15 == 24) { ++ t_15 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_15 += 8u; ++ *scratch |= ((uint64_t)(num_bits_15)) << 56; ++ } + } +- if (v_num_branch_nodes >= 257u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ self->private_impl.f_compression = t_15; ++ } ++ if (self->private_impl.f_bits_per_pixel == 0u) { ++ if (self->private_impl.f_compression == 4u) { ++ self->private_impl.f_io_redirect_fourcc = 1246774599u; ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; ++ } else if (self->private_impl.f_compression == 5u) { ++ self->private_impl.f_io_redirect_fourcc = 1347307296u; ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; + } +- v_stack_values[v_stack_height] = v_num_branch_nodes; +- self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u; +- self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u; +- v_num_branch_nodes += 1u; +- v_stack_height += 1u; ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (v_symbol_index < 2u) { +- v_leaf_value = ((uint16_t)((769u + v_symbol_index))); +- } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) { +- v_leaf_value = ((uint16_t)((511u + v_symbol_index))); +- } else { +- v_leaf_value = 768u; ++ self->private_data.s_do_decode_image_config.scratch = 20u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { +- self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value; +- } else { +- self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value; +- v_stack_height -= 1u; +- while (v_stack_height > 0u) { +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) { +- break; ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ if (self->private_impl.f_bitmap_info_len == 40u) { ++ if (self->private_impl.f_bits_per_pixel >= 16u) { ++ if (self->private_impl.f_padding >= 16u) { ++ self->private_impl.f_bitmap_info_len = 56u; ++ self->private_impl.f_padding -= 16u; ++ } else if (self->private_impl.f_padding >= 12u) { ++ self->private_impl.f_bitmap_info_len = 52u; ++ self->private_impl.f_padding -= 12u; + } +- v_stack_height -= 1u; + } ++ } else if ((self->private_impl.f_bitmap_info_len != 52u) && ++ (self->private_impl.f_bitmap_info_len != 56u) && ++ (self->private_impl.f_bitmap_info_len != 64u) && ++ (self->private_impl.f_bitmap_info_len != 108u) && ++ (self->private_impl.f_bitmap_info_len != 124u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ if (self->private_impl.f_compression == 6u) { ++ self->private_impl.f_compression = 3u; ++ } ++ if (self->private_impl.f_compression == 3u) { ++ if (self->private_impl.f_bitmap_info_len >= 52u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35); ++ uint32_t t_16; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; ++ if (num_bits_16 == 24) { ++ t_16 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_16 += 8u; ++ *scratch |= ((uint64_t)(num_bits_16)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[2u] = t_16; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37); ++ uint32_t t_17; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17; ++ if (num_bits_17 == 24) { ++ t_17 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_17 += 8u; ++ *scratch |= ((uint64_t)(num_bits_17)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[1u] = t_17; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39); ++ uint32_t t_18; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; ++ if (num_bits_18 == 24) { ++ t_18 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_18 += 8u; ++ *scratch |= ((uint64_t)(num_bits_18)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[0u] = t_18; ++ } ++ if (self->private_impl.f_bitmap_info_len >= 56u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41); ++ uint32_t t_19; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19; ++ if (num_bits_19 == 24) { ++ t_19 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_19 += 8u; ++ *scratch |= ((uint64_t)(num_bits_19)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[3u] = t_19; ++ } ++ self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ } ++ if ((self->private_impl.f_channel_masks[0u] == 255u) && (self->private_impl.f_channel_masks[1u] == 65280u) && (self->private_impl.f_channel_masks[2u] == 16711680u)) { ++ if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_compression = 0u; ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) { ++ self->private_impl.f_compression = 0u; ++ } ++ } ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44); ++ status = wuffs_bmp__decoder__process_masks(self); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ } else if (self->private_impl.f_bitmap_info_len >= 40u) { ++ v_n = (self->private_impl.f_bitmap_info_len - 40u); ++ self->private_data.s_do_decode_image_config.scratch = v_n; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- v_symbol_index += 1u; + } +- v_code_length += 1u; ++ if (self->private_impl.f_compression != 3u) { ++ if (self->private_impl.f_bits_per_pixel < 16u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46); ++ status = wuffs_bmp__decoder__read_palette(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ } ++ if (self->private_impl.f_compression == 0u) { ++ if ((self->private_impl.f_bits_per_pixel == 1u) || (self->private_impl.f_bits_per_pixel == 2u) || (self->private_impl.f_bits_per_pixel == 4u)) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ self->private_impl.f_compression = 256u; ++ } else if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else if (self->private_impl.f_bits_per_pixel == 16u) { ++ self->private_impl.f_compression = 3u; ++ self->private_impl.f_channel_masks[0u] = 31u; ++ self->private_impl.f_channel_masks[1u] = 992u; ++ self->private_impl.f_channel_masks[2u] = 31744u; ++ self->private_impl.f_channel_masks[3u] = 0u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47); ++ status = wuffs_bmp__decoder__process_masks(self); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } else if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_src_pixfmt = 2147485832u; ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ if (self->private_impl.f_channel_masks[3u] == 0u) { ++ self->private_impl.f_src_pixfmt = 2415954056u; ++ } else { ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 1u) { ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 2u) { ++ if (self->private_impl.f_bits_per_pixel == 4u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 3u) { ++ if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) { ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) && ++ (self->private_impl.f_bits_per_pixel != 1u) && ++ (self->private_impl.f_bits_per_pixel != 4u) && ++ (self->private_impl.f_bits_per_pixel != 8u) && ++ (self->private_impl.f_bits_per_pixel != 24u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 4u) { ++ v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 16u) { ++ self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u); ++ } else if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ self->private_impl.f_pad_per_row = 0u; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ v_dst_pixfmt = 2164295816u; ++ if ((self->private_impl.f_channel_num_bits[0u] > 8u) || ++ (self->private_impl.f_channel_num_bits[1u] > 8u) || ++ (self->private_impl.f_channel_num_bits[2u] > 8u) || ++ (self->private_impl.f_channel_num_bits[3u] > 8u)) { ++ v_dst_pixfmt = 2164308923u; ++ } else if (((self->private_impl.f_src_pixfmt == 2198077448u) || (self->private_impl.f_src_pixfmt == 2147485832u) || (self->private_impl.f_src_pixfmt == 2415954056u)) || ((self->private_impl.f_src_pixfmt == 2164308923u) && (self->private_impl.f_channel_masks[3u] == 0u))) { ++ v_dst_pixfmt = 2415954056u; ++ } ++ wuffs_base__image_config__set( ++ a_dst, ++ v_dst_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ (self->private_impl.f_channel_masks[3u] == 0u)); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; + } +- if (v_stack_height != 0u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_status(NULL); ++ ++ return status; + } + +-// -------- func bzip2.decoder.build_huffman_table ++// -------- func bmp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__build_huffman_table( +- wuffs_bzip2__decoder* self, +- uint32_t a_which) { +- uint32_t v_i = 0; +- uint32_t v_bits = 0; +- uint16_t v_n_bits = 0; +- uint16_t v_child = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- while (v_i < 256u) { +- v_bits = (v_i << 24u); +- v_n_bits = 0u; +- v_child = 0u; +- while ((v_child < 257u) && (v_n_bits < 8u)) { +- v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)]; +- v_bits <<= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_n_bits += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)((v_child | (v_n_bits << 12u)))); +- v_i += 1u; ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func bzip2.decoder.invert_bwt ++// -------- func bmp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__invert_bwt( +- wuffs_bzip2__decoder* self) { +- uint32_t v_i = 0; +- uint32_t v_letter = 0; +- uint32_t v_sum = 0; +- uint32_t v_old_sum = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_sum = 0u; +- v_i = 0u; +- while (v_i < 256u) { +- v_old_sum = v_sum; +- v_sum += self->private_data.f_letter_counts[v_i]; +- self->private_data.f_letter_counts[v_i] = v_old_sum; +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_block_size) { +- v_letter = (self->private_data.f_bwt[v_i] & 255u); +- self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u); +- self->private_data.f_letter_counts[v_letter] += 1u; +- v_i += 1u; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func bzip2.decoder.flush_fast +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__flush_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst) { +- uint32_t v_flush_pointer = 0; +- uint32_t v_flush_repeat_count = 0; +- uint8_t v_flush_prev = 0; +- uint32_t v_block_checksum_have = 0; +- uint32_t v_block_size = 0; +- uint32_t v_entry = 0; +- uint8_t v_curr = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_flush_pointer = self->private_impl.f_flush_pointer; +- v_flush_repeat_count = self->private_impl.f_flush_repeat_count; +- v_flush_prev = self->private_impl.f_flush_prev; +- v_block_checksum_have = self->private_impl.f_block_checksum_have; +- v_block_size = self->private_impl.f_block_size; +- while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) { +- if (v_flush_repeat_count < 4u) { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- if (v_curr == v_flush_prev) { +- v_flush_repeat_count += 1u; +- } else { +- v_flush_repeat_count = 1u; ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); +- v_flush_prev = v_curr; +- v_block_size -= 1u; +- } else { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- v_flush_repeat_count = ((uint32_t)(v_curr)); +- while (v_flush_repeat_count > 0u) { +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); +- } +- v_flush_repeat_count -= 1u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_flush_repeat_count = 0u; +- v_flush_prev = v_curr; +- v_block_size -= 1u; ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- self->private_impl.f_flush_pointer = v_flush_pointer; +- self->private_impl.f_flush_repeat_count = v_flush_repeat_count; +- self->private_impl.f_flush_prev = v_flush_prev; +- self->private_impl.f_block_checksum_have = v_block_checksum_have; +- if (v_block_size <= 900000u) { +- self->private_impl.f_block_size = v_block_size; +- } +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func bzip2.decoder.flush_slow ++// -------- func bmp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__flush_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_flush_pointer = 0; +- uint32_t v_flush_repeat_count = 0; +- uint8_t v_flush_prev = 0; +- uint32_t v_block_checksum_have = 0; +- uint32_t v_block_size = 0; +- uint32_t v_entry = 0; +- uint8_t v_curr = 0; +- +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_flush_slow[0]; +- if (coro_susp_point) { +- v_flush_pointer = self->private_data.s_flush_slow[0].v_flush_pointer; +- v_flush_repeat_count = self->private_data.s_flush_slow[0].v_flush_repeat_count; +- v_flush_prev = self->private_data.s_flush_slow[0].v_flush_prev; +- v_block_checksum_have = self->private_data.s_flush_slow[0].v_block_checksum_have; +- v_block_size = self->private_data.s_flush_slow[0].v_block_size; +- v_curr = self->private_data.s_flush_slow[0].v_curr; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_flush_pointer = self->private_impl.f_flush_pointer; +- v_flush_repeat_count = self->private_impl.f_flush_repeat_count; +- v_flush_prev = self->private_impl.f_flush_prev; +- v_block_checksum_have = self->private_impl.f_block_checksum_have; +- v_block_size = self->private_impl.f_block_size; +- while ((v_block_size > 0u) && ! (self->private_impl.p_flush_slow[0] != 0)) { +- if (v_flush_repeat_count < 4u) { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- if (v_curr == v_flush_prev) { +- v_flush_repeat_count += 1u; +- } else { +- v_flush_repeat_count = 1u; +- } +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- self->private_data.s_flush_slow[0].scratch = v_curr; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); +- v_flush_prev = v_curr; +- v_block_size -= 1u; +- } else { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- v_flush_repeat_count = ((uint32_t)(v_curr)); +- while (v_flush_repeat_count > 0u) { +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- self->private_data.s_flush_slow[0].scratch = v_flush_prev; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); +- v_flush_repeat_count -= 1u; +- } +- v_flush_repeat_count = 0u; +- v_flush_prev = v_curr; +- v_block_size -= 1u; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; + } +- } +- self->private_impl.f_flush_pointer = v_flush_pointer; +- self->private_impl.f_flush_repeat_count = v_flush_repeat_count; +- self->private_impl.f_flush_prev = v_flush_prev; +- self->private_impl.f_block_checksum_have = v_block_checksum_have; +- if (v_block_size <= 900000u) { +- self->private_impl.f_block_size = v_block_size; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + +- goto ok; + ok: +- self->private_impl.p_flush_slow[0] = 0; ++ self->private_impl.p_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_flush_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_flush_slow[0].v_flush_pointer = v_flush_pointer; +- self->private_data.s_flush_slow[0].v_flush_repeat_count = v_flush_repeat_count; +- self->private_data.s_flush_slow[0].v_flush_prev = v_flush_prev; +- self->private_data.s_flush_slow[0].v_block_checksum_have = v_block_checksum_have; +- self->private_data.s_flush_slow[0].v_block_size = v_block_size; +- self->private_data.s_flush_slow[0].v_curr = v_curr; ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func bzip2.decoder.decode_huffman_fast ++// -------- func bmp.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_bmp__decoder__do_decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_block_size = 0; +- uint8_t v_which = 0; +- uint32_t v_ticks = 0; +- uint32_t v_section = 0; +- uint32_t v_run_shift = 0; +- uint16_t v_table_entry = 0; +- uint16_t v_child = 0; +- uint32_t v_child_ff = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_output = 0; +- uint32_t v_run = 0; +- uint32_t v_mtft0 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -31802,90 +32760,132 @@ wuffs_bzip2__decoder__decode_huffman_fast( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_block_size = self->private_impl.f_block_size; +- v_which = self->private_impl.f_decode_huffman_which; +- v_ticks = self->private_impl.f_decode_huffman_ticks; +- v_section = self->private_impl.f_decode_huffman_section; +- v_run_shift = self->private_impl.f_decode_huffman_run_shift; +- while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- if (v_ticks > 0u) { +- v_ticks -= 1u; +- } else { +- v_ticks = 49u; +- v_section += 1u; +- if (v_section >= self->private_impl.f_num_sections) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); +- goto exit; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u)]; +- } +- v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)]; +- v_bits <<= (v_table_entry >> 12u); +- v_n_bits -= ((uint32_t)((v_table_entry >> 12u))); +- v_child = (v_table_entry & 1023u); +- while (v_child < 257u) { +- v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)]; +- v_bits <<= 1u; +- if (v_n_bits <= 0u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_n_bits -= 1u; +- } +- if (v_child < 768u) { +- v_child_ff = ((uint32_t)((v_child & 255u))); +- v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); +- self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); +- self->private_data.f_letter_counts[v_output] += 1u; +- self->private_data.f_bwt[v_block_size] = v_output; +- if (v_block_size >= self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ if (status.repr) { ++ goto suspend; + } +- v_block_size += 1u; +- v_run_shift = 0u; +- continue; +- } else if (v_child == 768u) { +- self->private_impl.f_decode_huffman_finished = true; +- break; +- } +- if (v_run_shift >= 23u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift); +- v_run_shift += 1u; +- v_i = v_block_size; +- v_j = (v_run + v_block_size); +- if (v_j > self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_padding; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_block_size = v_j; +- v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); +- self->private_data.f_letter_counts[v_mtft0] += v_run; +- while (v_i < v_j) { +- self->private_data.f_bwt[v_i] = v_mtft0; +- v_i += 1u; ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) { ++ self->private_impl.f_dst_x = 0u; ++ if (self->private_impl.f_top_down) { ++ self->private_impl.f_dst_y = 0u; ++ self->private_impl.f_dst_y_inc = 1u; ++ } else { ++ self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ self->private_impl.f_dst_y_inc = 4294967295u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ if (self->private_impl.f_compression == 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else if (self->private_impl.f_compression < 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else if (self->private_impl.f_compression == 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_pending_pad; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_pending_pad = 0u; + } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- self->private_impl.f_block_size = v_block_size; +- self->private_impl.f_decode_huffman_which = v_which; +- self->private_impl.f_decode_huffman_ticks = v_ticks; +- self->private_impl.f_decode_huffman_section = v_section; +- self->private_impl.f_decode_huffman_run_shift = v_run_shift; +- status = wuffs_base__make_status(NULL); +- goto ok; + +- ok: ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -31895,24 +32895,27 @@ wuffs_bzip2__decoder__decode_huffman_fast( + return status; + } + +-// -------- func bzip2.decoder.decode_huffman_slow ++// -------- func bmp.decoder.swizzle_none + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_slow( +- wuffs_bzip2__decoder* self, ++wuffs_bmp__decoder__swizzle_none( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_node_index = 0; +- uint16_t v_child = 0; +- uint32_t v_child_ff = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_output = 0; +- uint32_t v_run = 0; +- uint32_t v_mtft0 = 0; ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -31925,99 +32928,90 @@ wuffs_bzip2__decoder__decode_huffman_slow( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; +- if (coro_susp_point) { +- v_node_index = self->private_data.s_decode_huffman_slow[0].v_node_index; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { +- if (self->private_impl.f_decode_huffman_ticks > 0u) { +- self->private_impl.f_decode_huffman_ticks -= 1u; +- } else { +- self->private_impl.f_decode_huffman_ticks = 49u; +- self->private_impl.f_decode_huffman_section += 1u; +- if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); +- goto exit; +- } +- self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767u)] & 7u)]; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ label__outer__continue:; ++ while (true) { ++ while (self->private_impl.f_pending_pad > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } +- v_node_index = 0u; +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)]; +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- if (v_child < 257u) { +- v_node_index = ((uint32_t)(v_child)); +- continue; +- } else if (v_child < 768u) { +- v_child_ff = ((uint32_t)((v_child & 255u))); +- v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); +- self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); +- self->private_data.f_letter_counts[v_output] += 1u; +- self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; +- if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ self->private_impl.f_pending_pad -= 1u; ++ iop_a_src += 1u; ++ } ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ if (self->private_impl.f_height > 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; + } +- self->private_impl.f_block_size += 1u; +- self->private_impl.f_decode_huffman_run_shift = 0u; +- break; +- } else if (v_child == 768u) { +- self->private_impl.f_decode_huffman_finished = true; + goto label__outer__break; ++ } else if (self->private_impl.f_pad_per_row != 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ goto label__outer__continue; + } +- if (self->private_impl.f_decode_huffman_run_shift >= 23u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_bits_per_pixel > 32u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift); +- self->private_impl.f_decode_huffman_run_shift += 1u; +- v_i = self->private_impl.f_block_size; +- v_j = (v_run + self->private_impl.f_block_size); +- if (v_j > self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u); ++ if (v_src_bytes_per_pixel == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- self->private_impl.f_block_size = v_j; +- v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); +- self->private_data.f_letter_counts[v_mtft0] += v_run; +- while (v_i < v_j) { +- self->private_data.f_bwt[v_i] = v_mtft0; +- v_i += 1u; ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; + } +- break; ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ v_dst_palette, ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); + } +- label__outer__break:; +- +- goto ok; +- ok: +- self->private_impl.p_decode_huffman_slow[0] = 0; +- goto exit; + } ++ label__outer__break:; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_huffman_slow[0].v_node_index = v_node_index; +- ++ ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -32027,256 +33021,33 @@ wuffs_bzip2__decoder__decode_huffman_slow( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_cbor__error__bad_input[] = "#cbor: bad input"; +-const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth"; +-const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O"; +-const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length"; +- +-// ---------------- Private Consts +- +-static const uint32_t +-WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 8388612, 8388616, 8388610, 8388609, +-}; +- +-static const uint8_t +-WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, +- 2, 3, 5, 9, 0, 0, 0, 1, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-// ---------------- VTables +- +-const wuffs_base__token_decoder__func_ptrs +-wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__token_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_cbor__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_cbor__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_cbor__decoder__set_quirk), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_cbor__decoder__initialize( +- wuffs_cbor__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } +- } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = +- wuffs_base__token_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = +- (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_cbor__decoder* +-wuffs_cbor__decoder__alloc(void) { +- wuffs_cbor__decoder* x = +- (wuffs_cbor__decoder*)(calloc(sizeof(wuffs_cbor__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_cbor__decoder__initialize( +- x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_cbor__decoder(void) { +- return sizeof(wuffs_cbor__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func cbor.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__get_quirk( +- const wuffs_cbor__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func cbor.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_cbor__decoder__set_quirk( +- wuffs_cbor__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func cbor.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__history_retain_length( +- const wuffs_cbor__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func cbor.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_cbor__decoder__workbuf_len( +- const wuffs_cbor__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__empty_range_ii_u64(); +-} +- +-// -------- func cbor.decoder.decode_tokens ++// -------- func bmp.decoder.swizzle_rle + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_cbor__decoder__decode_tokens( +- wuffs_cbor__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_rle( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_string_length = 0; +- uint64_t v_n64 = 0; +- uint32_t v_depth = 0; +- uint32_t v_stack_byte = 0; +- uint32_t v_stack_bit = 0; +- uint32_t v_stack_val = 0; +- uint32_t v_token_length = 0; +- uint32_t v_vminor = 0; +- uint32_t v_vminor_alt = 0; +- uint32_t v_continued = 0; +- uint8_t v_c = 0; +- uint8_t v_c_major = 0; +- uint8_t v_c_minor = 0; +- bool v_tagged = false; +- uint8_t v_indefinite_string_major_type = 0; ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_row = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint8_t v_code = 0; ++ uint8_t v_indexes[2] = {0}; ++ uint32_t v_rle_state = 0; ++ uint32_t v_chunk_bits = 0; ++ uint32_t v_chunk_count = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -32288,1231 +33059,590 @@ wuffs_cbor__decoder__decode_tokens( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; +- if (coro_susp_point) { +- v_string_length = self->private_data.s_decode_tokens[0].v_string_length; +- v_depth = self->private_data.s_decode_tokens[0].v_depth; +- v_tagged = self->private_data.s_decode_tokens[0].v_tagged; +- v_indefinite_string_major_type = self->private_data.s_decode_tokens[0].v_indefinite_string_major_type; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_end_of_data) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_rle_state = self->private_impl.f_rle_state; ++ label__outer__continue:; ++ while (true) { ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } +- label__outer__continue:; ++ label__middle__continue:; + while (true) { ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i <= ((uint64_t)(v_row.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } + while (true) { +- do { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- goto label__outer__continue; ++ if (v_rle_state == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (v_code == 0u) { ++ v_rle_state = 2u; ++ continue; ++ } ++ self->private_impl.f_rle_length = ((uint32_t)(v_code)); ++ v_rle_state = 1u; ++ continue; ++ } else if (v_rle_state == 1u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ v_p0 = 0u; ++ while (v_p0 < self->private_impl.f_rle_length) { ++ self->private_data.f_scratch[v_p0] = v_code; ++ v_p0 += 1u; ++ } ++ } else { ++ v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u)))); ++ v_indexes[1u] = ((uint8_t)(v_code & 15u)); ++ v_p0 = 0u; ++ while (v_p0 < self->private_impl.f_rle_length) { ++ self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u]; ++ self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u]; ++ v_p0 += 2u; ++ } ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); ++ v_rle_state = 0u; ++ goto label__middle__continue; ++ } else if (v_rle_state == 2u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (v_code < 2u) { ++ if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u); ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (v_code > 0u) { ++ goto label__outer__break; ++ } ++ v_rle_state = 0u; + goto label__outer__continue; ++ } else if (v_code == 2u) { ++ v_rle_state = 4u; ++ continue; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != (v_c >> 5u))) { +- if (v_c != 255u) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; ++ self->private_impl.f_rle_length = ((uint32_t)(v_code)); ++ self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u)); ++ v_rle_state = 3u; ++ continue; ++ } else if (v_rle_state == 3u) { ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ self->private_impl.f_rle_length, ++ v_dst, ++ v_dst_palette, ++ &iop_a_src, ++ io2_a_src); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n))); ++ } else { ++ v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u); ++ v_p0 = 0u; ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) { ++ v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 255u) + 4u); ++ v_chunk_count -= 1u; + } +- v_vminor = 4194560u; +- if (v_indefinite_string_major_type == 3u) { +- v_vminor |= 19u; ++ v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); ++ } ++ if (self->private_impl.f_rle_length > 0u) { ++ break; ++ } ++ if (self->private_impl.f_rle_padded) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } +- v_indefinite_string_major_type = 0u; + iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; ++ self->private_impl.f_rle_padded = false; ++ } ++ v_rle_state = 0u; ++ goto label__middle__continue; ++ } else if (v_rle_state == 4u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } ++ self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1u; +- v_c_major = ((uint8_t)((v_c >> 5u))); +- v_c_minor = (v_c & 31u); +- if (v_c_minor < 24u) { +- v_string_length = ((uint64_t)(v_c_minor)); +- } else { +- while (true) { +- if (v_c_minor == 24u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- iop_a_src += 1u; +- break; +- } +- } else if (v_c_minor == 25u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- break; +- } +- } else if (v_c_minor == 26u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4u; +- break; +- } +- } else if (v_c_minor == 27u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) { +- v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); +- iop_a_src += 8u; +- break; +- } +- } else { +- v_string_length = 0u; +- break; +- } +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__outer__continue; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } ++ v_rle_state = 5u; ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (self->private_impl.f_rle_delta_x > 0u) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x))); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x))); ++ self->private_impl.f_rle_delta_x = 0u; ++ if (self->private_impl.f_dst_x > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); ++ goto exit; + } +- if (v_c_major == 0u) { +- if (v_c_minor < 26u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 1u) { +- if (v_c_minor < 26u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- if (v_string_length < 9223372036854775808u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 2u) { +- if (v_c_minor < 28u) { +- if (v_string_length == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else if (v_c_minor == 31u) { +- if (v_indefinite_string_major_type != 0u) { +- break; +- } +- v_indefinite_string_major_type = 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__continue; +- } else { +- break; +- } +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src))); +- v_token_length = ((uint32_t)((v_n64 & 65535u))); +- if (v_n64 > 65535u) { +- v_token_length = 65535u; +- } else if (v_token_length <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); +- goto exit; +- } +- v_string_length -= ((uint64_t)(v_token_length)); +- v_continued = 0u; +- if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { +- v_continued = 1u; +- } +- iop_a_src += v_token_length; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_string_length > 0u) { +- continue; +- } else if (v_indefinite_string_major_type > 0u) { +- goto label__outer__continue; +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 3u) { +- if (v_c_minor < 28u) { +- if (v_string_length == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else if (v_c_minor == 31u) { +- if (v_indefinite_string_major_type != 0u) { +- break; +- } +- v_indefinite_string_major_type = 3u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__continue; +- } else { +- break; +- } +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- continue; +- } +- v_n64 = wuffs_base__u64__min(v_string_length, 65535u); +- v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src, +- ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64)))))); +- v_token_length = ((uint32_t)((v_n64 & 65535u))); +- if (v_token_length <= 0u) { +- if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); +- goto exit; +- } +- v_string_length -= ((uint64_t)(v_token_length)); +- v_continued = 0u; +- if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { +- v_continued = 1u; +- } +- iop_a_src += v_token_length; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_string_length > 0u) { +- continue; +- } else if (v_indefinite_string_major_type > 0u) { +- goto label__outer__continue; +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 4u) { +- if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { +- break; +- } else if (v_depth >= 1024u) { +- v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); +- while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { +- iop_a_src--; +- v_token_length -= 1u; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); +- goto exit; +- } +- v_vminor = 2105361u; +- v_vminor_alt = 2101282u; +- if (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor = 2105377u; +- v_vminor_alt = 2105378u; +- } else { +- v_vminor = 2105409u; +- v_vminor_alt = 2113570u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c_minor == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit)); +- self->private_data.f_container_num_remaining[v_depth] = v_string_length; +- v_depth += 1u; +- v_tagged = false; +- goto label__outer__continue; +- } else if (v_c_major == 5u) { +- if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { +- break; +- } else if (v_depth >= 1024u) { +- v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); +- while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { +- iop_a_src--; +- v_token_length -= 1u; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ } ++ if (v_code > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_code -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ while (true) { ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } +- v_vminor = 2113553u; +- v_vminor_alt = 2101314u; +- if (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor = 2113569u; +- v_vminor_alt = 2105410u; +- } else { +- v_vminor = 2113601u; +- v_vminor_alt = 2113602u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c_minor == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit); +- self->private_data.f_container_num_remaining[v_depth] = v_string_length; +- v_depth += 1u; +- v_tagged = false; +- goto label__outer__continue; +- } else if (v_c_major == 6u) { +- if (v_c_minor >= 28u) { ++ if (v_code <= 0u) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x))); + break; + } +- if (v_string_length < 262144u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- v_tagged = true; +- goto label__outer__continue; +- } else if (v_c_major == 7u) { +- if (v_c_minor < 20u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 24u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(WUFFS_CBOR__LITERALS[(v_c_minor & 3u)])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor == 24u) { +- if (v_string_length < 24u) { +- if ( ! (iop_a_src > io1_a_src)) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src--; +- break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor == 31u) { +- if (v_tagged || (v_depth <= 0u)) { +- break; +- } +- v_depth -= 1u; +- if (self->private_data.f_container_num_remaining[v_depth] != 0u) { +- break; +- } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit)); +- if (v_stack_val == 1u) { +- break; +- } +- if (v_stack_val != 3u) { +- v_vminor_alt = 2097186u; +- } else { +- v_vminor_alt = 2097218u; +- } +- if (v_depth <= 0u) { +- v_vminor_alt |= 4096u; +- } else { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt |= 8192u; +- } else { +- v_vminor_alt |= 16384u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- } +- } while (0); +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- label__goto_parsed_a_leaf_value__break:; +- v_tagged = false; +- while (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u)); +- if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) { +- goto label__outer__continue; +- } +- if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) { +- goto label__outer__continue; +- } +- self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u; +- if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) { +- goto label__outer__continue; +- } +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- continue; +- } +- v_depth -= 1u; +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt = 2097186u; +- } else { +- v_vminor_alt = 2097218u; +- } +- if (v_depth <= 0u) { +- v_vminor_alt |= 4096u; +- } else { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt |= 8192u; +- } else { +- v_vminor_alt |= 16384u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_code -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } + } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_rle_state = 0u; ++ goto label__middle__continue; + } +- break; ++ self->private_impl.f_rle_state = v_rle_state; ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } +- self->private_impl.f_end_of_data = true; +- +- ok: +- self->private_impl.p_decode_tokens[0] = 0; +- goto exit; + } ++ label__outer__break:; ++ while (self->private_impl.f_dst_y < self->private_impl.f_height) { ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- self->private_data.s_decode_tokens[0].v_string_length = v_string_length; +- self->private_data.s_decode_tokens[0].v_depth = v_depth; +- self->private_data.s_decode_tokens[0].v_tagged = v_tagged; +- self->private_data.s_decode_tokens[0].v_indefinite_string_major_type = v_indefinite_string_major_type; +- ++ ok: + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) ++// -------- func bmp.decoder.swizzle_bitfields + +-// ---------------- Status Codes Implementations ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_bitfields( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Private Consts ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint32_t v_p1 = 0; ++ uint32_t v_p1_temp = 0; ++ uint32_t v_num_bits = 0; ++ uint32_t v_c = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_channel = 0; + +-static const uint32_t +-WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- { +- 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, +- 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, +- 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, +- 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, +- 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, +- 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, +- 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, +- 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, +- 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, +- 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, +- 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, +- 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, +- 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, +- 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, +- 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, +- 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, +- 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, +- 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, +- 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, +- 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, +- 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, +- 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, +- 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, +- 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, +- 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, +- 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, +- 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, +- 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, +- 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, +- 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, +- 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, +- 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117, +- }, { +- 0, 421212481, 842424962, 724390851, 1684849924, 2105013317, 1448781702, 1329698503, +- 3369699848, 3519200073, 4210026634, 3824474571, 2897563404, 3048111693, 2659397006, 2274893007, +- 1254232657, 1406739216, 2029285587, 1643069842, 783210325, 934667796, 479770071, 92505238, +- 2182846553, 2600511768, 2955803355, 2838940570, 3866582365, 4285295644, 3561045983, 3445231262, +- 2508465314, 2359236067, 2813478432, 3198777185, 4058571174, 3908292839, 3286139684, 3670389349, +- 1566420650, 1145479147, 1869335592, 1987116393, 959540142, 539646703, 185010476, 303839341, +- 3745920755, 3327985586, 3983561841, 4100678960, 3140154359, 2721170102, 2300350837, 2416418868, +- 396344571, 243568058, 631889529, 1018359608, 1945336319, 1793607870, 1103436669, 1490954812, +- 4034481925, 3915546180, 3259968903, 3679722694, 2484439553, 2366552896, 2787371139, 3208174018, +- 950060301, 565965900, 177645455, 328046286, 1556873225, 1171730760, 1861902987, 2011255754, +- 3132841300, 2745199637, 2290958294, 2442530455, 3738671184, 3352078609, 3974232786, 4126854035, +- 1919080284, 1803150877, 1079293406, 1498383519, 370020952, 253043481, 607678682, 1025720731, +- 1711106983, 2095471334, 1472923941, 1322268772, 26324643, 411738082, 866634785, 717028704, +- 2904875439, 3024081134, 2668790573, 2248782444, 3376948395, 3495106026, 4219356713, 3798300520, +- 792689142, 908347575, 487136116, 68299317, 1263779058, 1380486579, 2036719216, 1618931505, +- 3890672638, 4278043327, 3587215740, 3435896893, 2206873338, 2593195963, 2981909624, 2829542713, +- 998479947, 580430090, 162921161, 279890824, 1609522511, 1190423566, 1842954189, 1958874764, +- 4082766403, 3930137346, 3245109441, 3631694208, 2536953671, 2385372678, 2768287173, 3155920004, +- 1900120602, 1750776667, 1131931800, 1517083097, 355290910, 204897887, 656092572, 1040194781, +- 3113746450, 2692952403, 2343461520, 2461357009, 3723805974, 3304059991, 4022511508, 4141455061, +- 2919742697, 3072101800, 2620513899, 2234183466, 3396041197, 3547351212, 4166851439, 3779471918, +- 1725839073, 2143618976, 1424512099, 1307796770, 45282277, 464110244, 813994343, 698327078, +- 3838160568, 4259225593, 3606301754, 3488152955, 2158586812, 2578602749, 2996767038, 2877569151, +- 740041904, 889656817, 506086962, 120682355, 1215357364, 1366020341, 2051441462, 1667084919, +- 3422213966, 3538019855, 4190942668, 3772220557, 2945847882, 3062702859, 2644537544, 2226864521, +- 52649286, 439905287, 823476164, 672009861, 1733269570, 2119477507, 1434057408, 1281543041, +- 2167981343, 2552493150, 3004082077, 2853541596, 3847487515, 4233048410, 3613549209, 3464057816, +- 1239502615, 1358593622, 2077699477, 1657543892, 764250643, 882293586, 532408465, 111204816, +- 1585378284, 1197851309, 1816695150, 1968414767, 974272232, 587794345, 136598634, 289367339, +- 2527558116, 2411481253, 2760973158, 3179948583, 4073438432, 3956313505, 3237863010, 3655790371, +- 347922877, 229101820, 646611775, 1066513022, 1892689081, 1774917112, 1122387515, 1543337850, +- 3697634229, 3313392372, 3998419255, 4148705398, 3087642289, 2702352368, 2319436851, 2468674930, +- }, { +- 0, 29518391, 59036782, 38190681, 118073564, 114017003, 76381362, 89069189, +- 236147128, 265370511, 228034006, 206958561, 152762724, 148411219, 178138378, 190596925, +- 472294256, 501532999, 530741022, 509615401, 456068012, 451764635, 413917122, 426358261, +- 305525448, 334993663, 296822438, 275991697, 356276756, 352202787, 381193850, 393929805, +- 944588512, 965684439, 1003065998, 973863097, 1061482044, 1049003019, 1019230802, 1023561829, +- 912136024, 933002607, 903529270, 874031361, 827834244, 815125939, 852716522, 856752605, +- 611050896, 631869351, 669987326, 640506825, 593644876, 580921211, 551983394, 556069653, +- 712553512, 733666847, 704405574, 675154545, 762387700, 749958851, 787859610, 792175277, +- 1889177024, 1901651959, 1931368878, 1927033753, 2006131996, 1985040171, 1947726194, 1976933189, +- 2122964088, 2135668303, 2098006038, 2093965857, 2038461604, 2017599123, 2047123658, 2076625661, +- 1824272048, 1836991623, 1866005214, 1861914857, 1807058540, 1786244187, 1748062722, 1777547317, +- 1655668488, 1668093247, 1630251878, 1625932113, 1705433044, 1684323811, 1713505210, 1742760333, +- 1222101792, 1226154263, 1263738702, 1251046777, 1339974652, 1310460363, 1281013650, 1301863845, +- 1187289752, 1191637167, 1161842422, 1149379777, 1103966788, 1074747507, 1112139306, 1133218845, +- 1425107024, 1429406311, 1467333694, 1454888457, 1408811148, 1379576507, 1350309090, 1371438805, +- 1524775400, 1528845279, 1499917702, 1487177649, 1575719220, 1546255107, 1584350554, 1605185389, +- 3778354048, 3774312887, 3803303918, 3816007129, 3862737756, 3892238699, 3854067506, 3833203973, +- 4012263992, 4007927823, 3970080342, 3982554209, 3895452388, 3924658387, 3953866378, 3932773565, +- 4245928176, 4241609415, 4271336606, 4283762345, 4196012076, 4225268251, 4187931714, 4166823541, +- 4076923208, 4072833919, 4035198246, 4047918865, 4094247316, 4123732899, 4153251322, 4132437965, +- 3648544096, 3636082519, 3673983246, 3678331705, 3732010428, 3753090955, 3723829714, 3694611429, +- 3614117080, 3601426159, 3572488374, 3576541825, 3496125444, 3516976691, 3555094634, 3525581405, +- 3311336976, 3298595879, 3336186494, 3340255305, 3260503756, 3281337595, 3251864226, 3222399125, +- 3410866088, 3398419871, 3368647622, 3372945905, 3427010420, 3448139075, 3485520666, 3456284973, +- 2444203584, 2423127159, 2452308526, 2481530905, 2527477404, 2539934891, 2502093554, 2497740997, +- 2679949304, 2659102159, 2620920726, 2650438049, 2562027300, 2574714131, 2603727690, 2599670141, +- 2374579504, 2353749767, 2383274334, 2412743529, 2323684844, 2336421851, 2298759554, 2294686645, +- 2207933576, 2186809023, 2149495014, 2178734801, 2224278612, 2236720739, 2266437690, 2262135309, +- 2850214048, 2820717207, 2858812622, 2879680249, 2934667388, 2938704459, 2909776914, 2897069605, +- 2817622296, 2788420399, 2759153014, 2780249921, 2700618180, 2704950259, 2742877610, 2730399645, +- 3049550800, 3020298727, 3057690558, 3078802825, 2999835404, 3004150075, 2974355298, 2961925461, +- 3151438440, 3121956959, 3092510214, 3113327665, 3168701108, 3172786307, 3210370778, 3197646061, +- }, { +- 0, 3099354981, 2852767883, 313896942, 2405603159, 937357362, 627793884, 2648127673, +- 3316918511, 2097696650, 1874714724, 3607201537, 1255587768, 4067088605, 3772741427, 1482887254, +- 1343838111, 3903140090, 4195393300, 1118632049, 3749429448, 1741137837, 1970407491, 3452858150, +- 2511175536, 756094997, 1067759611, 2266550430, 449832999, 2725482306, 2965774508, 142231497, +- 2687676222, 412010587, 171665333, 2995192016, 793786473, 2548850444, 2237264098, 1038456711, +- 1703315409, 3711623348, 3482275674, 1999841343, 3940814982, 1381529571, 1089329165, 4166106984, +- 4029413537, 1217896388, 1512189994, 3802027855, 2135519222, 3354724499, 3577784189, 1845280792, +- 899665998, 2367928107, 2677414085, 657096608, 3137160985, 37822588, 284462994, 2823350519, +- 2601801789, 598228824, 824021174, 2309093331, 343330666, 2898962447, 3195996129, 113467524, +- 1587572946, 3860600759, 4104763481, 1276501820, 3519211397, 1769898208, 2076913422, 3279374443, +- 3406630818, 1941006535, 1627703081, 3652755532, 1148164341, 4241751952, 3999682686, 1457141531, +- 247015245, 3053797416, 2763059142, 470583459, 2178658330, 963106687, 735213713, 2473467892, +- 992409347, 2207944806, 2435792776, 697522413, 3024379988, 217581361, 508405983, 2800865210, +- 4271038444, 1177467017, 1419450215, 3962007554, 1911572667, 3377213406, 3690561584, 1665525589, +- 1799331996, 3548628985, 3241568279, 2039091058, 3831314379, 1558270126, 1314193216, 4142438437, +- 2928380019, 372764438, 75645176, 3158189981, 568925988, 2572515393, 2346768303, 861712586, +- 3982079547, 1441124702, 1196457648, 4293663189, 1648042348, 3666298377, 3358779879, 1888390786, +- 686661332, 2421291441, 2196002399, 978858298, 2811169155, 523464422, 226935048, 3040519789, +- 3175145892, 100435649, 390670639, 2952089162, 841119475, 2325614998, 2553003640, 546822429, +- 2029308235, 3225988654, 3539796416, 1782671013, 4153826844, 1328167289, 1570739863, 3844338162, +- 1298864389, 4124540512, 3882013070, 1608431339, 3255406162, 2058742071, 1744848601, 3501990332, +- 2296328682, 811816591, 584513889, 2590678532, 129869501, 3204563416, 2914283062, 352848211, +- 494030490, 2781751807, 3078325777, 264757620, 2450577869, 715964072, 941166918, 2158327331, +- 3636881013, 1618608400, 1926213374, 3396585883, 1470427426, 4011365959, 4255988137, 1158766284, +- 1984818694, 3471935843, 3695453837, 1693991400, 4180638033, 1100160564, 1395044826, 3952793279, +- 3019491049, 189112716, 435162722, 2706139399, 1016811966, 2217162459, 2526189877, 774831696, +- 643086745, 2666061564, 2354934034, 887166583, 2838900430, 294275499, 54519365, 3145957664, +- 3823145334, 1532818963, 1240029693, 4048895640, 1820460577, 3560857924, 3331051178, 2117577167, +- 3598663992, 1858283101, 2088143283, 3301633750, 1495127663, 3785470218, 4078182116, 1269332353, +- 332098007, 2876706482, 3116540252, 25085497, 2628386432, 605395429, 916469259, 2384220526, +- 2254837415, 1054503362, 745528876, 2496903497, 151290352, 2981684885, 2735556987, 464596510, +- 1137851976, 4218313005, 3923506883, 1365741990, 3434129695, 1946996346, 1723425172, 3724871409, +- }, { +- 0, 1029712304, 2059424608, 1201699536, 4118849216, 3370159984, 2403399072, 2988497936, +- 812665793, 219177585, 1253054625, 2010132753, 3320900865, 4170237105, 3207642721, 2186319825, +- 1625331586, 1568718386, 438355170, 658566482, 2506109250, 2818578674, 4020265506, 3535817618, +- 1351670851, 1844508147, 709922595, 389064339, 2769320579, 2557498163, 3754961379, 3803185235, +- 3250663172, 4238411444, 3137436772, 2254525908, 876710340, 153198708, 1317132964, 1944187668, +- 4054934725, 3436268917, 2339452837, 3054575125, 70369797, 961670069, 2129760613, 1133623509, +- 2703341702, 2621542710, 3689016294, 3867263574, 1419845190, 1774270454, 778128678, 318858390, +- 2438067015, 2888948471, 3952189479, 3606153623, 1691440519, 1504803895, 504432359, 594620247, +- 1492342857, 1704161785, 573770537, 525542041, 2910060169, 2417219385, 3618876905, 3939730521, +- 1753420680, 1440954936, 306397416, 790849880, 2634265928, 2690882808, 3888375336, 3668168600, +- 940822475, 91481723, 1121164459, 2142483739, 3448989963, 4042473659, 3075684971, 2318603227, +- 140739594, 889433530, 1923340138, 1338244826, 4259521226, 3229813626, 2267247018, 3124975642, +- 2570221389, 2756861693, 3824297005, 3734113693, 1823658381, 1372780605, 376603373, 722643805, +- 2839690380, 2485261628, 3548540908, 4007806556, 1556257356, 1638052860, 637716780, 459464860, +- 4191346895, 3300051327, 2199040943, 3195181599, 206718479, 825388991, 1989285231, 1274166495, +- 3382881038, 4106388158, 3009607790, 2382549470, 1008864718, 21111934, 1189240494, 2072147742, +- 2984685714, 2357631266, 3408323570, 4131834434, 1147541074, 2030452706, 1051084082, 63335554, +- 2174155603, 3170292451, 4216760371, 3325460867, 1947622803, 1232499747, 248909555, 867575619, +- 3506841360, 3966111392, 2881909872, 2527485376, 612794832, 434546784, 1581699760, 1663499008, +- 3782634705, 3692447073, 2612412337, 2799048193, 351717905, 697754529, 1849071985, 1398190273, +- 1881644950, 1296545318, 182963446, 931652934, 2242328918, 3100053734, 4284967478, 3255255942, +- 1079497815, 2100821479, 983009079, 133672583, 3050795671, 2293717799, 3474399735, 4067887175, +- 281479188, 765927844, 1778867060, 1466397380, 3846680276, 3626469220, 2676489652, 2733102084, +- 548881365, 500656741, 1517752501, 1729575173, 3577210133, 3898068133, 2952246901, 2459410373, +- 3910527195, 3564487019, 2480257979, 2931134987, 479546907, 569730987, 1716854139, 1530213579, +- 3647316762, 3825568426, 2745561210, 2663766474, 753206746, 293940330, 1445287610, 1799716618, +- 2314567513, 3029685993, 4080348217, 3461678473, 2088098201, 1091956777, 112560889, 1003856713, +- 3112514712, 2229607720, 3276105720, 4263857736, 1275433560, 1902492648, 918929720, 195422344, +- 685033439, 364179055, 1377080511, 1869921551, 3713294623, 3761522863, 2811507327, 2599689167, +- 413436958, 633644462, 1650777982, 1594160846, 3978570462, 3494118254, 2548332990, 2860797966, +- 1211387997, 1968470509, 854852413, 261368461, 3182753437, 2161434413, 3346310653, 4195650637, +- 2017729436, 1160000044, 42223868, 1071931724, 2378480988, 2963576044, 4144295484, 3395602316, +- }, { +- 0, 3411858341, 1304994059, 2257875630, 2609988118, 1355649459, 3596215069, 486879416, +- 3964895853, 655315400, 2711298918, 1791488195, 2009251963, 3164476382, 973758832, 4048990933, +- 64357019, 3364540734, 1310630800, 2235723829, 2554806413, 1394316072, 3582976390, 517157411, +- 4018503926, 618222419, 2722963965, 1762783832, 1947517664, 3209171269, 970744811, 4068520014, +- 128714038, 3438335635, 1248109629, 2167961496, 2621261600, 1466012805, 3522553387, 447296910, +- 3959392091, 547575038, 2788632144, 1835791861, 1886307661, 3140622056, 1034314822, 4143626211, +- 75106221, 3475428360, 1236444838, 2196665603, 2682996155, 1421317662, 3525567664, 427767573, +- 3895035328, 594892389, 2782995659, 1857943406, 1941489622, 3101955187, 1047553757, 4113347960, +- 257428076, 3288652233, 1116777319, 2311878850, 2496219258, 1603640287, 3640781169, 308099796, +- 3809183745, 676813732, 2932025610, 1704983215, 2023410199, 3016104370, 894593820, 4262377657, +- 210634999, 3352484690, 1095150076, 2316991065, 2535410401, 1547934020, 3671583722, 294336591, +- 3772615322, 729897279, 2903845777, 1716123700, 2068629644, 2953845545, 914647431, 4258839074, +- 150212442, 3282623743, 1161604689, 2388688372, 2472889676, 1480171241, 3735940167, 368132066, +- 3836185911, 805002898, 2842635324, 1647574937, 2134298401, 3026852996, 855535146, 4188192143, +- 186781121, 3229539940, 1189784778, 2377547631, 2427670487, 1542429810, 3715886812, 371670393, +- 3882979244, 741170185, 2864262823, 1642462466, 2095107514, 3082559007, 824732849, 4201955092, +- 514856152, 3589064573, 1400419795, 2552522358, 2233554638, 1316849003, 3370776517, 62202976, +- 4075001525, 968836368, 3207280574, 1954014235, 1769133219, 2720925446, 616199592, 4024870413, +- 493229635, 3594175974, 1353627464, 2616354029, 2264355925, 1303087088, 3409966430, 6498043, +- 4046820398, 979978123, 3170710821, 2007099008, 1789187640, 2717386141, 661419827, 3962610838, +- 421269998, 3527459403, 1423225061, 2676515648, 2190300152, 1238466653, 3477467891, 68755798, +- 4115633027, 1041448998, 3095868040, 1943789869, 1860096405, 2776760880, 588673182, 3897205563, +- 449450869, 3516317904, 1459794558, 2623431131, 2170245475, 1242006214, 3432247400, 131015629, +- 4137259288, 1036337853, 3142660115, 1879958454, 1829294862, 2790523051, 549483013, 3952910752, +- 300424884, 3669282065, 1545650111, 2541513754, 2323209378, 1092980487, 3350330793, 216870412, +- 4256931033, 921128828, 2960342482, 2066738807, 1714085583, 2910195050, 736264132, 3770592353, +- 306060335, 3647131530, 1610005796, 2494197377, 2309971513, 1123257756, 3295149874, 255536279, +- 4268596802, 892423655, 3013951305, 2029645036, 1711070292, 2929725425, 674528607, 3815288570, +- 373562242, 3709388839, 1535949449, 2429577516, 2379569556, 1183418929, 3223189663, 188820282, +- 4195850735, 827017802, 3084859620, 2089020225, 1636228089, 2866415708, 743340786, 3876759895, +- 361896217, 3738094268, 1482340370, 2466671543, 2382584591, 1163888810, 3284924932, 144124321, +- 4190215028, 849168593, 3020503679, 2136336858, 1649465698, 2836138695, 798521449, 3838094284, +- }, { +- 0, 2792819636, 2543784233, 837294749, 4098827283, 1379413927, 1674589498, 3316072078, +- 871321191, 2509784531, 2758827854, 34034938, 3349178996, 1641505216, 1346337629, 4131942633, +- 1742642382, 3249117050, 4030828007, 1446413907, 2475800797, 904311657, 68069876, 2725880384, +- 1412551337, 4064729373, 3283010432, 1708771380, 2692675258, 101317902, 937551763, 2442587175, +- 3485284764, 1774858792, 1478633653, 4266992385, 1005723023, 2642744891, 2892827814, 169477906, +- 4233263099, 1512406095, 1808623314, 3451546982, 136139752, 2926205020, 2676114113, 972376437, +- 2825102674, 236236518, 1073525883, 2576072655, 1546420545, 4200303349, 3417542760, 1841601500, +- 2609703733, 1039917185, 202635804, 2858742184, 1875103526, 3384067218, 4166835727, 1579931067, +- 1141601657, 3799809741, 3549717584, 1977839588, 2957267306, 372464350, 668680259, 2175552503, +- 2011446046, 3516084394, 3766168119, 1175200131, 2209029901, 635180217, 338955812, 2990736784, +- 601221559, 2242044419, 3024812190, 306049834, 3617246628, 1911408144, 1074125965, 3866285881, +- 272279504, 3058543716, 2275784441, 567459149, 3832906691, 1107462263, 1944752874, 3583875422, +- 2343980261, 767641425, 472473036, 3126744696, 2147051766, 3649987394, 3899029983, 1309766251, +- 3092841090, 506333494, 801510315, 2310084639, 1276520081, 3932237093, 3683203000, 2113813516, +- 3966292011, 1243601823, 2079834370, 3716205238, 405271608, 3192979340, 2411259153, 701492901, +- 3750207052, 2045810168, 1209569125, 4000285905, 734575199, 2378150379, 3159862134, 438345922, +- 2283203314, 778166598, 529136603, 3120492655, 2086260449, 3660498261, 3955679176, 1303499900, +- 3153699989, 495890209, 744928700, 2316418568, 1337360518, 3921775410, 3626602927, 2120129051, +- 4022892092, 1237286280, 2018993941, 3726666913, 461853231, 3186645403, 2350400262, 711936178, +- 3693557851, 2052076527, 1270360434, 3989775046, 677911624, 2384402428, 3220639073, 427820757, +- 1202443118, 3789347034, 3493118535, 1984154099, 3018127229, 362020041, 612099668, 2181885408, +- 1950653705, 3526596285, 3822816288, 1168934804, 2148251930, 645706414, 395618355, 2984485767, +- 544559008, 2248295444, 3085590153, 295523645, 3560598451, 1917673479, 1134918298, 3855773998, +- 328860103, 3052210803, 2214924526, 577903450, 3889505748, 1101147744, 1883911421, 3594338121, +- 3424493451, 1785369663, 1535282850, 4260726038, 944946072, 2653270060, 2949491377, 163225861, +- 4294103532, 1501944408, 1752023237, 3457862513, 196998655, 2915761739, 2619532502, 978710370, +- 2881684293, 229902577, 1012666988, 2586515928, 1603020630, 4193987810, 3356702335, 1852063179, +- 2553040162, 1046169238, 263412747, 2848217023, 1818454321, 3390333573, 4227627032, 1569420204, +- 60859927, 2782375331, 2487203646, 843627658, 4159668740, 1368951216, 1617990445, 3322386585, +- 810543216, 2520310724, 2815490393, 27783917, 3288386659, 1652017111, 1402985802, 4125677310, +- 1685994201, 3255382381, 4091620336, 1435902020, 2419138250, 910562686, 128847843, 2715354199, +- 1469150398, 4058414858, 3222168983, 1719234083, 2749255853, 94984985, 876691844, 2453031472, +- }, { +- 0, 3433693342, 1109723005, 2391738339, 2219446010, 1222643300, 3329165703, 180685081, +- 3555007413, 525277995, 2445286600, 1567235158, 1471092047, 2600801745, 361370162, 3642757804, +- 2092642603, 2953916853, 1050555990, 4063508168, 4176560081, 878395215, 3134470316, 1987983410, +- 2942184094, 1676945920, 3984272867, 567356797, 722740324, 3887998202, 1764827929, 2778407815, +- 4185285206, 903635656, 3142804779, 2012833205, 2101111980, 2979425330, 1058630609, 4088621903, +- 714308067, 3862526333, 1756790430, 2753330688, 2933487385, 1651734407, 3975966820, 542535930, +- 2244825981, 1231508451, 3353891840, 188896414, 25648519, 3442302233, 1134713594, 2399689316, +- 1445480648, 2592229462, 336416693, 3634843435, 3529655858, 516441772, 2420588879, 1559052753, +- 698204909, 3845636723, 1807271312, 2803025166, 2916600855, 1635634313, 4025666410, 593021940, +- 4202223960, 919787974, 3093159461, 1962401467, 2117261218, 2996361020, 1008193759, 4038971457, +- 1428616134, 2576151384, 386135227, 3685348389, 3513580860, 499580322, 2471098945, 1608776415, +- 2260985971, 1248454893, 3303468814, 139259792, 42591881, 3458459159, 1085071860, 2349261162, +- 3505103035, 474062885, 2463016902, 1583654744, 1419882049, 2550902495, 377792828, 3660491170, +- 51297038, 3483679632, 1093385331, 2374089965, 2269427188, 1273935210, 3311514249, 164344343, +- 2890961296, 1627033870, 4000683757, 585078387, 672833386, 3836780532, 1782552599, 2794821769, +- 2142603813, 3005188795, 1032883544, 4047146438, 4227826911, 928351297, 3118105506, 1970307900, +- 1396409818, 2677114180, 287212199, 3719594553, 3614542624, 467372990, 2505346141, 1509854403, +- 2162073199, 1282711281, 3271268626, 240228748, 76845205, 3359543307, 1186043880, 2317064054, +- 796964081, 3811226735, 1839575948, 2702160658, 2882189835, 1734392469, 3924802934, 625327592, +- 4234522436, 818917338, 3191908409, 1927981223, 2016387518, 3028656416, 973776579, 4137723485, +- 2857232268, 1726474002, 3899187441, 616751215, 772270454, 3803048424, 1814228491, 2693328533, +- 2041117753, 3036871847, 999160644, 4146592730, 4259508931, 826864221, 3217552830, 1936586016, +- 3606501031, 442291769, 2496909786, 1484378436, 1388107869, 2652297411, 278519584, 3694387134, +- 85183762, 3384397196, 1194773103, 2342308593, 2170143720, 1307820918, 3279733909, 265733131, +- 2057717559, 3054258089, 948125770, 4096344276, 4276898253, 843467091, 3167309488, 1885556270, +- 2839764098, 1709792284, 3949353983, 667704161, 755585656, 3785577190, 1865176325, 2743489947, +- 102594076, 3401021058, 1144549729, 2291298815, 2186770662, 1325234296, 3228729243, 215514885, +- 3589828009, 424832311, 2547870420, 1534552650, 1370645331, 2635621325, 328688686, 3745342640, +- 2211456353, 1333405183, 3254067740, 224338562, 127544219, 3408931589, 1170156774, 2299866232, +- 1345666772, 2627681866, 303053225, 3736746295, 3565105198, 416624816, 2522494803, 1525692365, +- 4285207626, 868291796, 3176010551, 1910772649, 2065767088, 3079346734, 956571085, 4121828691, +- 747507711, 3760459617, 1856702594, 2717976604, 2831417605, 1684930971, 3940615800, 642451174, +- }, +- { +- 0, 393942083, 787884166, 965557445, 1575768332, 1251427663, 1931114890, 1684106697, +- 3151536664, 2896410203, 2502855326, 2186649309, 3862229780, 4048545623, 3368213394, 3753496529, +- 2898281073, 3149616690, 2184604407, 2504883892, 4046197629, 3864463166, 3755621371, 3366006712, +- 387506281, 6550570, 971950319, 781573292, 1257550181, 1569695014, 1677892067, 1937345952, +- 2196865699, 2508887776, 2886183461, 3145514598, 3743273903, 3362179052, 4058774313, 3868258154, +- 958996667, 777139448, 400492605, 10755198, 1690661303, 1941857780, 1244879153, 1565019506, +- 775012562, 961205393, 13101140, 398261271, 1943900638, 1688634781, 1563146584, 1246801179, +- 2515100362, 2190636681, 3139390028, 2892258831, 3355784134, 3749586821, 3874691904, 4052225795, +- 3734110983, 3387496260, 4033096577, 3877584834, 2206093835, 2483373640, 2911402637, 3136515790, +- 1699389727, 1915860316, 1270647193, 1556585946, 950464531, 803071056, 374397077, 19647702, +- 1917993334, 1697207605, 1554278896, 1272937907, 800985210, 952435769, 21510396, 372452543, +- 3381322606, 3740399405, 3883715560, 4027047851, 2489758306, 2199758369, 3130039012, 2917895847, +- 1550025124, 1259902439, 1922410786, 1710144865, 26202280, 385139947, 796522542, 939715693, +- 3887801276, 4039129087, 3377269562, 3728088953, 3126293168, 2905368307, 2493602358, 2212122229, +- 4037264341, 3889747862, 3730172755, 3375300368, 2907673305, 3124004506, 2209987167, 2495786524, +- 1266377165, 1543533966, 1703758155, 1928748296, 379007169, 32253058, 945887303, 790236164, +- 1716846671, 1898845196, 1218652361, 1608006794, 1002000707, 750929152, 357530053, 36990342, +- 3717046871, 3405166100, 4084959953, 3825245842, 2153902939, 2535122712, 2929187805, 3119304606, +- 3398779454, 3723384445, 3831720632, 4078468859, 2541294386, 2147616625, 3113171892, 2935238647, +- 1900929062, 1714877541, 1606142112, 1220599011, 748794154, 1004184937, 39295404, 355241455, +- 3835986668, 4091516591, 3394415210, 3710500393, 3108557792, 2922629027, 2545875814, 2160455461, +- 1601970420, 1208431799, 1904871538, 1727077425, 43020792, 367748539, 744905086, 991776061, +- 1214562461, 1595921630, 1720903707, 1911159896, 361271697, 49513938, 998160663, 738569556, +- 4089209477, 3838277318, 3712633347, 3392233024, 2924491657, 3106613194, 2158369551, 2547846988, +- 3100050248, 2948339467, 2519804878, 2169126797, 3844821572, 4065347079, 3420289730, 3701894785, +- 52404560, 342144275, 770279894, 982687125, 1593045084, 1233708063, 1879431386, 1736363161, +- 336019769, 58479994, 988899775, 764050940, 1240141877, 1586496630, 1729968307, 1885744368, +- 2950685473, 3097818978, 2166999975, 2522013668, 4063474221, 3846743662, 3703937707, 3418263272, +- 976650731, 760059304, 348170605, 62635310, 1742393575, 1889649828, 1227683937, 1582820386, +- 2179867635, 2526361520, 2937588597, 3093503798, 3691148031, 3413731004, 4076100217, 3851374138, +- 2532754330, 2173556697, 3087067932, 2944139103, 3407516310, 3697379029, 3857496592, 4070026835, +- 758014338, 978679233, 64506116, 346250567, 1891774606, 1740186829, 1580472328, 1229917259, +- }, { +- 0, 4022496062, 83218493, 3946298115, 166436986, 3861498692, 220098631, 3806075769, +- 332873972, 4229245898, 388141257, 4175494135, 440197262, 4127099824, 516501683, 4044053389, +- 665747944, 3362581206, 593187285, 3432594155, 776282514, 3246869164, 716239279, 3312622225, +- 880394524, 3686509090, 814485793, 3746462239, 1033003366, 3528460888, 963096923, 3601193573, +- 1331495888, 2694801646, 1269355501, 2758457555, 1186374570, 2843003028, 1111716759, 2910918825, +- 1552565028, 3007850522, 1484755737, 3082680359, 1432478558, 3131279456, 1368666979, 3193329757, +- 1760789048, 2268195078, 1812353541, 2210675003, 1628971586, 2396670332, 1710092927, 2318375233, +- 2066006732, 2498144754, 2144408305, 2417195471, 1926193846, 2634877320, 1983558283, 2583222709, +- 2662991776, 1903717534, 2588923805, 1972223139, 2538711002, 2022952164, 2477029351, 2087066841, +- 2372749140, 1655647338, 2308478825, 1717238871, 2223433518, 1799654416, 2155034387, 1873894445, +- 3105130056, 1456926070, 3185661557, 1378041163, 2969511474, 1597852940, 3020617231, 1539874097, +- 2864957116, 1157737858, 2922780289, 1106542015, 2737333958, 1290407416, 2816325371, 1210047941, +- 3521578096, 1042640718, 3574781005, 986759027, 3624707082, 936300340, 3707335735, 859512585, +- 3257943172, 770846650, 3334837433, 688390023, 3420185854, 605654976, 3475911875, 552361981, +- 4132013464, 428600998, 4072428965, 494812827, 4288816610, 274747100, 4216845791, 345349857, +- 3852387692, 173846098, 3781891409, 245988975, 3967116566, 62328360, 3900749099, 121822741, +- 3859089665, 164061759, 3807435068, 221426178, 4025395579, 2933317, 3944446278, 81334904, +- 4124199413, 437265099, 4045904328, 518386422, 4231653775, 335250097, 4174133682, 386814604, +- 3249244393, 778691543, 3311294676, 714879978, 3359647891, 662848429, 3434477742, 595039120, +- 3531393053, 1035903779, 3599308832, 961245982, 3684132967, 877986649, 3747788890, 815846244, +- 2841119441, 1184522735, 2913852140, 1114616274, 2696129195, 1332855189, 2756082326, 1266946472, +- 3129952805, 1431118107, 3195705880, 1371074854, 3009735263, 1554415969, 3079748194, 1481855324, +- 2398522169, 1630855175, 2315475716, 1707159610, 2266835779, 1759461501, 2213084030, 1814728768, +- 2636237773, 1927520499, 2580814832, 1981182158, 2496293815, 2064121993, 2420095882, 2147340468, +- 2025787041, 2541577631, 2085281436, 2475210146, 1901375195, 2660681189, 1973518054, 2590184920, +- 1801997909, 2225743211, 1872600680, 2153772374, 1652813359, 2369881361, 1719025170, 2310296876, +- 1594986313, 2966676599, 1541693300, 3022402634, 1459236659, 3107472397, 1376780046, 3184366640, +- 1288097725, 2734990467, 1211309952, 2817619134, 1160605639, 2867791097, 1104723962, 2920993988, +- 937561457, 3626001999, 857201996, 3704993394, 1040821515, 3519792693, 989625654, 3577615880, +- 607473029, 3421972155, 549494200, 3473077894, 769584639, 3256649409, 690699714, 3337180924, +- 273452185, 4287555495, 347692196, 4219156378, 430386403, 4133832669, 491977950, 4069562336, +- 60542061, 3965298515, 124656720, 3903616878, 175139863, 3853649705, 243645482, 3779581716, +- }, { +- 0, 3247366080, 1483520449, 2581751297, 2967040898, 1901571138, 3904227907, 691737987, +- 3133399365, 2068659845, 3803142276, 589399876, 169513671, 3415493895, 1383475974, 2482566342, +- 2935407819, 1870142219, 4137319690, 924099274, 506443593, 3751897225, 1178799752, 2278412616, +- 339027342, 3585866318, 1280941135, 2379694991, 2766951948, 1700956620, 4236308429, 1024339981, +- 2258407383, 1192382487, 3740284438, 528411094, 910556245, 4157285269, 1848198548, 2946996820, +- 1012887186, 4258378066, 1681119059, 2780629139, 2357599504, 1292419792, 3572147409, 358906641, +- 678054684, 3924071644, 1879503581, 2978491677, 2561882270, 1497229150, 3235873119, 22109855, +- 2460592729, 1395094937, 3401913240, 189516888, 577821147, 3825075739, 2048679962, 3146956762, +- 3595049455, 398902831, 2384764974, 1336573934, 1720805997, 2803873197, 1056822188, 4285729900, +- 1821112490, 2902796138, 887570795, 4117339819, 3696397096, 500978920, 2218668777, 1169222953, +- 2025774372, 3106931428, 550659301, 3780950821, 3362238118, 166293862, 2416645991, 1367722151, +- 3262987361, 66315169, 2584839584, 1537170016, 1923370979, 3005911075, 717813282, 3947244002, +- 1356109368, 2438613496, 146288633, 3375820857, 3759007162, 562248314, 3093388411, 2045739963, +- 3927406461, 731490493, 2994458300, 1945440636, 1523451135, 2604718911, 44219710, 3274466046, +- 4263662323, 1068272947, 2790189874, 1740649714, 1325080945, 2406874801, 379033776, 3608758128, +- 1155642294, 2238671990, 479005303, 3708016055, 4097359924, 901128180, 2891217397, 1843045941, +- 2011248031, 3060787807, 797805662, 3993195422, 3342353949, 112630237, 2673147868, 1591353372, +- 3441611994, 212601626, 2504944923, 1421914843, 2113644376, 3161815192, 630660761, 3826893145, +- 3642224980, 412692116, 2172340373, 1089836885, 1775141590, 2822790422, 832715543, 4029474007, +- 1674842129, 2723860433, 1001957840, 4197873168, 3540870035, 310623315, 2338445906, 1257178514, +- 4051548744, 821257608, 2836464521, 1755307081, 1101318602, 2150241802, 432566283, 3628511179, +- 1270766349, 2318435533, 332587724, 3529260300, 4217841807, 988411727, 2735444302, 1652903566, +- 1602977411, 2651169091, 132630338, 3328776322, 4015131905, 786223809, 3074340032, 1991273216, +- 3846741958, 616972294, 3173262855, 2091579847, 1435626564, 2485072772, 234706309, 3430124101, +- 2712218736, 1613231024, 4190475697, 944458353, 292577266, 3506339890, 1226630707, 2291284467, +- 459984181, 3672380149, 1124496628, 2189994804, 2880683703, 1782407543, 4091479926, 844224694, +- 257943739, 3469817723, 1462980986, 2529005242, 3213269817, 2114471161, 3890881272, 644152632, +- 3046902270, 1947391550, 3991973951, 746483711, 88439420, 3301680572, 1563018173, 2628197501, +- 657826727, 3871046759, 2136545894, 3201811878, 2548879397, 1449267173, 3481299428, 235845156, +- 2650161890, 1551408418, 3315268387, 68429027, 758067552, 3970035360, 1967360161, 3033356129, +- 2311284588, 1213053100, 3517963949, 270598509, 958010606, 4170500910, 1635167535, 2700636911, +- 855672361, 4069415401, 1802256360, 2866995240, 2212099499, 1113008747, 3686091882, 440112042, +- }, { +- 0, 2611301487, 3963330207, 2006897392, 50740095, 2560849680, 4013794784, 1956178319, +- 101480190, 2645113489, 3929532513, 1905435662, 84561281, 2662269422, 3912356638, 1922342769, +- 202960380, 2545787283, 3760419683, 2072395532, 253679235, 2495322860, 3810871324, 2021655667, +- 169122562, 2444351341, 3861841309, 2106214898, 152215677, 2461527058, 3844685538, 2123133581, +- 405920760, 2207553431, 4094313831, 1873742088, 456646791, 2157096168, 4144791064, 1823027831, +- 507358470, 2241388905, 4060492697, 1772322806, 490444409, 2258557462, 4043311334, 1789215881, +- 338245124, 2408348267, 4161972379, 1672996084, 388959611, 2357870868, 4212429796, 1622269835, +- 304431354, 2306870421, 4263435877, 1706791434, 287538053, 2324051946, 4246267162, 1723705717, +- 811841520, 2881944479, 3696765295, 1207788800, 862293135, 2831204576, 3747484176, 1157324415, +- 913293582, 2915732833, 3662962577, 1106318334, 896137841, 2932651550, 3646055662, 1123494017, +- 1014716940, 2816349795, 3493905555, 1273334012, 1065181555, 2765630748, 3544645612, 1222882179, +- 980888818, 2714919069, 3595350637, 1307180546, 963712909, 2731826146, 3578431762, 1324336509, +- 676490248, 3019317351, 3295277719, 1607253752, 726947703, 2968591128, 3345992168, 1556776327, +- 777919222, 3053147801, 3261432937, 1505806342, 760750473, 3070062054, 3244539670, 1522987897, +- 608862708, 3220163995, 3362856811, 1406423812, 659339915, 3169449700, 3413582868, 1355966587, +- 575076106, 3118709605, 3464325525, 1440228858, 557894773, 3135602714, 3447411434, 1457397381, +- 1623683040, 4217512847, 2365387135, 391757072, 1673614495, 4167309552, 2415577600, 341804655, +- 1724586270, 4251866481, 2331019137, 290835438, 1707942497, 4268256782, 2314648830, 307490961, +- 1826587164, 4152020595, 2162433155, 457265388, 1876539747, 4101829900, 2212636668, 407333779, +- 1792275682, 4051089549, 2263378557, 491595282, 1775619997, 4067460082, 2246988034, 508239213, +- 2029433880, 3813931127, 2496473735, 258500328, 2079362919, 3763716872, 2546668024, 208559511, +- 2130363110, 3848244873, 2462145657, 157552662, 2113730969, 3864638966, 2445764358, 174205801, +- 1961777636, 4014675339, 2564147067, 57707284, 2011718299, 3964481268, 2614361092, 7778411, +- 1927425818, 3913769845, 2665066885, 92077546, 1910772837, 3930150922, 2648673018, 108709525, +- 1352980496, 3405878399, 3164554895, 658115296, 1403183983, 3355946752, 3214507504, 607924639, +- 1453895406, 3440239233, 3130208369, 557218846, 1437504913, 3456883198, 3113552654, 573589345, +- 1555838444, 3340335491, 2961681267, 723707676, 1606028947, 3290383100, 3011612684, 673504355, +- 1521500946, 3239382909, 3062619533, 758026722, 1505130605, 3256038402, 3045975794, 774417053, +- 1217725416, 3543158663, 2762906999, 1057739032, 1267939479, 3493229816, 2812847624, 1007544935, +- 1318679830, 3577493881, 2728586121, 956803046, 1302285929, 3594125830, 2711933174, 973184153, +- 1150152212, 3743982203, 2830528651, 856898788, 1200346475, 3694041348, 2880457716, 806684571, +- 1115789546, 3643069573, 2931426933, 891243034, 1099408277, 3659722746, 2914794762, 907637093, +- }, { +- 0, 3717650821, 1616688459, 3184159950, 3233376918, 489665299, 2699419613, 2104690264, +- 1510200173, 2274691816, 979330598, 3888758691, 2595928571, 1194090622, 4209380528, 661706037, +- 3020400346, 1771143007, 3562738577, 164481556, 1958661196, 2837976521, 350386439, 3379863682, +- 3993269687, 865250354, 2388181244, 1406015865, 784146209, 4079732388, 1323412074, 2474079215, +- 3011398645, 1860735600, 3542286014, 246687547, 1942430051, 2924607718, 328963112, 3456978349, +- 3917322392, 887832861, 2300653011, 1421341782, 700772878, 4099025803, 1234716485, 2483986112, +- 125431087, 3673109674, 1730500708, 3132326369, 3351283641, 441867836, 2812031730, 2047535991, +- 1568292418, 2163009479, 1025936137, 3769651852, 2646824148, 1079348561, 4255113631, 537475098, +- 3180171691, 1612400686, 3721471200, 4717925, 2100624189, 2694980280, 493375094, 3237910515, +- 3884860102, 974691139, 2278750093, 1514417672, 657926224, 4204917205, 1198234907, 2600289438, +- 160053105, 3558665972, 1775665722, 3024116671, 3375586791, 346391650, 2842683564, 1962488105, +- 1401545756, 2384412057, 869618007, 3997403346, 2469432970, 1319524111, 4083956673, 788193860, +- 250862174, 3546612699, 1856990997, 3006903952, 3461001416, 333211981, 2920678787, 1937824774, +- 1425017139, 2305216694, 883735672, 3912918525, 2487837605, 1239398944, 4095071982, 696455019, +- 3136584836, 1734518017, 3668494799, 121507914, 2051872274, 2816200599, 437363545, 3347544796, +- 3774328809, 1029797484, 2158697122, 1564328743, 542033279, 4258798842, 1074950196, 2642717105, +- 2691310871, 2113731730, 3224801372, 497043929, 1624461185, 3175454212, 9435850, 3709412175, +- 4201248378, 671035391, 2587181873, 1201904308, 986750188, 3880142185, 1519135143, 2266689570, +- 342721485, 3388693064, 1949382278, 2846355203, 3570723163, 155332830, 3028835344, 1763607957, +- 1315852448, 2482538789, 775087595, 4087626862, 2396469814, 1396827059, 4002123645, 857560824, +- 320106210, 3464673127, 1934154665, 2933785132, 3551331444, 238804465, 3018961215, 1852270778, +- 1226292623, 2491507722, 692783300, 4108177729, 2309936921, 1412959900, 3924976210, 879016919, +- 2803091512, 2055541181, 3343875443, 450471158, 1739236014, 3124525867, 133568485, 3663777376, +- 4245691221, 545702608, 2639048222, 1088059291, 1034514883, 3762268230, 1576387720, 2153979149, +- 501724348, 3228659001, 2109407735, 2687359090, 3713981994, 13109167, 3171052385, 1620357860, +- 1206151121, 2591211092, 666423962, 4197321503, 2271022407, 1523307714, 3875649548, 982999433, +- 2850034278, 1953942499, 3384583981, 338329256, 1767471344, 3033506165, 151375291, 3566408766, +- 4091789579, 779425934, 2478797888, 1311354309, 861580189, 4006375960, 1392910038, 2391852883, +- 2929327945, 1930372812, 3469036034, 324244359, 1847629279, 3015068762, 243015828, 3555391761, +- 4103744548, 688715169, 2496043375, 1229996266, 874727090, 3920994103, 1417671673, 2313759356, +- 446585235, 3339223062, 2059594968, 2807313757, 3660002053, 129100416, 3128657486, 1743609803, +- 1084066558, 2634765179, 549535669, 4250396208, 2149900392, 1571961325, 3765982499, 1039043750, +- }, { +- 0, 2635063670, 3782132909, 2086741467, 430739227, 2225303149, 4173482934, 1707977408, +- 861478454, 2924937024, 3526875803, 1329085421, 720736557, 3086643291, 3415954816, 1452586230, +- 1722956908, 4223524122, 2279405761, 450042295, 2132718455, 3792785921, 2658170842, 58693292, +- 1441473114, 3370435372, 3028674295, 696911745, 1279765825, 3511176247, 2905172460, 807831706, +- 3445913816, 1349228974, 738901109, 2969918723, 3569940419, 1237784245, 900084590, 2829701656, +- 4265436910, 1664255896, 525574723, 2187084597, 3885099509, 2057177219, 117386584, 2616249390, +- 2882946228, 920233410, 1253605401, 3619119471, 2994391983, 796207833, 1393823490, 3457937012, +- 2559531650, 92322804, 2044829231, 3840835417, 2166609305, 472659183, 1615663412, 4249022530, +- 1102706673, 3702920839, 2698457948, 1037619754, 1477802218, 3306854812, 3111894087, 611605809, +- 1927342535, 4025419953, 2475568490, 243387420, 1800169180, 4131620778, 2317525617, 388842247, +- 655084445, 3120835307, 3328511792, 1533734470, 1051149446, 2745738736, 3754524715, 1120297309, +- 340972971, 2304586973, 4114354438, 1748234352, 234773168, 2431761350, 3968900637, 1906278251, +- 2363330345, 299003487, 1840466820, 4038896370, 2507210802, 142532932, 1948239007, 3910149609, +- 3213136159, 579563625, 1592415666, 3286611140, 2787646980, 992477042, 1195825833, 3662232543, +- 3933188933, 2002801203, 184645608, 2517538462, 4089658462, 1858919720, 313391347, 2409765253, +- 3644239219, 1144605701, 945318366, 2773977256, 3231326824, 1570095902, 569697989, 3170568115, +- 2205413346, 511446676, 1646078799, 4279421497, 2598330617, 131105167, 2075239508, 3871229218, +- 2955604436, 757403810, 1363424633, 3427521551, 2844163791, 881434553, 1223211618, 3588709140, +- 3854685070, 2026779384, 78583587, 2577462869, 4235025557, 1633861091, 486774840, 2148301134, +- 3600338360, 1268198606, 938871061, 2868504675, 3476308643, 1379640277, 777684494, 3008718712, +- 1310168890, 3541595724, 2943964055, 846639841, 1471879201, 3400857943, 3067468940, 735723002, +- 2102298892, 3762382970, 2619362721, 19901655, 1692534295, 4193118049, 2240594618, 411247564, +- 681945942, 3047836192, 3385552891, 1422167693, 822682701, 2886124859, 3496468704, 1298661782, +- 469546336, 2264093718, 4203901389, 1738379451, 38812283, 2673859341, 3812556502, 2117148576, +- 3268024339, 1606809957, 598006974, 3198893512, 3680933640, 1181316734, 973624229, 2802299603, +- 4052944421, 1822222163, 285065864, 2381456382, 3896478014, 1966106696, 156323219, 2489232613, +- 2759337087, 964150537, 1159127250, 3625517476, 3184831332, 551242258, 1555722185, 3249901247, +- 2535537225, 170842943, 1984954084, 3946848146, 2391651666, 327308324, 1877176831, 4075589769, +- 263086283, 2460058045, 4005602406, 1942963472, 369291216, 2332888742, 4151061373, 1784924683, +- 1022852861, 2717425547, 3717839440, 1083595558, 626782694, 3092517008, 3291821387, 1497027645, +- 1763466407, 4094934481, 2289211402, 360544636, 1890636732, 3988730570, 2447251217, 215086695, +- 1514488465, 3343557607, 3140191804, 639919946, 1139395978, 3739626748, 2726758695, 1065936977, +- }, { +- 0, 3120290792, 2827399569, 293431929, 2323408227, 864534155, 586863858, 2600537882, +- 3481914503, 1987188591, 1729068310, 3740575486, 1173727716, 4228805132, 3983743093, 1418249117, +- 1147313999, 4254680231, 3974377182, 1428157750, 3458136620, 2011505092, 1721256893, 3747844181, +- 2347455432, 839944224, 594403929, 2593536433, 26687147, 3094146371, 2836498234, 283794642, +- 2294627998, 826205558, 541298447, 2578994407, 45702141, 3141697557, 2856315500, 331624836, +- 1196225049, 4273416689, 4023010184, 1446090848, 3442513786, 1959480466, 1706436331, 3696098563, +- 3433538001, 1968994873, 1679888448, 3722103720, 1188807858, 4280295258, 3999102243, 1470541515, +- 53374294, 3134568126, 2879970503, 307431215, 2303854645, 816436189, 567589284, 2553242188, +- 3405478781, 1929420949, 1652411116, 3682996484, 1082596894, 4185703926, 3892424591, 1375368295, +- 91404282, 3163122706, 2918450795, 336584067, 2400113305, 922028401, 663249672, 2658384096, +- 2392450098, 929185754, 639587747, 2682555979, 82149713, 3172883129, 2892181696, 362343208, +- 1091578037, 4176212829, 3918960932, 1349337804, 3412872662, 1922537022, 1676344391, 3658557359, +- 1111377379, 4224032267, 3937989746, 1396912026, 3359776896, 1908013928, 1623494929, 3644803833, +- 2377615716, 877417100, 623982837, 2630542109, 130804743, 3190831087, 2941083030, 381060734, +- 106748588, 3215393092, 2933549885, 388083925, 2350956495, 903570471, 614862430, 2640172470, +- 3386185259, 1882115523, 1632872378, 3634920530, 1135178568, 4199721120, 3945775833, 1389631793, +- 1317531835, 4152109907, 3858841898, 1610259138, 3304822232, 2097172016, 1820140617, 3582394273, +- 2165193788, 955639764, 696815021, 2423477829, 192043359, 2995356343, 2750736590, 437203750, +- 182808564, 3005133852, 2724453989, 462947725, 2157513367, 962777471, 673168134, 2447663342, +- 3312231283, 2090301595, 1844056802, 3557935370, 1326499344, 4142603768, 3885397889, 1584245865, +- 3326266917, 2142836173, 1858371508, 3611272284, 1279175494, 4123357358, 3837270743, 1564721471, +- 164299426, 2955991370, 2706223923, 414607579, 2209834945, 978107433, 724686416, 2462715320, +- 2183156074, 1004243586, 715579643, 2472360723, 140260361, 2980573153, 2698675608, 421617264, +- 1302961645, 4099032581, 3845074044, 1557460884, 3352688782, 2116952934, 1867729183, 3601371895, +- 2222754758, 1032278062, 754596439, 2499928511, 234942117, 3086693709, 2793824052, 528319708, +- 1274365761, 4061043881, 3816027856, 1518873912, 3246989858, 2020800970, 1762628531, 3505670235, +- 3223196809, 2045103969, 1754834200, 3512958704, 1247965674, 4086934018, 3806642299, 1528765331, +- 261609486, 3060532198, 2802936223, 518697591, 2246819181, 1007707781, 762121468, 2492913428, +- 213497176, 3041029808, 2755593417, 499441441, 2261110843, 1061030867, 776167850, 2545465922, +- 3274734047, 2060165687, 1807140942, 3528266662, 1229724860, 4038575956, 3788156205, 1479636677, +- 1222322711, 4045468159, 3764231046, 1504067694, 3265744756, 2069664924, 1780612837, 3554288909, +- 2270357136, 1051278712, 802445057, 2519698665, 221152243, 3033880603, 2779263586, 475261322, +- }, { +- 0, 2926088593, 2275419491, 701019378, 3560000647, 2052709654, 1402038756, 4261017717, +- 1930665807, 3715829470, 4105419308, 1524313021, 2804077512, 155861593, 545453739, 2397726522, +- 3861331614, 1213181711, 1636244477, 3488582252, 840331801, 2625561480, 3048626042, 467584747, +- 2503254481, 995897408, 311723186, 3170637091, 1090907478, 4016929991, 3332753461, 1758288292, +- 390036349, 3109546732, 2426363422, 1056427919, 3272488954, 1835443819, 1152258713, 3938878216, +- 1680663602, 3393484195, 3817652561, 1306808512, 2954733749, 510998820, 935169494, 2580880455, +- 4044899811, 1601229938, 1991794816, 3637571857, 623446372, 2336332021, 2726898695, 216120726, +- 2181814956, 744704829, 95158223, 2881711710, 1446680107, 4166125498, 3516576584, 2146575065, +- 780072698, 2148951915, 2849952665, 129384968, 4199529085, 1411853292, 2112855838, 3548843663, +- 1567451573, 4077254692, 3670887638, 1957027143, 2304517426, 657765539, 251396177, 2694091200, +- 3361327204, 1714510325, 1341779207, 3784408214, 476611811, 2986349938, 2613617024, 899690513, +- 3142211371, 354600634, 1021997640, 2458051545, 1870338988, 3239283261, 3906682575, 1186180958, +- 960597383, 2536053782, 3202459876, 277428597, 3983589632, 1125666961, 1792074851, 3300423154, +- 1246892744, 3829039961, 3455203243, 1671079482, 2657312335, 806080478, 432241452, 3081497277, +- 3748049689, 1896751752, 1489409658, 4138600427, 190316446, 2772397583, 2365053693, 580864876, +- 2893360214, 35503559, 735381813, 2243795108, 2017747153, 3593269568, 4293150130, 1368183843, +- 1560145396, 4069882981, 3680356503, 1966430470, 2295112051, 648294626, 258769936, 2701399425, +- 804156091, 2173100842, 2823706584, 103204425, 4225711676, 1438101421, 2088704863, 3524758222, +- 3134903146, 347226875, 1031468553, 2467456920, 1860935661, 3229814396, 3914054286, 1193487135, +- 3385412645, 1738661300, 1315531078, 3758225623, 502792354, 3012596019, 2589468097, 875607120, +- 1271043721, 3853125400, 3429020650, 1644831355, 2683558414, 832261023, 408158061, 3057348348, +- 953223622, 2528745559, 3211865253, 286899508, 3974120769, 1116263632, 1799381026, 3307794867, +- 2917509143, 59586950, 709201268, 2217549029, 2043995280, 3619452161, 4269064691, 1344032866, +- 3740677976, 1889445577, 1498812987, 4148069290, 180845535, 2762992206, 2372361916, 588238637, +- 1921194766, 3706423967, 4112727661, 1531686908, 2796705673, 148555288, 554857194, 2407195515, +- 26248257, 2952271312, 2251333922, 676868275, 3584149702, 2076793175, 1375858085, 4234771508, +- 2493785488, 986493953, 319029491, 3178008930, 1083533591, 4009621638, 3342158964, 1767759333, +- 3887577823, 1239362382, 1612160956, 3464433197, 864482904, 2649647049, 3022443323, 441336490, +- 1706844275, 3419730402, 3793503504, 1282724993, 2978819316, 535149925, 908921239, 2554697734, +- 380632892, 3100077741, 2433735263, 1063734222, 3265180603, 1828069930, 1161729752, 3948283721, +- 2207997677, 770953084, 71007118, 2857626143, 1470763626, 4190274555, 3490330377, 2120394392, +- 4035494306, 1591758899, 1999168705, 3644880208, 616140069, 2328960180, 2736367686, 225524183, +- }, +-}; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 212, 43, 68, 84, 1, 0, 0, 0, +- 150, 21, 228, 198, 1, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K3K4[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 208, 151, 25, 117, 1, 0, 0, 0, +- 158, 0, 170, 204, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 36, 97, 205, 99, 1, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 65, 6, 113, 219, 1, 0, 0, 0, +- 65, 22, 1, 247, 1, 0, 0, 0, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ label__outer__continue:; ++ while (true) { ++ while (self->private_impl.f_pending_pad > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ self->private_impl.f_pending_pad -= 1u; ++ iop_a_src += 1u; ++ } ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ if (self->private_impl.f_height > 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_pad_per_row != 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ goto label__outer__continue; ++ } ++ } ++ v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)); ++ v_p1 = wuffs_base__u32__min(v_p1_temp, 256u); ++ v_p0 = 0u; ++ while (v_p0 < v_p1) { ++ if (self->private_impl.f_bits_per_pixel == 16u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ break; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ break; ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ } ++ v_channel = 0u; ++ while (v_channel < 4u) { ++ if (self->private_impl.f_channel_num_bits[v_channel] == 0u) { ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u; ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u; ++ } else { ++ v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]); ++ v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel])); ++ while (v_num_bits < 16u) { ++ v_c |= ((uint32_t)(v_c << v_num_bits)); ++ v_num_bits *= 2u; ++ } ++ v_c >>= (v_num_bits - 16u); ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u))); ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u))); ++ } ++ v_channel += 1u; ++ } ++ v_p0 += 1u; ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_n = ((uint64_t)(v_p0)); ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8u * v_p0))); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ } ++ label__outer__break:; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up__choosy_default( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_arm_crc32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++ return status; ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_avx2( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++// -------- func bmp.decoder.swizzle_low_bit_depth + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_sse42( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-// ---------------- VTables +- +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32), +-}; ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_low_bit_depth( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint32_t v_chunk_bits = 0; ++ uint32_t v_chunk_count = 0; ++ uint32_t v_pixels_per_chunk = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_crc32__ieee_hasher__initialize( +- wuffs_crc32__ieee_hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); ++ v_pixels_per_chunk = 32u; ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); ++ v_pixels_per_chunk = 16u; ++ } else { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); ++ v_pixels_per_chunk = 8u; ++ } ++ while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) { ++ iop_a_src += 256u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64u)))); ++ v_chunk_count -= 64u; ++ } ++ while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) { ++ iop_a_src += 32u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8u)))); ++ v_chunk_count -= 8u; ++ } ++ while (v_chunk_count > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ iop_a_src += 4u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1u)))); ++ v_chunk_count -= 1u; ++ } ++ continue; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); ++ v_p0 = 0u; ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u)))); ++ self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u)))); ++ self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u)))); ++ self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u)))); ++ self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u)))); ++ self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u)))); ++ self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u)))); ++ self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u)))); ++ self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u)))); ++ self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u)))); ++ self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u)))); ++ self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u)))); ++ self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u)))); ++ self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u)))); ++ self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u)))); ++ self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u)))); ++ self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u)))); ++ self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u)))); ++ self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 32u); ++ v_chunk_count -= 1u; ++ } ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u)))); ++ self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u)))); ++ self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u)))); ++ self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u)))); ++ self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 16u); ++ v_chunk_count -= 1u; ++ } + } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 8u); ++ v_chunk_count -= 1u; ++ } ++ } ++ v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); + } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default; ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32); +- return wuffs_base__make_status(NULL); ++ return status; + } + +-wuffs_crc32__ieee_hasher* +-wuffs_crc32__ieee_hasher__alloc(void) { +- wuffs_crc32__ieee_hasher* x = +- (wuffs_crc32__ieee_hasher*)(calloc(sizeof(wuffs_crc32__ieee_hasher), 1)); +- if (!x) { +- return NULL; ++// -------- func bmp.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_bmp__decoder__frame_dirty_rect( ++ const wuffs_bmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } +- if (wuffs_crc32__ieee_hasher__initialize( +- x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } +- return x; +-} + +-size_t +-sizeof__wuffs_crc32__ieee_hasher(void) { +- return sizeof(wuffs_crc32__ieee_hasher); ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); + } + +-// ---------------- Function Implementations +- +-// -------- func crc32.ieee_hasher.get_quirk ++// -------- func bmp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_crc32__ieee_hasher__get_quirk( +- const wuffs_crc32__ieee_hasher* self, +- uint32_t a_key) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_bmp__decoder__num_animation_loops( ++ const wuffs_bmp__decoder* self) { + if (!self) { + return 0; + } +@@ -33524,709 +33654,531 @@ wuffs_crc32__ieee_hasher__get_quirk( + return 0u; + } + +-// -------- func crc32.ieee_hasher.set_quirk ++// -------- func bmp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_crc32__ieee_hasher__set_quirk( +- wuffs_crc32__ieee_hasher* self, +- uint32_t a_key, +- uint64_t a_value) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__num_decoded_frame_configs( ++ const wuffs_bmp__decoder* self) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func crc32.ieee_hasher.update ++// -------- func bmp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__update( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__num_decoded_frames( ++ const wuffs_bmp__decoder* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- if (self->private_impl.f_state == 0u) { +- self->private_impl.choosy_up = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +- wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_crc32__ieee_hasher__up_x86_avx2 : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 : +-#endif +- self->private_impl.choosy_up); ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; + } +- wuffs_crc32__ieee_hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); ++ return 0u; + } + +-// -------- func crc32.ieee_hasher.update_u32 ++// -------- func bmp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_crc32__ieee_hasher__update_u32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__restart_frame( ++ wuffs_bmp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { + if (!self) { +- return 0; ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- wuffs_crc32__ieee_hasher__update(self, a_x); +- return self->private_impl.f_state; ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ return wuffs_base__make_status(NULL); + } + +-// -------- func crc32.ieee_hasher.up ++// -------- func bmp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- return (*self->private_impl.choosy_up)(self, a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_bmp__decoder__set_report_metadata( ++ wuffs_bmp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); + } + ++// -------- func bmp.decoder.tell_me_more ++ + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up__choosy_default( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 16; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- } +- v_p.len = 16; +- uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16); +- while (v_p.ptr < i_end1_p) { +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- } +- v_p.len = 1; +- uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end2_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- v_p.len = 0; ++ ++ ok: ++ self->private_impl.p_tell_me_more = 0; ++ goto exit; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func crc32.ieee_hasher.checksum_u32 ++// -------- func bmp.decoder.do_tell_me_more + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_crc32__ieee_hasher__checksum_u32( +- const wuffs_crc32__ieee_hasher* self) { +- if (!self) { +- return 0; ++static wuffs_base__status ++wuffs_bmp__decoder__do_tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ if (self->private_impl.f_io_redirect_fourcc <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 1u, ++ self->private_impl.f_io_redirect_fourcc, ++ 0u, ++ self->private_impl.f_io_redirect_pos, ++ 18446744073709551615u); + } ++ self->private_impl.f_io_redirect_fourcc = 1u; + +- return self->private_impl.f_state; ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ return status; + } + +-// ‼ WUFFS MULTI-FILE SECTION +arm_crc32 +-// -------- func crc32.ieee_hasher.up_arm_crc32 ++// -------- func bmp.decoder.workbuf_len + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_arm_crc32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- wuffs_base__slice_u8 v_p = {0}; +- uint32_t v_s = 0; +- +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = __crc32b(v_s, a_x.ptr[0u]); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_bmp__decoder__workbuf_len( ++ const wuffs_bmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 8; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128); +- while (v_p.ptr < i_end0_p) { +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- } +- v_p.len = 8; +- uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); +- while (v_p.ptr < i_end1_p) { +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- } +- v_p.len = 1; +- uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end2_p) { +- v_s = __crc32b(v_s, v_p.ptr[0u]); +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +-// ‼ WUFFS MULTI-FILE SECTION -arm_crc32 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-// -------- func crc32.ieee_hasher.up_x86_avx2 ++// -------- func bmp.decoder.read_palette + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_avx2( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_k = {0}; +- __m128i v_x0 = {0}; +- __m128i v_x1 = {0}; +- __m128i v_x2 = {0}; +- __m128i v_x3 = {0}; +- __m128i v_y0 = {0}; +- __m128i v_y1 = {0}; +- __m128i v_y2 = {0}; +- __m128i v_y3 = {0}; +- uint64_t v_tail_index = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__read_palette( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ a_x.ptr[0u])] ^ (v_s >> 8u)); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (((uint64_t)(a_x.len)) < 64u) { +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ ++ uint32_t coro_susp_point = self->private_impl.p_read_palette; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_read_palette.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_bitmap_info_len == 12u) { ++ while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) { ++ self->private_impl.f_padding -= 3u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_read_palette.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_read_palette.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 16) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_argb = t_0; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ } else { ++ while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) { ++ self->private_impl.f_padding -= 4u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_read_palette.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_read_palette.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_argb = t_1; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; + } +- v_p.len = 0; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); +- } +- v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); +- v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); +- v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); +- v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); +- v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 64; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); +- while (v_p.ptr < i_end0_p) { +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u)); +- v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u)); +- v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u)); +- v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u))); +- v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u))); +- v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u))); +- v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u))); +- v_p.ptr += 64; ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- v_p.len = 0; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_read_palette = 0; ++ goto exit; + } +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x2); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x3); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u)); +- v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u)); +- v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); +- v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u)); +- v_x0 = _mm_and_si128(v_x0, v_x2); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); +- v_x1 = _mm_and_si128(v_x0, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u)); +- v_x1 = _mm_and_si128(v_x1, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u)))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; +- } +- v_p.len = 0; +- } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_read_palette = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_read_palette.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func crc32.ieee_hasher.up_x86_sse42 ++// -------- func bmp.decoder.process_masks + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_sse42( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_k = {0}; +- __m128i v_x0 = {0}; +- __m128i v_x1 = {0}; +- __m128i v_x2 = {0}; +- __m128i v_x3 = {0}; +- __m128i v_y0 = {0}; +- __m128i v_y1 = {0}; +- __m128i v_y2 = {0}; +- __m128i v_y3 = {0}; +- uint64_t v_tail_index = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__process_masks( ++ wuffs_bmp__decoder* self) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ a_x.ptr[0u])] ^ (v_s >> 8u)); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- if (((uint64_t)(a_x.len)) < 64u) { +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ uint32_t v_i = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_n = 0; ++ ++ while (v_i < 4u) { ++ v_mask = self->private_impl.f_channel_masks[v_i]; ++ if (v_mask != 0u) { ++ v_n = 0u; ++ while ((v_mask & 1u) == 0u) { ++ v_n += 1u; ++ v_mask >>= 1u; + } +- v_p.len = 0; +- } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); +- } +- v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); +- v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); +- v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); +- v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); +- v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 64; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); +- while (v_p.ptr < i_end0_p) { +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u)); +- v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u)); +- v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u)); +- v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u))); +- v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u))); +- v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u))); +- v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u))); +- v_p.ptr += 64; +- } +- v_p.len = 0; +- } +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x2); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x3); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u)); +- v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u)); +- v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); +- v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u)); +- v_x0 = _mm_and_si128(v_x0, v_x2); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); +- v_x1 = _mm_and_si128(v_x0, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u)); +- v_x1 = _mm_and_si128(v_x1, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u)))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u))); ++ v_n = 0u; ++ while ((v_mask & 1u) == 1u) { ++ v_n += 1u; ++ v_mask >>= 1u; + } +- v_p.len = 0; ++ if ((v_mask != 0u) || (v_n > 32u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n)); ++ } else if (v_i != 3u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; + } ++ v_i += 1u; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) + + // ---------------- Status Codes Implementations + +-const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)"; +-const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)"; +-const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count"; +-const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition"; +-const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code"; +-const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length"; +-const char wuffs_deflate__error__bad_block[] = "#deflate: bad block"; +-const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance"; +-const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count"; +-const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count"; +-const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length"; +-const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code"; +-const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes"; +-const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input"; +-const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state"; +-const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O"; +-const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance"; +-const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits"; ++const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; ++const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; ++const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; ++const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; ++const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; ++const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; ++const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; ++const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input"; ++const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; ++const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; + + // ---------------- Private Consts + + static const uint8_t +-WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 16, 17, 18, 0, 8, 7, 9, 6, +- 10, 5, 11, 4, 12, 3, 13, 2, +- 14, 1, 15, +-}; +- +-static const uint8_t +-WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 128, 64, 192, 32, 160, 96, 224, +- 16, 144, 80, 208, 48, 176, 112, 240, +- 8, 136, 72, 200, 40, 168, 104, 232, +- 24, 152, 88, 216, 56, 184, 120, 248, +- 4, 132, 68, 196, 36, 164, 100, 228, +- 20, 148, 84, 212, 52, 180, 116, 244, +- 12, 140, 76, 204, 44, 172, 108, 236, +- 28, 156, 92, 220, 60, 188, 124, 252, +- 2, 130, 66, 194, 34, 162, 98, 226, +- 18, 146, 82, 210, 50, 178, 114, 242, +- 10, 138, 74, 202, 42, 170, 106, 234, +- 26, 154, 90, 218, 58, 186, 122, 250, +- 6, 134, 70, 198, 38, 166, 102, 230, +- 22, 150, 86, 214, 54, 182, 118, 246, +- 14, 142, 78, 206, 46, 174, 110, 238, +- 30, 158, 94, 222, 62, 190, 126, 254, +- 1, 129, 65, 193, 33, 161, 97, 225, +- 17, 145, 81, 209, 49, 177, 113, 241, +- 9, 137, 73, 201, 41, 169, 105, 233, +- 25, 153, 89, 217, 57, 185, 121, 249, +- 5, 133, 69, 197, 37, 165, 101, 229, +- 21, 149, 85, 213, 53, 181, 117, 245, +- 13, 141, 77, 205, 45, 173, 109, 237, +- 29, 157, 93, 221, 61, 189, 125, 253, +- 3, 131, 67, 195, 35, 163, 99, 227, +- 19, 147, 83, 211, 51, 179, 115, 243, +- 11, 139, 75, 203, 43, 171, 107, 235, +- 27, 155, 91, 219, 59, 187, 123, 251, +- 7, 135, 71, 199, 39, 167, 103, 231, +- 23, 151, 87, 215, 55, 183, 119, 247, +- 15, 143, 79, 207, 47, 175, 111, 239, +- 31, 159, 95, 223, 63, 191, 127, 255, +-}; +- +-static const uint32_t +-WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1073741824, 1073742080, 1073742336, 1073742592, 1073742848, 1073743104, 1073743360, 1073743616, +- 1073743888, 1073744400, 1073744912, 1073745424, 1073745952, 1073746976, 1073748000, 1073749024, +- 1073750064, 1073752112, 1073754160, 1073756208, 1073758272, 1073762368, 1073766464, 1073770560, +- 1073774672, 1073782864, 1073791056, 1073799248, 1073807104, 134217728, 134217728, 134217728, ++WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 3u, 4u, 5u, 5u, 5u, + }; + + static const uint32_t +-WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1073741824, 1073742080, 1073742336, 1073742592, 1073742864, 1073743376, 1073743904, 1073744928, +- 1073745968, 1073748016, 1073750080, 1073754176, 1073758288, 1073766480, 1073774688, 1073791072, +- 1073807472, 1073840240, 1073873024, 1073938560, 1074004112, 1074135184, 1074266272, 1074528416, +- 1074790576, 1075314864, 1075839168, 1076887744, 1077936336, 1080033488, 134217728, 134217728, ++WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 79764919u, 159529838u, 222504665u, 319059676u, 398814059u, 445009330u, 507990021u, ++ 638119352u, 583659535u, 797628118u, 726387553u, 890018660u, 835552979u, 1015980042u, 944750013u, ++ 1276238704u, 1221641927u, 1167319070u, 1095957929u, 1595256236u, 1540665371u, 1452775106u, 1381403509u, ++ 1780037320u, 1859660671u, 1671105958u, 1733955601u, 2031960084u, 2111593891u, 1889500026u, 1952343757u, ++ 2552477408u, 2632100695u, 2443283854u, 2506133561u, 2334638140u, 2414271883u, 2191915858u, 2254759653u, ++ 3190512472u, 3135915759u, 3081330742u, 3009969537u, 2905550212u, 2850959411u, 2762807018u, 2691435357u, ++ 3560074640u, 3505614887u, 3719321342u, 3648080713u, 3342211916u, 3287746299u, 3467911202u, 3396681109u, ++ 4063920168u, 4143685023u, 4223187782u, 4286162673u, 3779000052u, 3858754371u, 3904687514u, 3967668269u, ++ 881225847u, 809987520u, 1023691545u, 969234094u, 662832811u, 591600412u, 771767749u, 717299826u, ++ 311336399u, 374308984u, 453813921u, 533576470u, 25881363u, 88864420u, 134795389u, 214552010u, ++ 2023205639u, 2086057648u, 1897238633u, 1976864222u, 1804852699u, 1867694188u, 1645340341u, 1724971778u, ++ 1587496639u, 1516133128u, 1461550545u, 1406951526u, 1302016099u, 1230646740u, 1142491917u, 1087903418u, ++ 2896545431u, 2825181984u, 2770861561u, 2716262478u, 3215044683u, 3143675388u, 3055782693u, 3001194130u, ++ 2326604591u, 2389456536u, 2200899649u, 2280525302u, 2578013683u, 2640855108u, 2418763421u, 2498394922u, ++ 3769900519u, 3832873040u, 3912640137u, 3992402750u, 4088425275u, 4151408268u, 4197601365u, 4277358050u, ++ 3334271071u, 3263032808u, 3476998961u, 3422541446u, 3585640067u, 3514407732u, 3694837229u, 3640369242u, ++ 1762451694u, 1842216281u, 1619975040u, 1682949687u, 2047383090u, 2127137669u, 1938468188u, 2001449195u, ++ 1325665622u, 1271206113u, 1183200824u, 1111960463u, 1543535498u, 1489069629u, 1434599652u, 1363369299u, ++ 622672798u, 568075817u, 748617968u, 677256519u, 907627842u, 853037301u, 1067152940u, 995781531u, ++ 51762726u, 131386257u, 177728840u, 240578815u, 269590778u, 349224269u, 429104020u, 491947555u, ++ 4046411278u, 4126034873u, 4172115296u, 4234965207u, 3794477266u, 3874110821u, 3953728444u, 4016571915u, ++ 3609705398u, 3555108353u, 3735388376u, 3664026991u, 3290680682u, 3236090077u, 3449943556u, 3378572211u, ++ 3174993278u, 3120533705u, 3032266256u, 2961025959u, 2923101090u, 2868635157u, 2813903052u, 2742672763u, ++ 2604032198u, 2683796849u, 2461293480u, 2524268063u, 2284983834u, 2364738477u, 2175806836u, 2238787779u, ++ 1569362073u, 1498123566u, 1409854455u, 1355396672u, 1317987909u, 1246755826u, 1192025387u, 1137557660u, ++ 2072149281u, 2135122070u, 1912620623u, 1992383480u, 1753615357u, 1816598090u, 1627664531u, 1707420964u, ++ 295390185u, 358241886u, 404320391u, 483945776u, 43990325u, 106832002u, 186451547u, 266083308u, ++ 932423249u, 861060070u, 1041341759u, 986742920u, 613929101u, 542559546u, 756411363u, 701822548u, ++ 3316196985u, 3244833742u, 3425377559u, 3370778784u, 3601682597u, 3530312978u, 3744426955u, 3689838204u, ++ 3819031489u, 3881883254u, 3928223919u, 4007849240u, 4037393693u, 4100235434u, 4180117107u, 4259748804u, ++ 2310601993u, 2373574846u, 2151335527u, 2231098320u, 2596047829u, 2659030626u, 2470359227u, 2550115596u, ++ 2947551409u, 2876312838u, 2788305887u, 2733848168u, 3165939309u, 3094707162u, 3040238851u, 2985771188u, + }; + +-#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024 +- +-#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023 +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__do_transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__do_transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_blocks( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__prepare_block( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_uncompressed( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__read_code_lengths( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__init_fixed_huffman( +- wuffs_deflate__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_dynamic_huffman( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_bzip2__decoder__build_huffman_tree( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_huff( +- wuffs_deflate__decoder* self, +- uint32_t a_which, +- uint32_t a_n_codes0, +- uint32_t a_n_codes1, +- uint32_t a_base_symbol); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__build_huffman_table( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which); + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_bmi2( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__invert_bwt( ++ wuffs_bzip2__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast32( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__flush_fast( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++wuffs_bzip2__decoder__flush_slow( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_fast( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_slow( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_slow( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + // ---------------- VTables + + const wuffs_base__io_transformer__func_ptrs +-wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_bzip2__decoder__dst_history_retain_length), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_deflate__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_deflate__decoder__history_retain_length), ++ uint32_t))(&wuffs_bzip2__decoder__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_deflate__decoder__set_quirk), ++ uint64_t))(&wuffs_bzip2__decoder__set_quirk), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_deflate__decoder__initialize( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__initialize( ++ wuffs_bzip2__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -34263,25 +34215,23 @@ wuffs_deflate__decoder__initialize( + } + } + +- self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default; +- + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); + } + +-wuffs_deflate__decoder* +-wuffs_deflate__decoder__alloc(void) { +- wuffs_deflate__decoder* x = +- (wuffs_deflate__decoder*)(calloc(sizeof(wuffs_deflate__decoder), 1)); ++wuffs_bzip2__decoder* ++wuffs_bzip2__decoder__alloc(void) { ++ wuffs_bzip2__decoder* x = ++ (wuffs_bzip2__decoder*)(calloc(1, sizeof(wuffs_bzip2__decoder))); + if (!x) { + return NULL; + } +- if (wuffs_deflate__decoder__initialize( +- x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_bzip2__decoder__initialize( ++ x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -34289,59 +34239,18 @@ wuffs_deflate__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_deflate__decoder(void) { +- return sizeof(wuffs_deflate__decoder); ++sizeof__wuffs_bzip2__decoder(void) { ++ return sizeof(wuffs_bzip2__decoder); + } + + // ---------------- Function Implementations + +-// -------- func deflate.decoder.add_history +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_deflate__decoder__add_history( +- wuffs_deflate__decoder* self, +- wuffs_base__slice_u8 a_hist) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } +- +- wuffs_base__slice_u8 v_s = {0}; +- uint64_t v_n_copied = 0; +- uint32_t v_already_full = 0; +- +- v_s = a_hist; +- if (((uint64_t)(v_s.len)) >= 32768u) { +- v_s = wuffs_base__slice_u8__suffix(v_s, 32768u); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); +- self->private_impl.f_history_index = 32768u; +- } else { +- v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767u), 32768), v_s); +- if (v_n_copied < ((uint64_t)(v_s.len))) { +- v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); +- v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); +- self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u); +- } else { +- v_already_full = 0u; +- if (self->private_impl.f_history_index >= 32768u) { +- v_already_full = 32768u; +- } +- self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full); +- } +- } +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func deflate.decoder.get_quirk ++// -------- func bzip2.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__get_quirk( +- const wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__get_quirk( ++ const wuffs_bzip2__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -34351,15 +34260,18 @@ wuffs_deflate__decoder__get_quirk( + return 0; + } + ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } + return 0u; + } + +-// -------- func deflate.decoder.set_quirk ++// -------- func bzip2.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_deflate__decoder__set_quirk( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__set_quirk( ++ wuffs_bzip2__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -34372,32 +34284,36 @@ wuffs_deflate__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func deflate.decoder.history_retain_length ++// -------- func bzip2.decoder.dst_history_retain_length + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__history_retain_length( +- const wuffs_deflate__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_bzip2__decoder__dst_history_retain_length( ++ const wuffs_bzip2__decoder* self) { + if (!self) { +- return 0; ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + +- return 0u; ++ return wuffs_base__utility__make_optional_u63(true, 0u); + } + +-// -------- func deflate.decoder.workbuf_len ++// -------- func bzip2.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_deflate__decoder__workbuf_len( +- const wuffs_deflate__decoder* self) { ++wuffs_bzip2__decoder__workbuf_len( ++ const wuffs_bzip2__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } +@@ -34406,15 +34322,15 @@ wuffs_deflate__decoder__workbuf_len( + return wuffs_base__utility__empty_range_ii_u64(); + } + +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); + } + +-// -------- func deflate.decoder.transform_io ++// -------- func bzip2.decoder.transform_io + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_deflate__decoder__transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { +@@ -34441,17 +34357,17 @@ wuffs_deflate__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_deflate__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input); + goto exit; + } + status = v_status; +@@ -34459,13 +34375,13 @@ wuffs_deflate__decoder__transform_io( + } + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; +@@ -34476,103 +34392,22 @@ wuffs_deflate__decoder__transform_io( + return status; + } + +-// -------- func deflate.decoder.do_transform_io ++// -------- func bzip2.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__do_transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__do_transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_mark = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } +- +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.choosy_decode_huffman_fast64 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 : +-#endif +- self->private_impl.choosy_decode_huffman_fast64); +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src); +- v_status = t_0; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- } +- if ( ! wuffs_base__status__is_suspension(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))); +- wuffs_deflate__decoder__add_history(self, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_do_transform_io[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func deflate.decoder.decode_blocks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_blocks( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_final = 0; +- uint32_t v_b0 = 0; +- uint32_t v_type = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint64_t v_tag = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_final_checksum_want = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -34585,125 +34420,206 @@ wuffs_deflate__decoder__decode_blocks( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_blocks[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + if (coro_susp_point) { +- v_final = self->private_data.s_decode_blocks[0].v_final; ++ v_i = self->private_data.s_do_transform_io.v_i; ++ v_tag = self->private_data.s_do_transform_io.v_tag; ++ v_final_checksum_want = self->private_data.s_do_transform_io.v_final_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- label__outer__continue:; +- while (v_final == 0u) { +- while (self->private_impl.f_n_bits < 3u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 66u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 90u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 104u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 < 49u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_max_incl_block_size = (((uint32_t)(((uint8_t)(v_c8 - 48u)))) * 100000u); ++ while (true) { ++ v_tag = 0u; ++ v_i = 0u; ++ while (v_i < 48u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u)); +- self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u); ++ v_tag <<= 1u; ++ v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u))); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- v_final = (self->private_impl.f_bits & 1u); +- v_type = ((self->private_impl.f_bits >> 1u) & 3u); +- self->private_impl.f_bits >>= 3u; +- self->private_impl.f_n_bits -= 3u; +- if (v_type == 0u) { ++ if (v_tag == 25779555029136u) { ++ break; ++ } else if (v_tag != 54156738319193u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_bzip2__decoder__prepare_block(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_block_size = 0u; ++ self->private_impl.f_decode_huffman_finished = false; ++ self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[0u] & 7u))]; ++ self->private_impl.f_decode_huffman_ticks = 50u; ++ self->private_impl.f_decode_huffman_section = 0u; ++ self->private_impl.f_decode_huffman_run_shift = 0u; ++ while ( ! self->private_impl.f_decode_huffman_finished) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src); ++ v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_type == 1u) { +- v_status = wuffs_deflate__decoder__init_fixed_huffman(self); +- if ( ! wuffs_base__status__is_ok(&v_status)) { ++ if (wuffs_base__status__is_error(&v_status)) { + status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; ++ goto exit; ++ } else if (self->private_impl.f_decode_huffman_finished) { ++ break; + } +- } else if (v_type == 2u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_block); ++ } ++ wuffs_bzip2__decoder__invert_bwt(self); ++ self->private_impl.f_block_checksum_have = 4294967295u; ++ if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } +- self->private_impl.f_end_of_block = false; +- while (true) { +- if (sizeof(void*) == 4u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } +- if (self->private_impl.f_end_of_block) { +- goto label__outer__continue; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u); ++ self->private_impl.f_flush_repeat_count = 0u; ++ self->private_impl.f_flush_prev = 0u; ++ while (self->private_impl.f_block_size > 0u) { ++ wuffs_bzip2__decoder__flush_fast(self, a_dst); ++ if (self->private_impl.f_block_size <= 0u) { ++ break; + } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_bzip2__decoder__flush_slow(self, a_dst); + if (status.repr) { + goto suspend; + } +- if (self->private_impl.f_end_of_block) { +- goto label__outer__continue; ++ } ++ self->private_impl.f_block_checksum_have ^= 4294967295u; ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31u) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1u)))); ++ } ++ v_final_checksum_want = 0u; ++ v_i = 0u; ++ while (v_i < 32u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ v_final_checksum_want <<= 1u; ++ v_final_checksum_want |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); ++ goto exit; + } + ++ goto ok; + ok: +- self->private_impl.p_decode_blocks[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_blocks[0].v_final = v_final; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_i = v_i; ++ self->private_data.s_do_transform_io.v_tag = v_tag; ++ self->private_data.s_do_transform_io.v_final_checksum_want = v_final_checksum_want; + + goto exit; + exit: +@@ -34714,32 +34630,23 @@ wuffs_deflate__decoder__decode_blocks( + return status; + } + +-// -------- func deflate.decoder.decode_uncompressed ++// -------- func bzip2.decoder.prepare_block + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_uncompressed( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__prepare_block( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_length = 0; +- uint32_t v_n_copied = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_selector = 0; ++ uint32_t v_sel_ff = 0; ++ uint8_t v_movee = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -34751,387 +34658,287 @@ wuffs_deflate__decoder__decode_uncompressed( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed[0]; ++ uint32_t coro_susp_point = self->private_impl.p_prepare_block; + if (coro_susp_point) { +- v_length = self->private_data.s_decode_uncompressed[0].v_length; ++ v_i = self->private_data.s_prepare_block.v_i; ++ v_selector = self->private_data.s_prepare_block.v_selector; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- self->private_impl.f_n_bits = 0u; +- self->private_impl.f_bits = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_uncompressed[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { ++ self->private_impl.f_block_checksum_want = 0u; ++ v_i = 0u; ++ while (v_i < 32u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_uncompressed[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_length = t_0; +- } +- if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) { +- status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length); +- goto exit; +- } +- v_length = ((v_length) & 0xFFFFu); +- while (true) { +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_reader( +- &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); +- if (v_length <= v_n_copied) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- v_length -= v_n_copied; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } else { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } ++ self->private_impl.f_block_checksum_want <<= 1u; ++ self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- +- ok: +- self->private_impl.p_decode_uncompressed[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_uncompressed[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_uncompressed[0].v_length = v_length; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func deflate.decoder.init_fixed_huffman +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_fixed_huffman( +- wuffs_deflate__decoder* self) { +- uint32_t v_i = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- while (v_i < 144u) { +- self->private_data.f_code_lengths[v_i] = 8u; +- v_i += 1u; +- } +- while (v_i < 256u) { +- self->private_data.f_code_lengths[v_i] = 9u; +- v_i += 1u; +- } +- while (v_i < 280u) { +- self->private_data.f_code_lengths[v_i] = 7u; +- v_i += 1u; +- } +- while (v_i < 288u) { +- self->private_data.f_code_lengths[v_i] = 8u; +- v_i += 1u; +- } +- while (v_i < 320u) { +- self->private_data.f_code_lengths[v_i] = 5u; +- v_i += 1u; +- } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- 288u, +- 257u); +- if (wuffs_base__status__is_error(&v_status)) { +- return v_status; +- } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 1u, +- 288u, +- 320u, +- 0u); +- if (wuffs_base__status__is_error(&v_status)) { +- return v_status; +- } +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func deflate.decoder.init_dynamic_huffman +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_dynamic_huffman( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_b0 = 0; +- uint32_t v_n_lit = 0; +- uint32_t v_n_dist = 0; +- uint32_t v_n_clen = 0; +- uint32_t v_i = 0; +- uint32_t v_b1 = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_mask = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_b2 = 0; +- uint32_t v_n_extra_bits = 0; +- uint8_t v_rep_symbol = 0; +- uint32_t v_rep_count = 0; +- uint32_t v_b3 = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman[0]; +- if (coro_susp_point) { +- v_bits = self->private_data.s_init_dynamic_huffman[0].v_bits; +- v_n_bits = self->private_data.s_init_dynamic_huffman[0].v_n_bits; +- v_n_lit = self->private_data.s_init_dynamic_huffman[0].v_n_lit; +- v_n_dist = self->private_data.s_init_dynamic_huffman[0].v_n_dist; +- v_n_clen = self->private_data.s_init_dynamic_huffman[0].v_n_clen; +- v_i = self->private_data.s_init_dynamic_huffman[0].v_i; +- v_mask = self->private_data.s_init_dynamic_huffman[0].v_mask; +- v_n_extra_bits = self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits; +- v_rep_symbol = self->private_data.s_init_dynamic_huffman[0].v_rep_symbol; +- v_rep_count = self->private_data.s_init_dynamic_huffman[0].v_rep_count; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- while (v_n_bits < 14u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- v_bits |= (v_b0 << v_n_bits); +- v_n_bits += 8u; +- } +- v_n_lit = (((v_bits) & 0x1Fu) + 257u); +- if (v_n_lit > 286u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count); +- goto exit; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_bits >>= 5u; +- v_n_dist = (((v_bits) & 0x1Fu) + 1u); +- if (v_n_dist > 30u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count); ++ if ((self->private_impl.f_bits >> 31u) != 0u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); + goto exit; + } +- v_bits >>= 5u; +- v_n_clen = (((v_bits) & 0xFu) + 4u); +- v_bits >>= 4u; +- v_n_bits -= 14u; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_original_pointer = 0u; + v_i = 0u; +- while (v_i < v_n_clen) { +- while (v_n_bits < 3u) { ++ while (v_i < 24u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_1 = *iop_a_src++; +- v_b1 = t_1; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- v_bits |= (v_b1 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u))); +- v_bits >>= 3u; +- v_n_bits -= 3u; ++ self->private_impl.f_original_pointer <<= 1u; ++ self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; + v_i += 1u; + } +- while (v_i < 19u) { +- self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_presence[v_i] = 0u; + v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- 19u, +- 4095u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } +- v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); + v_i = 0u; +- while (v_i < (v_n_lit + v_n_dist)) { +- while (true) { +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } ++ while (v_i < 256u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_2 = *iop_a_src++; +- v_b2 = t_2; ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- v_bits |= (v_b2 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- if ((v_table_entry >> 24u) != 128u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ if ((self->private_impl.f_bits >> 31u) != 0u) { ++ self->private_data.f_presence[v_i] = 1u; + } +- v_table_entry = ((v_table_entry >> 8u) & 255u); +- if (v_table_entry < 16u) { +- self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry)); +- v_i += 1u; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 16u; ++ } ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ if (self->private_data.f_presence[v_i] == 0u) { ++ v_i += 16u; + continue; + } +- v_n_extra_bits = 0u; +- v_rep_symbol = 0u; +- v_rep_count = 0u; +- if (v_table_entry == 16u) { +- v_n_extra_bits = 2u; +- if (v_i <= 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition); +- goto exit; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ self->private_data.f_scratch += (self->private_impl.f_bits >> 31u); ++ self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u))); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ if ((v_i & 15u) == 0u) { ++ break; + } +- v_rep_symbol = (self->private_data.f_code_lengths[(v_i - 1u)] & 15u); +- v_rep_count = 3u; +- } else if (v_table_entry == 17u) { +- v_n_extra_bits = 3u; +- v_rep_symbol = 0u; +- v_rep_count = 3u; +- } else if (v_table_entry == 18u) { +- v_n_extra_bits = 7u; +- v_rep_symbol = 0u; +- v_rep_count = 11u; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; + } +- while (v_n_bits < v_n_extra_bits) { ++ } ++ if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u); ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 3u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_3 = *iop_a_src++; +- v_b3 = t_3; ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- v_bits |= (v_b3 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_rep_count += ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_n_extra_bits)); +- v_bits >>= v_n_extra_bits; +- v_n_bits -= v_n_extra_bits; +- while (v_rep_count > 0u) { +- if (v_i >= (v_n_lit + v_n_dist)) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); +- goto exit; ++ self->private_data.f_scratch <<= 1u; ++ self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ } ++ if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 15u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- self->private_data.f_code_lengths[v_i] = v_rep_symbol; +- v_i += 1u; +- v_rep_count -= 1u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ self->private_data.f_scratch <<= 1u; ++ self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- if (v_i != (v_n_lit + v_n_dist)) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } +- if (self->private_data.f_code_lengths[256u] == 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code); +- goto exit; ++ self->private_impl.f_num_sections = self->private_data.f_scratch; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_huffman_codes) { ++ self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); ++ v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- v_n_lit, +- 257u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_sections) { ++ v_selector = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ break; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_selector += 1u; ++ if (v_selector >= self->private_impl.f_num_huffman_codes) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ } ++ if (v_selector == 0u) { ++ self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u]; ++ } else { ++ v_sel_ff = (v_selector & 255u); ++ v_movee = self->private_data.f_mtft[v_sel_ff]; ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); ++ self->private_data.f_mtft[0u] = v_movee; ++ self->private_data.f_huffman_selectors[v_i] = v_movee; ++ } ++ v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 1u, +- v_n_lit, +- (v_n_lit + v_n_dist), +- 0u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_huffman_codes) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ wuffs_bzip2__decoder__build_huffman_table(self, v_i); ++ v_i += 1u; ++ } ++ v_i = 0u; ++ v_j = 0u; ++ while (v_i < 256u) { ++ if (self->private_data.f_presence[v_i] != 0u) { ++ self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i)); ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_letter_counts[v_i] = 0u; ++ v_i += 1u; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; + + goto ok; + ok: +- self->private_impl.p_init_dynamic_huffman[0] = 0; ++ self->private_impl.p_prepare_block = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_init_dynamic_huffman[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_init_dynamic_huffman[0].v_bits = v_bits; +- self->private_data.s_init_dynamic_huffman[0].v_n_bits = v_n_bits; +- self->private_data.s_init_dynamic_huffman[0].v_n_lit = v_n_lit; +- self->private_data.s_init_dynamic_huffman[0].v_n_dist = v_n_dist; +- self->private_data.s_init_dynamic_huffman[0].v_n_clen = v_n_clen; +- self->private_data.s_init_dynamic_huffman[0].v_i = v_i; +- self->private_data.s_init_dynamic_huffman[0].v_mask = v_mask; +- self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits = v_n_extra_bits; +- self->private_data.s_init_dynamic_huffman[0].v_rep_symbol = v_rep_symbol; +- self->private_data.s_init_dynamic_huffman[0].v_rep_count = v_rep_count; ++ self->private_impl.p_prepare_block = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_prepare_block.v_i = v_i; ++ self->private_data.s_prepare_block.v_selector = v_selector; + + goto exit; + exit: +@@ -35142,285 +34949,295 @@ wuffs_deflate__decoder__init_dynamic_huffman( + return status; + } + +-// -------- func deflate.decoder.init_huff ++// -------- func bzip2.decoder.read_code_lengths + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__init_huff( +- wuffs_deflate__decoder* self, +- uint32_t a_which, +- uint32_t a_n_codes0, +- uint32_t a_n_codes1, +- uint32_t a_base_symbol) { +- uint16_t v_counts[16] = {0}; ++wuffs_bzip2__decoder__read_code_lengths( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; + uint32_t v_i = 0; +- uint32_t v_remaining = 0; +- uint16_t v_offsets[16] = {0}; +- uint32_t v_n_symbols = 0; +- uint32_t v_count = 0; +- uint16_t v_symbols[320] = {0}; +- uint32_t v_min_cl = 0; +- uint32_t v_max_cl = 0; +- uint32_t v_initial_high_bits = 0; +- uint32_t v_prev_cl = 0; +- uint32_t v_prev_redirect_key = 0; +- uint32_t v_top = 0; +- uint32_t v_next_top = 0; +- uint32_t v_code = 0; +- uint32_t v_key = 0; +- uint32_t v_value = 0; +- uint32_t v_cl = 0; +- uint32_t v_redirect_key = 0; +- uint32_t v_j = 0; +- uint32_t v_reversed_key = 0; +- uint32_t v_symbol = 0; +- uint32_t v_high_bits = 0; +- uint32_t v_delta = 0; ++ uint32_t v_code_length = 0; + +- v_i = a_n_codes0; +- while (v_i < a_n_codes1) { +- if (v_counts[(self->private_data.f_code_lengths[v_i] & 15u)] >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_counts[(self->private_data.f_code_lengths[v_i] & 15u)] += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_i += 1u; +- } +- if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) { +- return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- v_remaining = 1u; +- v_i = 1u; +- while (v_i <= 15u) { +- if (v_remaining > 1073741824u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_remaining <<= 1u; +- if (v_remaining < ((uint32_t)(v_counts[v_i]))) { +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed); +- } +- v_remaining -= ((uint32_t)(v_counts[v_i])); +- v_i += 1u; ++ ++ uint32_t coro_susp_point = self->private_impl.p_read_code_lengths; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_read_code_lengths.v_i; ++ v_code_length = self->private_data.s_read_code_lengths.v_code_length; + } +- if (v_remaining != 0u) { +- if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) { +- v_i = 0u; +- while (v_i <= 29u) { +- if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) { +- self->private_impl.f_n_huffs_bits[1u] = 1u; +- self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u); +- self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u); +- return wuffs_base__make_status(NULL); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_code_lengths_bitmask = 0u; ++ v_i = 0u; ++ while (v_i < 5u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- v_i += 1u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ v_code_length <<= 1u; ++ v_code_length |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed); +- } +- v_i = 1u; +- while (v_i <= 15u) { +- v_offsets[v_i] = ((uint16_t)(v_n_symbols)); +- v_count = ((uint32_t)(v_counts[v_i])); +- if (v_n_symbols > (320u - v_count)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_n_symbols = (v_n_symbols + v_count); +- v_i += 1u; +- } +- if (v_n_symbols > 288u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_i = a_n_codes0; +- while (v_i < a_n_codes1) { +- if (v_i < a_n_codes0) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- if (self->private_data.f_code_lengths[v_i] != 0u) { +- if (v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)] >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_symbols) { ++ while (true) { ++ if ((v_code_length < 1u) || (20u < v_code_length)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ break; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ v_code_length += 1u; ++ } else { ++ v_code_length -= 1u; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_symbols[v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)]] = ((uint16_t)((v_i - a_n_codes0))); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)] += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- v_i += 1u; +- } +- v_min_cl = 1u; +- while (true) { +- if (v_counts[v_min_cl] != 0u) { +- break; +- } +- if (v_min_cl >= 9u) { +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length); +- } +- v_min_cl += 1u; +- } +- v_max_cl = 15u; +- while (true) { +- if (v_counts[v_max_cl] != 0u) { +- break; +- } +- if (v_max_cl <= 1u) { +- return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u)); ++ self->private_data.f_bwt[v_i] = v_code_length; ++ v_i += 1u; + } +- v_max_cl -= 1u; +- } +- if (v_max_cl <= 9u) { +- self->private_impl.f_n_huffs_bits[a_which] = v_max_cl; +- } else { +- self->private_impl.f_n_huffs_bits[a_which] = 9u; +- } +- v_i = 0u; +- if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_read_code_lengths = 0; ++ goto exit; + } +- v_initial_high_bits = 512u; +- if (v_max_cl < 9u) { +- v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_read_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_read_code_lengths.v_i = v_i; ++ self->private_data.s_read_code_lengths.v_code_length = v_code_length; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_prev_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u))); +- v_prev_redirect_key = 4294967295u; +- v_top = 0u; +- v_next_top = 512u; +- v_code = 0u; +- v_key = 0u; +- v_value = 0u; +- while (true) { +- if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ ++ return status; ++} ++ ++// -------- func bzip2.decoder.build_huffman_tree ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bzip2__decoder__build_huffman_tree( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which) { ++ uint32_t v_code_length = 0; ++ uint32_t v_symbol_index = 0; ++ uint32_t v_num_branch_nodes = 0; ++ uint32_t v_stack_height = 0; ++ uint32_t v_stack_values[21] = {0}; ++ uint32_t v_node_index = 0; ++ uint16_t v_leaf_value = 0; ++ ++ self->private_data.f_huffman_trees[a_which][0u][0u] = 0u; ++ self->private_data.f_huffman_trees[a_which][0u][1u] = 0u; ++ v_num_branch_nodes = 1u; ++ v_stack_height = 1u; ++ v_stack_values[0u] = 0u; ++ v_code_length = 1u; ++ while (v_code_length <= 20u) { ++ if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) { ++ v_code_length += 1u; ++ continue; + } +- v_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u))); +- if (v_cl > v_prev_cl) { +- v_code <<= (v_cl - v_prev_cl); +- if (v_code >= 32768u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_symbol_index = 0u; ++ while (v_symbol_index < self->private_impl.f_num_symbols) { ++ if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { ++ v_symbol_index += 1u; ++ continue; + } +- } +- v_prev_cl = v_cl; +- v_key = v_code; +- if (v_cl > 9u) { +- v_cl -= 9u; +- v_redirect_key = ((v_key >> v_cl) & 511u); +- v_key = ((v_key) & WUFFS_BASE__LOW_BITS_MASK__U32(v_cl)); +- if (v_prev_redirect_key != v_redirect_key) { +- v_prev_redirect_key = v_redirect_key; +- v_remaining = (((uint32_t)(1u)) << v_cl); +- v_j = v_prev_cl; +- while (v_j <= 15u) { +- if (v_remaining <= ((uint32_t)(v_counts[v_j]))) { +- break; +- } +- v_remaining -= ((uint32_t)(v_counts[v_j])); +- if (v_remaining > 1073741824u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_remaining <<= 1u; +- v_j += 1u; ++ while (true) { ++ if (v_stack_height <= 0u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); ++ } else if (v_stack_height >= v_code_length) { ++ break; + } +- if ((v_j <= 9u) || (15u < v_j)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { ++ self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes)); ++ } else { ++ self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes)); + } +- v_j -= 9u; +- v_initial_high_bits = (((uint32_t)(1u)) << v_j); +- v_top = v_next_top; +- if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ if (v_num_branch_nodes >= 257u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); + } +- v_next_top = (v_top + (((uint32_t)(1u)) << v_j)); +- v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u)); +- self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u)); ++ v_stack_values[v_stack_height] = v_num_branch_nodes; ++ self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u; ++ self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u; ++ v_num_branch_nodes += 1u; ++ v_stack_height += 1u; + } ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (v_symbol_index < 2u) { ++ v_leaf_value = ((uint16_t)((769u + v_symbol_index))); ++ } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) { ++ v_leaf_value = ((uint16_t)((511u + v_symbol_index))); ++ } else { ++ v_leaf_value = 768u; ++ } ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { ++ self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value; ++ } else { ++ self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value; ++ v_stack_height -= 1u; ++ while (v_stack_height > 0u) { ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) { ++ break; ++ } ++ v_stack_height -= 1u; ++ } ++ } ++ v_symbol_index += 1u; + } +- if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } ++ v_code_length += 1u; ++ } ++ if (v_stack_height != 0u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func bzip2.decoder.build_huffman_table ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__build_huffman_table( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which) { ++ uint32_t v_i = 0; ++ uint32_t v_bits = 0; ++ uint16_t v_n_bits = 0; ++ uint16_t v_child = 0; ++ ++ while (v_i < 256u) { ++ v_bits = (v_i << 24u); ++ v_n_bits = 0u; ++ v_child = 0u; ++ while ((v_child < 257u) && (v_n_bits < 8u)) { ++ v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)]; ++ v_bits <<= 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wconversion" + #endif +- v_counts[v_prev_cl] -= 1u; ++ v_n_bits += 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u)); +- v_reversed_key >>= (9u - v_cl); +- v_symbol = ((uint32_t)(v_symbols[v_i])); +- if (v_symbol == 256u) { +- v_value = (536870912u | v_cl); +- } else if ((v_symbol < 256u) && (a_which == 0u)) { +- v_value = (2147483648u | (v_symbol << 8u) | v_cl); +- } else if (v_symbol >= a_base_symbol) { +- v_symbol -= a_base_symbol; +- if (a_which == 0u) { +- v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); +- } else { +- v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); +- } +- } else { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_high_bits = v_initial_high_bits; +- v_delta = (((uint32_t)(1u)) << v_cl); +- while (v_high_bits >= v_delta) { +- v_high_bits -= v_delta; +- if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value; + } ++ self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)(((uint16_t)(v_child | ((uint16_t)(v_n_bits << 12u)))))); + v_i += 1u; +- if (v_i >= v_n_symbols) { +- break; +- } +- v_code += 1u; +- if (v_code >= 32768u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } + } +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2 +-// -------- func deflate.decoder.decode_huffman_bmi2 ++// -------- func bzip2.decoder.invert_bwt + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_bmi2( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__invert_bwt( ++ wuffs_bzip2__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_letter = 0; ++ uint32_t v_sum = 0; ++ uint32_t v_old_sum = 0; + +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint64_t v_lmask = 0; +- uint64_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ v_sum = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ v_old_sum = v_sum; ++ v_sum += self->private_data.f_letter_counts[v_i]; ++ self->private_data.f_letter_counts[v_i] = v_old_sum; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < self->private_impl.f_block_size) { ++ v_letter = (self->private_data.f_bwt[v_i] & 255u); ++ self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u); ++ self->private_data.f_letter_counts[v_letter] += 1u; ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func bzip2.decoder.flush_fast ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__flush_fast( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ uint32_t v_flush_pointer = 0; ++ uint32_t v_flush_repeat_count = 0; ++ uint8_t v_flush_prev = 0; ++ uint32_t v_block_checksum_have = 0; ++ uint32_t v_block_size = 0; ++ uint32_t v_entry = 0; ++ uint8_t v_curr = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35435,217 +35252,204 @@ wuffs_deflate__decoder__decode_huffman_bmi2( + io2_a_dst = iop_a_dst; + } + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- v_bits = ((uint64_t)(self->private_impl.f_bits)); +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; ++ v_flush_pointer = self->private_impl.f_flush_pointer; ++ v_flush_repeat_count = self->private_impl.f_flush_repeat_count; ++ v_flush_prev = self->private_impl.f_flush_prev; ++ v_block_checksum_have = self->private_impl.f_block_checksum_have; ++ v_block_size = self->private_impl.f_block_size; ++ while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) { ++ if (v_flush_repeat_count < 4u) { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ if (v_curr == v_flush_prev) { ++ v_flush_repeat_count += 1u; ++ } else { ++ v_flush_repeat_count = 1u; ++ } ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; ++ } else { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ v_flush_repeat_count = ((uint32_t)(v_curr)); ++ while (v_flush_repeat_count > 0u) { ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); ++ } ++ v_flush_repeat_count -= 1u; ++ } ++ v_flush_repeat_count = 0u; ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; ++ } + } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { +- v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); +- iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ self->private_impl.f_flush_pointer = v_flush_pointer; ++ self->private_impl.f_flush_repeat_count = v_flush_repeat_count; ++ self->private_impl.f_flush_prev = v_flush_prev; ++ self->private_impl.f_block_checksum_have = v_block_checksum_have; ++ if (v_block_size <= 900000u) { ++ self->private_impl.f_block_size = v_block_size; ++ } ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func bzip2.decoder.flush_slow ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bzip2__decoder__flush_slow( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_flush_pointer = 0; ++ uint32_t v_flush_repeat_count = 0; ++ uint8_t v_flush_prev = 0; ++ uint32_t v_block_checksum_have = 0; ++ uint32_t v_block_size = 0; ++ uint32_t v_entry = 0; ++ uint8_t v_curr = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; + } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_flush_slow; ++ if (coro_susp_point) { ++ v_flush_pointer = self->private_data.s_flush_slow.v_flush_pointer; ++ v_flush_repeat_count = self->private_data.s_flush_slow.v_flush_repeat_count; ++ v_flush_prev = self->private_data.s_flush_slow.v_flush_prev; ++ v_block_checksum_have = self->private_data.s_flush_slow.v_block_checksum_have; ++ v_block_size = self->private_data.s_flush_slow.v_block_size; ++ v_curr = self->private_data.s_flush_slow.v_curr; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_flush_pointer = self->private_impl.f_flush_pointer; ++ v_flush_repeat_count = self->private_impl.f_flush_repeat_count; ++ v_flush_prev = self->private_impl.f_flush_prev; ++ v_block_checksum_have = self->private_impl.f_block_checksum_have; ++ v_block_size = self->private_impl.f_block_size; ++ while ((v_block_size > 0u) && ! (self->private_impl.p_flush_slow != 0)) { ++ if (v_flush_repeat_count < 4u) { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ if (v_curr == v_flush_prev) { ++ v_flush_repeat_count += 1u; + } else { +- v_hlen = v_length; +- v_length = 0u; +- } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; ++ v_flush_repeat_count = 1u; + } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); +- goto exit; ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ self->private_data.s_flush_slow.scratch = v_curr; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; + } +- } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else if ((v_dist_minus_1 + 1u) == 1u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch)); ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; + } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ v_flush_repeat_count = ((uint32_t)(v_curr)); ++ while (v_flush_repeat_count > 0u) { ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ self->private_data.s_flush_slow.scratch = v_flush_prev; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch)); ++ v_flush_repeat_count -= 1u; ++ } ++ v_flush_repeat_count = 0u; ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; + } +- } while (0); +- } +- if (v_n_bits > 63u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); +- goto exit; + } +- } +- self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ self->private_impl.f_flush_pointer = v_flush_pointer; ++ self->private_impl.f_flush_repeat_count = v_flush_repeat_count; ++ self->private_impl.f_flush_prev = v_flush_prev; ++ self->private_impl.f_block_checksum_have = v_block_checksum_have; ++ if (v_block_size <= 900000u) { ++ self->private_impl.f_block_size = v_block_size; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_flush_slow = 0; + goto exit; + } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_flush_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_flush_slow.v_flush_pointer = v_flush_pointer; ++ self->private_data.s_flush_slow.v_flush_repeat_count = v_flush_repeat_count; ++ self->private_data.s_flush_slow.v_flush_prev = v_flush_prev; ++ self->private_data.s_flush_slow.v_block_checksum_have = v_block_checksum_have; ++ self->private_data.s_flush_slow.v_block_size = v_block_size; ++ self->private_data.s_flush_slow.v_curr = v_curr; ++ + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } + + return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2 + +-// -------- func deflate.decoder.decode_huffman_fast32 ++// -------- func bzip2.decoder.decode_huffman_fast + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast32( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_fast( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_lmask = 0; +- uint32_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ uint32_t v_block_size = 0; ++ uint8_t v_which = 0; ++ uint32_t v_ticks = 0; ++ uint32_t v_section = 0; ++ uint32_t v_run_shift = 0; ++ uint16_t v_table_entry = 0; ++ uint16_t v_child = 0; ++ uint32_t v_child_ff = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_output = 0; ++ uint32_t v_run = 0; ++ uint32_t v_mtft0 = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35657,205 +35461,92 @@ wuffs_deflate__decoder__decode_huffman_fast32( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; +- } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; ++ v_block_size = self->private_impl.f_block_size; ++ v_which = self->private_impl.f_decode_huffman_which; ++ v_ticks = self->private_impl.f_decode_huffman_ticks; ++ v_section = self->private_impl.f_decode_huffman_section; ++ v_run_shift = self->private_impl.f_decode_huffman_run_shift; ++ while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ if (v_ticks > 0u) { ++ v_ticks -= 1u; + } else { +- } +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { +- } +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_ticks = 49u; ++ v_section += 1u; ++ if (v_section >= self->private_impl.f_num_sections) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); + goto exit; + } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { +- } +- v_length = (((v_length + 253u + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } else { +- } +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { ++ v_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u))]; + } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { ++ v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)]; ++ v_bits <<= ((uint16_t)(v_table_entry >> 12u)); ++ v_n_bits -= ((uint32_t)(((uint16_t)(v_table_entry >> 12u)))); ++ v_child = ((uint16_t)(v_table_entry & 1023u)); ++ while (v_child < 257u) { ++ v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)]; ++ v_bits <<= 1u; ++ if (v_n_bits <= 0u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } else { ++ v_n_bits -= 1u; + } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ if (v_child < 768u) { ++ v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u)))); ++ v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); ++ self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); ++ self->private_data.f_letter_counts[v_output] += 1u; ++ self->private_data.f_bwt[v_block_size] = v_output; ++ if (v_block_size >= self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ v_block_size += 1u; ++ v_run_shift = 0u; ++ continue; ++ } else if (v_child == 768u) { ++ self->private_impl.f_decode_huffman_finished = true; ++ break; + } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_n_bits < v_table_entry_n_bits) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; ++ if (v_run_shift >= 23u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; + } +- v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; +- } else { +- v_hlen = v_length; +- v_length = 0u; +- } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; +- } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); +- goto exit; +- } +- } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } +- } while (0); +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift); ++ v_run_shift += 1u; ++ v_i = v_block_size; ++ v_j = (v_run + v_block_size); ++ if (v_j > self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } ++ v_block_size = v_j; ++ v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); ++ self->private_data.f_letter_counts[v_mtft0] += v_run; ++ while (v_i < v_j) { ++ self->private_data.f_bwt[v_i] = v_mtft0; ++ v_i += 1u; ++ } + } +- self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u)); ++ self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } ++ self->private_impl.f_block_size = v_block_size; ++ self->private_impl.f_decode_huffman_which = v_which; ++ self->private_impl.f_decode_huffman_ticks = v_ticks; ++ self->private_impl.f_decode_huffman_section = v_section; ++ self->private_impl.f_decode_huffman_run_shift = v_run_shift; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -35863,52 +35554,25 @@ wuffs_deflate__decoder__decode_huffman_fast32( + return status; + } + +-// -------- func deflate.decoder.decode_huffman_fast64 ++// -------- func bzip2.decoder.decode_huffman_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_slow( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { +- return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src); +-} ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint64_t v_lmask = 0; +- uint64_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_node_index = 0; ++ uint16_t v_child = 0; ++ uint32_t v_child_ff = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_output = 0; ++ uint32_t v_run = 0; ++ uint32_t v_mtft0 = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35920,160 +35584,101 @@ wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- v_bits = ((uint64_t)(self->private_impl.f_bits)); +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow; ++ if (coro_susp_point) { ++ v_node_index = self->private_data.s_decode_huffman_slow.v_node_index; + } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { +- v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); +- iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while ( ! (self->private_impl.p_decode_huffman_slow != 0)) { ++ if (self->private_impl.f_decode_huffman_ticks > 0u) { ++ self->private_impl.f_decode_huffman_ticks -= 1u; + } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ self->private_impl.f_decode_huffman_ticks = 49u; ++ self->private_impl.f_decode_huffman_section += 1u; ++ if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); ++ goto exit; ++ } ++ self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767u)] & 7u))]; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; +- } else { +- v_hlen = v_length; +- v_length = 0u; ++ v_node_index = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; ++ v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)]; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_child < 257u) { ++ v_node_index = ((uint32_t)(v_child)); ++ continue; ++ } else if (v_child < 768u) { ++ v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u)))); ++ v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); ++ self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); ++ self->private_data.f_letter_counts[v_output] += 1u; ++ self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; ++ if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; ++ } ++ self->private_impl.f_block_size += 1u; ++ self->private_impl.f_decode_huffman_run_shift = 0u; ++ break; ++ } else if (v_child == 768u) { ++ self->private_impl.f_decode_huffman_finished = true; ++ goto label__outer__break; + } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; ++ if (self->private_impl.f_decode_huffman_run_shift >= 23u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; + } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift); ++ self->private_impl.f_decode_huffman_run_shift += 1u; ++ v_i = self->private_impl.f_block_size; ++ v_j = (v_run + self->private_impl.f_block_size); ++ if (v_j > self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } ++ self->private_impl.f_block_size = v_j; ++ v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); ++ self->private_data.f_letter_counts[v_mtft0] += v_run; ++ while (v_i < v_j) { ++ self->private_data.f_bwt[v_i] = v_mtft0; ++ v_i += 1u; ++ } ++ break; + } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else if ((v_dist_minus_1 + 1u) == 1u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } +- } while (0); +- } +- if (v_n_bits > 63u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); +- goto exit; + } +- } +- self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ label__outer__break:; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_huffman_slow = 0; + goto exit; + } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_slow.v_node_index = v_node_index; ++ + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -36081,40 +35686,229 @@ wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + return status; + } + +-// -------- func deflate.decoder.decode_huffman_slow ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_cbor__error__bad_input[] = "#cbor: bad input"; ++const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth"; ++const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O"; ++const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length"; ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 8388612u, 8388616u, 8388610u, 8388609u, ++}; ++ ++static const uint8_t ++WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 2u, 3u, 5u, 9u, 0u, 0u, 0u, 1u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++// ---------------- VTables ++ ++const wuffs_base__token_decoder__func_ptrs ++wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__token_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_cbor__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_cbor__decoder__set_quirk), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_cbor__decoder__initialize( ++ wuffs_cbor__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = ++ wuffs_base__token_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = ++ (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_cbor__decoder* ++wuffs_cbor__decoder__alloc(void) { ++ wuffs_cbor__decoder* x = ++ (wuffs_cbor__decoder*)(calloc(1, sizeof(wuffs_cbor__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_cbor__decoder__initialize( ++ x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_cbor__decoder(void) { ++ return sizeof(wuffs_cbor__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func cbor.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_slow( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_cbor__decoder__get_quirk( ++ const wuffs_cbor__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func cbor.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_cbor__decoder__set_quirk( ++ wuffs_cbor__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func cbor.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_cbor__decoder__workbuf_len( ++ const wuffs_cbor__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__empty_range_ii_u64(); ++} ++ ++// -------- func cbor.decoder.decode_tokens ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_cbor__decoder__decode_tokens( ++ wuffs_cbor__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_lmask = 0; +- uint32_t v_dmask = 0; +- uint32_t v_b0 = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_b1 = 0; +- uint32_t v_length = 0; +- uint32_t v_b2 = 0; +- uint32_t v_b3 = 0; +- uint32_t v_b4 = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_b5 = 0; +- uint32_t v_n_copied = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; ++ uint64_t v_string_length = 0; ++ uint64_t v_n64 = 0; ++ uint32_t v_depth = 0; ++ uint32_t v_stack_byte = 0; ++ uint32_t v_stack_bit = 0; ++ uint32_t v_stack_val = 0; ++ uint32_t v_token_length = 0; ++ uint32_t v_vminor = 0; ++ uint32_t v_vminor_alt = 0; ++ uint32_t v_continued = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_c_major = 0; ++ uint8_t v_c_minor = 0; ++ bool v_tagged = false; ++ uint8_t v_indefinite_string_major_type = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; +@@ -36135,269 +35929,513 @@ wuffs_deflate__decoder__decode_huffman_slow( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_tokens; + if (coro_susp_point) { +- v_bits = self->private_data.s_decode_huffman_slow[0].v_bits; +- v_n_bits = self->private_data.s_decode_huffman_slow[0].v_n_bits; +- v_table_entry_n_bits = self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits; +- v_lmask = self->private_data.s_decode_huffman_slow[0].v_lmask; +- v_dmask = self->private_data.s_decode_huffman_slow[0].v_dmask; +- v_redir_top = self->private_data.s_decode_huffman_slow[0].v_redir_top; +- v_redir_mask = self->private_data.s_decode_huffman_slow[0].v_redir_mask; +- v_length = self->private_data.s_decode_huffman_slow[0].v_length; +- v_dist_minus_1 = self->private_data.s_decode_huffman_slow[0].v_dist_minus_1; ++ v_string_length = self->private_data.s_decode_tokens.v_string_length; ++ v_depth = self->private_data.s_decode_tokens.v_depth; ++ v_tagged = self->private_data.s_decode_tokens.v_tagged; ++ v_indefinite_string_major_type = self->private_data.s_decode_tokens.v_indefinite_string_major_type; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; ++ if (self->private_impl.f_end_of_data) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- label__loop__continue:; +- while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { ++ label__outer__continue:; ++ while (true) { + while (true) { +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ do { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ goto label__outer__continue; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; +- } +- v_bits |= (v_b0 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 31u) != 0u) { +- self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)((v_table_entry >> 8u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- while (true) { +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != ((uint8_t)(v_c8 >> 5u)))) { ++ if (v_c8 != 255u) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; + } +- uint32_t t_1 = *iop_a_src++; +- v_b1 = t_1; ++ v_vminor = 4194560u; ++ if (v_indefinite_string_major_type == 3u) { ++ v_vminor |= 19u; ++ } ++ v_indefinite_string_major_type = 0u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; + } +- v_bits |= (v_b1 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 31u) != 0u) { +- self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)((v_table_entry >> 8u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; ++ iop_a_src += 1u; ++ v_c_major = ((uint8_t)(((uint8_t)(v_c8 >> 5u)))); ++ v_c_minor = ((uint8_t)(v_c8 & 31u)); ++ if (v_c_minor < 24u) { ++ v_string_length = ((uint64_t)(v_c_minor)); ++ } else { ++ while (true) { ++ if (v_c_minor == 24u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ iop_a_src += 1u; ++ break; ++ } ++ } else if (v_c_minor == 25u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ break; ++ } ++ } else if (v_c_minor == 26u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4u; ++ break; ++ } ++ } else if (v_c_minor == 27u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) { ++ v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8u; ++ break; ++ } ++ } else { ++ v_string_length = 0u; ++ break; ++ } ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } + } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ if (v_c_major == 0u) { ++ if (v_c_minor < 26u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 1u) { ++ if (v_c_minor < 26u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ if (v_string_length < 9223372036854775808u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 2u) { ++ if (v_c_minor < 28u) { ++ if (v_string_length == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else if (v_c_minor == 31u) { ++ if (v_indefinite_string_major_type != 0u) { ++ break; ++ } ++ v_indefinite_string_major_type = 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__continue; ++ } else { ++ break; ++ } ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src))); ++ v_token_length = ((uint32_t)((v_n64 & 65535u))); ++ if (v_n64 > 65535u) { ++ v_token_length = 65535u; ++ } else if (v_token_length <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); ++ goto exit; ++ } ++ v_string_length -= ((uint64_t)(v_token_length)); ++ v_continued = 0u; ++ if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { ++ v_continued = 1u; ++ } ++ iop_a_src += v_token_length; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_string_length > 0u) { ++ continue; ++ } else if (v_indefinite_string_major_type > 0u) { ++ goto label__outer__continue; ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 3u) { ++ if (v_c_minor < 28u) { ++ if (v_string_length == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else if (v_c_minor == 31u) { ++ if (v_indefinite_string_major_type != 0u) { ++ break; ++ } ++ v_indefinite_string_major_type = 3u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__continue; ++ } else { ++ break; ++ } ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ continue; ++ } ++ v_n64 = wuffs_base__u64__min(v_string_length, 65535u); ++ v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src, ++ ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64)))))); ++ v_token_length = ((uint32_t)((v_n64 & 65535u))); ++ if (v_token_length <= 0u) { ++ if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); ++ goto exit; ++ } ++ v_string_length -= ((uint64_t)(v_token_length)); ++ v_continued = 0u; ++ if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { ++ v_continued = 1u; ++ } ++ iop_a_src += v_token_length; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_string_length > 0u) { ++ continue; ++ } else if (v_indefinite_string_major_type > 0u) { ++ goto label__outer__continue; ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 4u) { ++ if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { ++ break; ++ } else if (v_depth >= 1024u) { ++ v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); ++ while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { ++ iop_a_src--; ++ v_token_length -= 1u; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_vminor = 2105361u; ++ v_vminor_alt = 2101282u; ++ if (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor = 2105377u; ++ v_vminor_alt = 2105378u; ++ } else { ++ v_vminor = 2105409u; ++ v_vminor_alt = 2113570u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c_minor == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit)); ++ self->private_data.f_container_num_remaining[v_depth] = v_string_length; ++ v_depth += 1u; ++ v_tagged = false; ++ goto label__outer__continue; ++ } else if (v_c_major == 5u) { ++ if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { ++ break; ++ } else if (v_depth >= 1024u) { ++ v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); ++ while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { ++ iop_a_src--; ++ v_token_length -= 1u; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_vminor = 2113553u; ++ v_vminor_alt = 2101314u; ++ if (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor = 2113569u; ++ v_vminor_alt = 2105410u; ++ } else { ++ v_vminor = 2113601u; ++ v_vminor_alt = 2113602u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c_minor == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit); ++ self->private_data.f_container_num_remaining[v_depth] = v_string_length; ++ v_depth += 1u; ++ v_tagged = false; ++ goto label__outer__continue; ++ } else if (v_c_major == 6u) { ++ if (v_c_minor >= 28u) { ++ break; ++ } ++ if (v_string_length < 262144u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ v_tagged = true; ++ goto label__outer__continue; ++ } else if (v_c_major == 7u) { ++ if (v_c_minor < 20u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 24u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(WUFFS_CBOR__LITERALS[((uint8_t)(v_c_minor & 3u))])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor == 24u) { ++ if (v_string_length < 24u) { ++ if ( ! (iop_a_src > io1_a_src)) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src--; ++ break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor == 31u) { ++ if (v_tagged || (v_depth <= 0u)) { ++ break; ++ } ++ v_depth -= 1u; ++ if (self->private_data.f_container_num_remaining[v_depth] != 0u) { ++ break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit)); ++ if (v_stack_val == 1u) { ++ break; ++ } ++ if (v_stack_val != 3u) { ++ v_vminor_alt = 2097186u; ++ } else { ++ v_vminor_alt = 2097218u; ++ } ++ if (v_depth <= 0u) { ++ v_vminor_alt |= 4096u; ++ } else { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt |= 8192u; ++ } else { ++ v_vminor_alt |= 16384u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } ++ } while (0); ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); + goto exit; + } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- while (v_n_bits < v_table_entry_n_bits) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_2 = *iop_a_src++; +- v_b2 = t_2; +- } +- v_bits |= (v_b2 << v_n_bits); +- v_n_bits += 8u; ++ label__goto_parsed_a_leaf_value__break:; ++ v_tagged = false; ++ while (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u)); ++ if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) { ++ goto label__outer__continue; + } +- v_length = (((v_length + 253u + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- while (true) { +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; ++ if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) { ++ goto label__outer__continue; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_3 = *iop_a_src++; +- v_b3 = t_3; +- } +- v_bits |= (v_b3 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- while (true) { +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_4 = *iop_a_src++; +- v_b4 = t_4; +- } +- v_bits |= (v_b4 << v_n_bits); +- v_n_bits += 8u; ++ self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u; ++ if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) { ++ goto label__outer__continue; + } +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ continue; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- while (v_n_bits < v_table_entry_n_bits) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_5 = *iop_a_src++; +- v_b5 = t_5; +- } +- v_bits |= (v_b5 << v_n_bits); +- v_n_bits += 8u; ++ v_depth -= 1u; ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt = 2097186u; ++ } else { ++ v_vminor_alt = 2097218u; + } +- v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- while (true) { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_hdist < v_length) { +- v_hlen = v_hdist; ++ if (v_depth <= 0u) { ++ v_vminor_alt |= 4096u; ++ } else { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt |= 8192u; + } else { +- v_hlen = v_length; +- } +- v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))))); +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_n_copied < v_hlen) { +- v_length -= v_n_copied; +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- continue; +- } +- v_length -= v_hlen; +- if (v_length == 0u) { +- goto label__loop__continue; ++ v_vminor_alt |= 16384u; + } + } +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_history( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- if (v_length <= v_n_copied) { +- goto label__loop__continue; +- } +- v_length -= v_n_copied; +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } ++ break; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } ++ self->private_impl.f_end_of_data = true; + + ok: +- self->private_impl.p_decode_huffman_slow[0] = 0; ++ self->private_impl.p_decode_tokens = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_huffman_slow[0].v_bits = v_bits; +- self->private_data.s_decode_huffman_slow[0].v_n_bits = v_n_bits; +- self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits = v_table_entry_n_bits; +- self->private_data.s_decode_huffman_slow[0].v_lmask = v_lmask; +- self->private_data.s_decode_huffman_slow[0].v_dmask = v_dmask; +- self->private_data.s_decode_huffman_slow[0].v_redir_top = v_redir_top; +- self->private_data.s_decode_huffman_slow[0].v_redir_mask = v_redir_mask; +- self->private_data.s_decode_huffman_slow[0].v_length = v_length; +- self->private_data.s_decode_huffman_slow[0].v_dist_minus_1 = v_dist_minus_1; ++ self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_data.s_decode_tokens.v_string_length = v_string_length; ++ self->private_data.s_decode_tokens.v_depth = v_depth; ++ self->private_data.s_decode_tokens.v_tagged = v_tagged; ++ self->private_data.s_decode_tokens.v_indefinite_string_major_type = v_indefinite_string_major_type; + + goto exit; + exit: +@@ -36408,243 +36446,607 @@ wuffs_deflate__decoder__decode_huffman_slow( + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + + // ---------------- Status Codes Implementations + +-const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code"; +-const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label"; +-const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size"; +-const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control"; +-const char wuffs_gif__error__bad_header[] = "#gif: bad header"; +-const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width"; +-const char wuffs_gif__error__bad_palette[] = "#gif: bad palette"; +-const char wuffs_gif__error__truncated_input[] = "#gif: truncated input"; +-const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O"; +- + // ---------------- Private Consts + + static const uint32_t +-WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 4294967295, 1, 2, 4, 0, +-}; +- +-static const uint8_t +-WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 2, 4, 8, 8, +-}; +- +-static const uint8_t +-WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 2, 4, 8, +-}; +- +-static const uint8_t +-WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 65, 78, 73, 77, 69, 88, 84, 83, +- 49, 46, 48, +-}; +- +-static const uint8_t +-WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 78, 69, 84, 83, 67, 65, 80, 69, +- 50, 46, 48, +-}; +- +-static const uint8_t +-WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 73, 67, 67, 82, 71, 66, 71, 49, +- 48, 49, 50, +-}; +- +-static const uint8_t +-WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 88, 77, 80, 32, 68, 97, 116, 97, +- 88, 77, 80, ++WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, ++ 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, ++ 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, ++ 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, ++ 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, ++ 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, ++ 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, ++ 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, ++ 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, ++ 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, ++ 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, ++ 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, ++ 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, ++ 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, ++ 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, ++ 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, ++ 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, ++ 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, ++ 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, ++ 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, ++ 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, ++ 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, ++ 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, ++ 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, ++ 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, ++ 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, ++ 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, ++ 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, ++ 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, ++ 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, ++ 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, ++ 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u, ++ }, { ++ 0u, 421212481u, 842424962u, 724390851u, 1684849924u, 2105013317u, 1448781702u, 1329698503u, ++ 3369699848u, 3519200073u, 4210026634u, 3824474571u, 2897563404u, 3048111693u, 2659397006u, 2274893007u, ++ 1254232657u, 1406739216u, 2029285587u, 1643069842u, 783210325u, 934667796u, 479770071u, 92505238u, ++ 2182846553u, 2600511768u, 2955803355u, 2838940570u, 3866582365u, 4285295644u, 3561045983u, 3445231262u, ++ 2508465314u, 2359236067u, 2813478432u, 3198777185u, 4058571174u, 3908292839u, 3286139684u, 3670389349u, ++ 1566420650u, 1145479147u, 1869335592u, 1987116393u, 959540142u, 539646703u, 185010476u, 303839341u, ++ 3745920755u, 3327985586u, 3983561841u, 4100678960u, 3140154359u, 2721170102u, 2300350837u, 2416418868u, ++ 396344571u, 243568058u, 631889529u, 1018359608u, 1945336319u, 1793607870u, 1103436669u, 1490954812u, ++ 4034481925u, 3915546180u, 3259968903u, 3679722694u, 2484439553u, 2366552896u, 2787371139u, 3208174018u, ++ 950060301u, 565965900u, 177645455u, 328046286u, 1556873225u, 1171730760u, 1861902987u, 2011255754u, ++ 3132841300u, 2745199637u, 2290958294u, 2442530455u, 3738671184u, 3352078609u, 3974232786u, 4126854035u, ++ 1919080284u, 1803150877u, 1079293406u, 1498383519u, 370020952u, 253043481u, 607678682u, 1025720731u, ++ 1711106983u, 2095471334u, 1472923941u, 1322268772u, 26324643u, 411738082u, 866634785u, 717028704u, ++ 2904875439u, 3024081134u, 2668790573u, 2248782444u, 3376948395u, 3495106026u, 4219356713u, 3798300520u, ++ 792689142u, 908347575u, 487136116u, 68299317u, 1263779058u, 1380486579u, 2036719216u, 1618931505u, ++ 3890672638u, 4278043327u, 3587215740u, 3435896893u, 2206873338u, 2593195963u, 2981909624u, 2829542713u, ++ 998479947u, 580430090u, 162921161u, 279890824u, 1609522511u, 1190423566u, 1842954189u, 1958874764u, ++ 4082766403u, 3930137346u, 3245109441u, 3631694208u, 2536953671u, 2385372678u, 2768287173u, 3155920004u, ++ 1900120602u, 1750776667u, 1131931800u, 1517083097u, 355290910u, 204897887u, 656092572u, 1040194781u, ++ 3113746450u, 2692952403u, 2343461520u, 2461357009u, 3723805974u, 3304059991u, 4022511508u, 4141455061u, ++ 2919742697u, 3072101800u, 2620513899u, 2234183466u, 3396041197u, 3547351212u, 4166851439u, 3779471918u, ++ 1725839073u, 2143618976u, 1424512099u, 1307796770u, 45282277u, 464110244u, 813994343u, 698327078u, ++ 3838160568u, 4259225593u, 3606301754u, 3488152955u, 2158586812u, 2578602749u, 2996767038u, 2877569151u, ++ 740041904u, 889656817u, 506086962u, 120682355u, 1215357364u, 1366020341u, 2051441462u, 1667084919u, ++ 3422213966u, 3538019855u, 4190942668u, 3772220557u, 2945847882u, 3062702859u, 2644537544u, 2226864521u, ++ 52649286u, 439905287u, 823476164u, 672009861u, 1733269570u, 2119477507u, 1434057408u, 1281543041u, ++ 2167981343u, 2552493150u, 3004082077u, 2853541596u, 3847487515u, 4233048410u, 3613549209u, 3464057816u, ++ 1239502615u, 1358593622u, 2077699477u, 1657543892u, 764250643u, 882293586u, 532408465u, 111204816u, ++ 1585378284u, 1197851309u, 1816695150u, 1968414767u, 974272232u, 587794345u, 136598634u, 289367339u, ++ 2527558116u, 2411481253u, 2760973158u, 3179948583u, 4073438432u, 3956313505u, 3237863010u, 3655790371u, ++ 347922877u, 229101820u, 646611775u, 1066513022u, 1892689081u, 1774917112u, 1122387515u, 1543337850u, ++ 3697634229u, 3313392372u, 3998419255u, 4148705398u, 3087642289u, 2702352368u, 2319436851u, 2468674930u, ++ }, { ++ 0u, 29518391u, 59036782u, 38190681u, 118073564u, 114017003u, 76381362u, 89069189u, ++ 236147128u, 265370511u, 228034006u, 206958561u, 152762724u, 148411219u, 178138378u, 190596925u, ++ 472294256u, 501532999u, 530741022u, 509615401u, 456068012u, 451764635u, 413917122u, 426358261u, ++ 305525448u, 334993663u, 296822438u, 275991697u, 356276756u, 352202787u, 381193850u, 393929805u, ++ 944588512u, 965684439u, 1003065998u, 973863097u, 1061482044u, 1049003019u, 1019230802u, 1023561829u, ++ 912136024u, 933002607u, 903529270u, 874031361u, 827834244u, 815125939u, 852716522u, 856752605u, ++ 611050896u, 631869351u, 669987326u, 640506825u, 593644876u, 580921211u, 551983394u, 556069653u, ++ 712553512u, 733666847u, 704405574u, 675154545u, 762387700u, 749958851u, 787859610u, 792175277u, ++ 1889177024u, 1901651959u, 1931368878u, 1927033753u, 2006131996u, 1985040171u, 1947726194u, 1976933189u, ++ 2122964088u, 2135668303u, 2098006038u, 2093965857u, 2038461604u, 2017599123u, 2047123658u, 2076625661u, ++ 1824272048u, 1836991623u, 1866005214u, 1861914857u, 1807058540u, 1786244187u, 1748062722u, 1777547317u, ++ 1655668488u, 1668093247u, 1630251878u, 1625932113u, 1705433044u, 1684323811u, 1713505210u, 1742760333u, ++ 1222101792u, 1226154263u, 1263738702u, 1251046777u, 1339974652u, 1310460363u, 1281013650u, 1301863845u, ++ 1187289752u, 1191637167u, 1161842422u, 1149379777u, 1103966788u, 1074747507u, 1112139306u, 1133218845u, ++ 1425107024u, 1429406311u, 1467333694u, 1454888457u, 1408811148u, 1379576507u, 1350309090u, 1371438805u, ++ 1524775400u, 1528845279u, 1499917702u, 1487177649u, 1575719220u, 1546255107u, 1584350554u, 1605185389u, ++ 3778354048u, 3774312887u, 3803303918u, 3816007129u, 3862737756u, 3892238699u, 3854067506u, 3833203973u, ++ 4012263992u, 4007927823u, 3970080342u, 3982554209u, 3895452388u, 3924658387u, 3953866378u, 3932773565u, ++ 4245928176u, 4241609415u, 4271336606u, 4283762345u, 4196012076u, 4225268251u, 4187931714u, 4166823541u, ++ 4076923208u, 4072833919u, 4035198246u, 4047918865u, 4094247316u, 4123732899u, 4153251322u, 4132437965u, ++ 3648544096u, 3636082519u, 3673983246u, 3678331705u, 3732010428u, 3753090955u, 3723829714u, 3694611429u, ++ 3614117080u, 3601426159u, 3572488374u, 3576541825u, 3496125444u, 3516976691u, 3555094634u, 3525581405u, ++ 3311336976u, 3298595879u, 3336186494u, 3340255305u, 3260503756u, 3281337595u, 3251864226u, 3222399125u, ++ 3410866088u, 3398419871u, 3368647622u, 3372945905u, 3427010420u, 3448139075u, 3485520666u, 3456284973u, ++ 2444203584u, 2423127159u, 2452308526u, 2481530905u, 2527477404u, 2539934891u, 2502093554u, 2497740997u, ++ 2679949304u, 2659102159u, 2620920726u, 2650438049u, 2562027300u, 2574714131u, 2603727690u, 2599670141u, ++ 2374579504u, 2353749767u, 2383274334u, 2412743529u, 2323684844u, 2336421851u, 2298759554u, 2294686645u, ++ 2207933576u, 2186809023u, 2149495014u, 2178734801u, 2224278612u, 2236720739u, 2266437690u, 2262135309u, ++ 2850214048u, 2820717207u, 2858812622u, 2879680249u, 2934667388u, 2938704459u, 2909776914u, 2897069605u, ++ 2817622296u, 2788420399u, 2759153014u, 2780249921u, 2700618180u, 2704950259u, 2742877610u, 2730399645u, ++ 3049550800u, 3020298727u, 3057690558u, 3078802825u, 2999835404u, 3004150075u, 2974355298u, 2961925461u, ++ 3151438440u, 3121956959u, 3092510214u, 3113327665u, 3168701108u, 3172786307u, 3210370778u, 3197646061u, ++ }, { ++ 0u, 3099354981u, 2852767883u, 313896942u, 2405603159u, 937357362u, 627793884u, 2648127673u, ++ 3316918511u, 2097696650u, 1874714724u, 3607201537u, 1255587768u, 4067088605u, 3772741427u, 1482887254u, ++ 1343838111u, 3903140090u, 4195393300u, 1118632049u, 3749429448u, 1741137837u, 1970407491u, 3452858150u, ++ 2511175536u, 756094997u, 1067759611u, 2266550430u, 449832999u, 2725482306u, 2965774508u, 142231497u, ++ 2687676222u, 412010587u, 171665333u, 2995192016u, 793786473u, 2548850444u, 2237264098u, 1038456711u, ++ 1703315409u, 3711623348u, 3482275674u, 1999841343u, 3940814982u, 1381529571u, 1089329165u, 4166106984u, ++ 4029413537u, 1217896388u, 1512189994u, 3802027855u, 2135519222u, 3354724499u, 3577784189u, 1845280792u, ++ 899665998u, 2367928107u, 2677414085u, 657096608u, 3137160985u, 37822588u, 284462994u, 2823350519u, ++ 2601801789u, 598228824u, 824021174u, 2309093331u, 343330666u, 2898962447u, 3195996129u, 113467524u, ++ 1587572946u, 3860600759u, 4104763481u, 1276501820u, 3519211397u, 1769898208u, 2076913422u, 3279374443u, ++ 3406630818u, 1941006535u, 1627703081u, 3652755532u, 1148164341u, 4241751952u, 3999682686u, 1457141531u, ++ 247015245u, 3053797416u, 2763059142u, 470583459u, 2178658330u, 963106687u, 735213713u, 2473467892u, ++ 992409347u, 2207944806u, 2435792776u, 697522413u, 3024379988u, 217581361u, 508405983u, 2800865210u, ++ 4271038444u, 1177467017u, 1419450215u, 3962007554u, 1911572667u, 3377213406u, 3690561584u, 1665525589u, ++ 1799331996u, 3548628985u, 3241568279u, 2039091058u, 3831314379u, 1558270126u, 1314193216u, 4142438437u, ++ 2928380019u, 372764438u, 75645176u, 3158189981u, 568925988u, 2572515393u, 2346768303u, 861712586u, ++ 3982079547u, 1441124702u, 1196457648u, 4293663189u, 1648042348u, 3666298377u, 3358779879u, 1888390786u, ++ 686661332u, 2421291441u, 2196002399u, 978858298u, 2811169155u, 523464422u, 226935048u, 3040519789u, ++ 3175145892u, 100435649u, 390670639u, 2952089162u, 841119475u, 2325614998u, 2553003640u, 546822429u, ++ 2029308235u, 3225988654u, 3539796416u, 1782671013u, 4153826844u, 1328167289u, 1570739863u, 3844338162u, ++ 1298864389u, 4124540512u, 3882013070u, 1608431339u, 3255406162u, 2058742071u, 1744848601u, 3501990332u, ++ 2296328682u, 811816591u, 584513889u, 2590678532u, 129869501u, 3204563416u, 2914283062u, 352848211u, ++ 494030490u, 2781751807u, 3078325777u, 264757620u, 2450577869u, 715964072u, 941166918u, 2158327331u, ++ 3636881013u, 1618608400u, 1926213374u, 3396585883u, 1470427426u, 4011365959u, 4255988137u, 1158766284u, ++ 1984818694u, 3471935843u, 3695453837u, 1693991400u, 4180638033u, 1100160564u, 1395044826u, 3952793279u, ++ 3019491049u, 189112716u, 435162722u, 2706139399u, 1016811966u, 2217162459u, 2526189877u, 774831696u, ++ 643086745u, 2666061564u, 2354934034u, 887166583u, 2838900430u, 294275499u, 54519365u, 3145957664u, ++ 3823145334u, 1532818963u, 1240029693u, 4048895640u, 1820460577u, 3560857924u, 3331051178u, 2117577167u, ++ 3598663992u, 1858283101u, 2088143283u, 3301633750u, 1495127663u, 3785470218u, 4078182116u, 1269332353u, ++ 332098007u, 2876706482u, 3116540252u, 25085497u, 2628386432u, 605395429u, 916469259u, 2384220526u, ++ 2254837415u, 1054503362u, 745528876u, 2496903497u, 151290352u, 2981684885u, 2735556987u, 464596510u, ++ 1137851976u, 4218313005u, 3923506883u, 1365741990u, 3434129695u, 1946996346u, 1723425172u, 3724871409u, ++ }, { ++ 0u, 1029712304u, 2059424608u, 1201699536u, 4118849216u, 3370159984u, 2403399072u, 2988497936u, ++ 812665793u, 219177585u, 1253054625u, 2010132753u, 3320900865u, 4170237105u, 3207642721u, 2186319825u, ++ 1625331586u, 1568718386u, 438355170u, 658566482u, 2506109250u, 2818578674u, 4020265506u, 3535817618u, ++ 1351670851u, 1844508147u, 709922595u, 389064339u, 2769320579u, 2557498163u, 3754961379u, 3803185235u, ++ 3250663172u, 4238411444u, 3137436772u, 2254525908u, 876710340u, 153198708u, 1317132964u, 1944187668u, ++ 4054934725u, 3436268917u, 2339452837u, 3054575125u, 70369797u, 961670069u, 2129760613u, 1133623509u, ++ 2703341702u, 2621542710u, 3689016294u, 3867263574u, 1419845190u, 1774270454u, 778128678u, 318858390u, ++ 2438067015u, 2888948471u, 3952189479u, 3606153623u, 1691440519u, 1504803895u, 504432359u, 594620247u, ++ 1492342857u, 1704161785u, 573770537u, 525542041u, 2910060169u, 2417219385u, 3618876905u, 3939730521u, ++ 1753420680u, 1440954936u, 306397416u, 790849880u, 2634265928u, 2690882808u, 3888375336u, 3668168600u, ++ 940822475u, 91481723u, 1121164459u, 2142483739u, 3448989963u, 4042473659u, 3075684971u, 2318603227u, ++ 140739594u, 889433530u, 1923340138u, 1338244826u, 4259521226u, 3229813626u, 2267247018u, 3124975642u, ++ 2570221389u, 2756861693u, 3824297005u, 3734113693u, 1823658381u, 1372780605u, 376603373u, 722643805u, ++ 2839690380u, 2485261628u, 3548540908u, 4007806556u, 1556257356u, 1638052860u, 637716780u, 459464860u, ++ 4191346895u, 3300051327u, 2199040943u, 3195181599u, 206718479u, 825388991u, 1989285231u, 1274166495u, ++ 3382881038u, 4106388158u, 3009607790u, 2382549470u, 1008864718u, 21111934u, 1189240494u, 2072147742u, ++ 2984685714u, 2357631266u, 3408323570u, 4131834434u, 1147541074u, 2030452706u, 1051084082u, 63335554u, ++ 2174155603u, 3170292451u, 4216760371u, 3325460867u, 1947622803u, 1232499747u, 248909555u, 867575619u, ++ 3506841360u, 3966111392u, 2881909872u, 2527485376u, 612794832u, 434546784u, 1581699760u, 1663499008u, ++ 3782634705u, 3692447073u, 2612412337u, 2799048193u, 351717905u, 697754529u, 1849071985u, 1398190273u, ++ 1881644950u, 1296545318u, 182963446u, 931652934u, 2242328918u, 3100053734u, 4284967478u, 3255255942u, ++ 1079497815u, 2100821479u, 983009079u, 133672583u, 3050795671u, 2293717799u, 3474399735u, 4067887175u, ++ 281479188u, 765927844u, 1778867060u, 1466397380u, 3846680276u, 3626469220u, 2676489652u, 2733102084u, ++ 548881365u, 500656741u, 1517752501u, 1729575173u, 3577210133u, 3898068133u, 2952246901u, 2459410373u, ++ 3910527195u, 3564487019u, 2480257979u, 2931134987u, 479546907u, 569730987u, 1716854139u, 1530213579u, ++ 3647316762u, 3825568426u, 2745561210u, 2663766474u, 753206746u, 293940330u, 1445287610u, 1799716618u, ++ 2314567513u, 3029685993u, 4080348217u, 3461678473u, 2088098201u, 1091956777u, 112560889u, 1003856713u, ++ 3112514712u, 2229607720u, 3276105720u, 4263857736u, 1275433560u, 1902492648u, 918929720u, 195422344u, ++ 685033439u, 364179055u, 1377080511u, 1869921551u, 3713294623u, 3761522863u, 2811507327u, 2599689167u, ++ 413436958u, 633644462u, 1650777982u, 1594160846u, 3978570462u, 3494118254u, 2548332990u, 2860797966u, ++ 1211387997u, 1968470509u, 854852413u, 261368461u, 3182753437u, 2161434413u, 3346310653u, 4195650637u, ++ 2017729436u, 1160000044u, 42223868u, 1071931724u, 2378480988u, 2963576044u, 4144295484u, 3395602316u, ++ }, { ++ 0u, 3411858341u, 1304994059u, 2257875630u, 2609988118u, 1355649459u, 3596215069u, 486879416u, ++ 3964895853u, 655315400u, 2711298918u, 1791488195u, 2009251963u, 3164476382u, 973758832u, 4048990933u, ++ 64357019u, 3364540734u, 1310630800u, 2235723829u, 2554806413u, 1394316072u, 3582976390u, 517157411u, ++ 4018503926u, 618222419u, 2722963965u, 1762783832u, 1947517664u, 3209171269u, 970744811u, 4068520014u, ++ 128714038u, 3438335635u, 1248109629u, 2167961496u, 2621261600u, 1466012805u, 3522553387u, 447296910u, ++ 3959392091u, 547575038u, 2788632144u, 1835791861u, 1886307661u, 3140622056u, 1034314822u, 4143626211u, ++ 75106221u, 3475428360u, 1236444838u, 2196665603u, 2682996155u, 1421317662u, 3525567664u, 427767573u, ++ 3895035328u, 594892389u, 2782995659u, 1857943406u, 1941489622u, 3101955187u, 1047553757u, 4113347960u, ++ 257428076u, 3288652233u, 1116777319u, 2311878850u, 2496219258u, 1603640287u, 3640781169u, 308099796u, ++ 3809183745u, 676813732u, 2932025610u, 1704983215u, 2023410199u, 3016104370u, 894593820u, 4262377657u, ++ 210634999u, 3352484690u, 1095150076u, 2316991065u, 2535410401u, 1547934020u, 3671583722u, 294336591u, ++ 3772615322u, 729897279u, 2903845777u, 1716123700u, 2068629644u, 2953845545u, 914647431u, 4258839074u, ++ 150212442u, 3282623743u, 1161604689u, 2388688372u, 2472889676u, 1480171241u, 3735940167u, 368132066u, ++ 3836185911u, 805002898u, 2842635324u, 1647574937u, 2134298401u, 3026852996u, 855535146u, 4188192143u, ++ 186781121u, 3229539940u, 1189784778u, 2377547631u, 2427670487u, 1542429810u, 3715886812u, 371670393u, ++ 3882979244u, 741170185u, 2864262823u, 1642462466u, 2095107514u, 3082559007u, 824732849u, 4201955092u, ++ 514856152u, 3589064573u, 1400419795u, 2552522358u, 2233554638u, 1316849003u, 3370776517u, 62202976u, ++ 4075001525u, 968836368u, 3207280574u, 1954014235u, 1769133219u, 2720925446u, 616199592u, 4024870413u, ++ 493229635u, 3594175974u, 1353627464u, 2616354029u, 2264355925u, 1303087088u, 3409966430u, 6498043u, ++ 4046820398u, 979978123u, 3170710821u, 2007099008u, 1789187640u, 2717386141u, 661419827u, 3962610838u, ++ 421269998u, 3527459403u, 1423225061u, 2676515648u, 2190300152u, 1238466653u, 3477467891u, 68755798u, ++ 4115633027u, 1041448998u, 3095868040u, 1943789869u, 1860096405u, 2776760880u, 588673182u, 3897205563u, ++ 449450869u, 3516317904u, 1459794558u, 2623431131u, 2170245475u, 1242006214u, 3432247400u, 131015629u, ++ 4137259288u, 1036337853u, 3142660115u, 1879958454u, 1829294862u, 2790523051u, 549483013u, 3952910752u, ++ 300424884u, 3669282065u, 1545650111u, 2541513754u, 2323209378u, 1092980487u, 3350330793u, 216870412u, ++ 4256931033u, 921128828u, 2960342482u, 2066738807u, 1714085583u, 2910195050u, 736264132u, 3770592353u, ++ 306060335u, 3647131530u, 1610005796u, 2494197377u, 2309971513u, 1123257756u, 3295149874u, 255536279u, ++ 4268596802u, 892423655u, 3013951305u, 2029645036u, 1711070292u, 2929725425u, 674528607u, 3815288570u, ++ 373562242u, 3709388839u, 1535949449u, 2429577516u, 2379569556u, 1183418929u, 3223189663u, 188820282u, ++ 4195850735u, 827017802u, 3084859620u, 2089020225u, 1636228089u, 2866415708u, 743340786u, 3876759895u, ++ 361896217u, 3738094268u, 1482340370u, 2466671543u, 2382584591u, 1163888810u, 3284924932u, 144124321u, ++ 4190215028u, 849168593u, 3020503679u, 2136336858u, 1649465698u, 2836138695u, 798521449u, 3838094284u, ++ }, { ++ 0u, 2792819636u, 2543784233u, 837294749u, 4098827283u, 1379413927u, 1674589498u, 3316072078u, ++ 871321191u, 2509784531u, 2758827854u, 34034938u, 3349178996u, 1641505216u, 1346337629u, 4131942633u, ++ 1742642382u, 3249117050u, 4030828007u, 1446413907u, 2475800797u, 904311657u, 68069876u, 2725880384u, ++ 1412551337u, 4064729373u, 3283010432u, 1708771380u, 2692675258u, 101317902u, 937551763u, 2442587175u, ++ 3485284764u, 1774858792u, 1478633653u, 4266992385u, 1005723023u, 2642744891u, 2892827814u, 169477906u, ++ 4233263099u, 1512406095u, 1808623314u, 3451546982u, 136139752u, 2926205020u, 2676114113u, 972376437u, ++ 2825102674u, 236236518u, 1073525883u, 2576072655u, 1546420545u, 4200303349u, 3417542760u, 1841601500u, ++ 2609703733u, 1039917185u, 202635804u, 2858742184u, 1875103526u, 3384067218u, 4166835727u, 1579931067u, ++ 1141601657u, 3799809741u, 3549717584u, 1977839588u, 2957267306u, 372464350u, 668680259u, 2175552503u, ++ 2011446046u, 3516084394u, 3766168119u, 1175200131u, 2209029901u, 635180217u, 338955812u, 2990736784u, ++ 601221559u, 2242044419u, 3024812190u, 306049834u, 3617246628u, 1911408144u, 1074125965u, 3866285881u, ++ 272279504u, 3058543716u, 2275784441u, 567459149u, 3832906691u, 1107462263u, 1944752874u, 3583875422u, ++ 2343980261u, 767641425u, 472473036u, 3126744696u, 2147051766u, 3649987394u, 3899029983u, 1309766251u, ++ 3092841090u, 506333494u, 801510315u, 2310084639u, 1276520081u, 3932237093u, 3683203000u, 2113813516u, ++ 3966292011u, 1243601823u, 2079834370u, 3716205238u, 405271608u, 3192979340u, 2411259153u, 701492901u, ++ 3750207052u, 2045810168u, 1209569125u, 4000285905u, 734575199u, 2378150379u, 3159862134u, 438345922u, ++ 2283203314u, 778166598u, 529136603u, 3120492655u, 2086260449u, 3660498261u, 3955679176u, 1303499900u, ++ 3153699989u, 495890209u, 744928700u, 2316418568u, 1337360518u, 3921775410u, 3626602927u, 2120129051u, ++ 4022892092u, 1237286280u, 2018993941u, 3726666913u, 461853231u, 3186645403u, 2350400262u, 711936178u, ++ 3693557851u, 2052076527u, 1270360434u, 3989775046u, 677911624u, 2384402428u, 3220639073u, 427820757u, ++ 1202443118u, 3789347034u, 3493118535u, 1984154099u, 3018127229u, 362020041u, 612099668u, 2181885408u, ++ 1950653705u, 3526596285u, 3822816288u, 1168934804u, 2148251930u, 645706414u, 395618355u, 2984485767u, ++ 544559008u, 2248295444u, 3085590153u, 295523645u, 3560598451u, 1917673479u, 1134918298u, 3855773998u, ++ 328860103u, 3052210803u, 2214924526u, 577903450u, 3889505748u, 1101147744u, 1883911421u, 3594338121u, ++ 3424493451u, 1785369663u, 1535282850u, 4260726038u, 944946072u, 2653270060u, 2949491377u, 163225861u, ++ 4294103532u, 1501944408u, 1752023237u, 3457862513u, 196998655u, 2915761739u, 2619532502u, 978710370u, ++ 2881684293u, 229902577u, 1012666988u, 2586515928u, 1603020630u, 4193987810u, 3356702335u, 1852063179u, ++ 2553040162u, 1046169238u, 263412747u, 2848217023u, 1818454321u, 3390333573u, 4227627032u, 1569420204u, ++ 60859927u, 2782375331u, 2487203646u, 843627658u, 4159668740u, 1368951216u, 1617990445u, 3322386585u, ++ 810543216u, 2520310724u, 2815490393u, 27783917u, 3288386659u, 1652017111u, 1402985802u, 4125677310u, ++ 1685994201u, 3255382381u, 4091620336u, 1435902020u, 2419138250u, 910562686u, 128847843u, 2715354199u, ++ 1469150398u, 4058414858u, 3222168983u, 1719234083u, 2749255853u, 94984985u, 876691844u, 2453031472u, ++ }, { ++ 0u, 3433693342u, 1109723005u, 2391738339u, 2219446010u, 1222643300u, 3329165703u, 180685081u, ++ 3555007413u, 525277995u, 2445286600u, 1567235158u, 1471092047u, 2600801745u, 361370162u, 3642757804u, ++ 2092642603u, 2953916853u, 1050555990u, 4063508168u, 4176560081u, 878395215u, 3134470316u, 1987983410u, ++ 2942184094u, 1676945920u, 3984272867u, 567356797u, 722740324u, 3887998202u, 1764827929u, 2778407815u, ++ 4185285206u, 903635656u, 3142804779u, 2012833205u, 2101111980u, 2979425330u, 1058630609u, 4088621903u, ++ 714308067u, 3862526333u, 1756790430u, 2753330688u, 2933487385u, 1651734407u, 3975966820u, 542535930u, ++ 2244825981u, 1231508451u, 3353891840u, 188896414u, 25648519u, 3442302233u, 1134713594u, 2399689316u, ++ 1445480648u, 2592229462u, 336416693u, 3634843435u, 3529655858u, 516441772u, 2420588879u, 1559052753u, ++ 698204909u, 3845636723u, 1807271312u, 2803025166u, 2916600855u, 1635634313u, 4025666410u, 593021940u, ++ 4202223960u, 919787974u, 3093159461u, 1962401467u, 2117261218u, 2996361020u, 1008193759u, 4038971457u, ++ 1428616134u, 2576151384u, 386135227u, 3685348389u, 3513580860u, 499580322u, 2471098945u, 1608776415u, ++ 2260985971u, 1248454893u, 3303468814u, 139259792u, 42591881u, 3458459159u, 1085071860u, 2349261162u, ++ 3505103035u, 474062885u, 2463016902u, 1583654744u, 1419882049u, 2550902495u, 377792828u, 3660491170u, ++ 51297038u, 3483679632u, 1093385331u, 2374089965u, 2269427188u, 1273935210u, 3311514249u, 164344343u, ++ 2890961296u, 1627033870u, 4000683757u, 585078387u, 672833386u, 3836780532u, 1782552599u, 2794821769u, ++ 2142603813u, 3005188795u, 1032883544u, 4047146438u, 4227826911u, 928351297u, 3118105506u, 1970307900u, ++ 1396409818u, 2677114180u, 287212199u, 3719594553u, 3614542624u, 467372990u, 2505346141u, 1509854403u, ++ 2162073199u, 1282711281u, 3271268626u, 240228748u, 76845205u, 3359543307u, 1186043880u, 2317064054u, ++ 796964081u, 3811226735u, 1839575948u, 2702160658u, 2882189835u, 1734392469u, 3924802934u, 625327592u, ++ 4234522436u, 818917338u, 3191908409u, 1927981223u, 2016387518u, 3028656416u, 973776579u, 4137723485u, ++ 2857232268u, 1726474002u, 3899187441u, 616751215u, 772270454u, 3803048424u, 1814228491u, 2693328533u, ++ 2041117753u, 3036871847u, 999160644u, 4146592730u, 4259508931u, 826864221u, 3217552830u, 1936586016u, ++ 3606501031u, 442291769u, 2496909786u, 1484378436u, 1388107869u, 2652297411u, 278519584u, 3694387134u, ++ 85183762u, 3384397196u, 1194773103u, 2342308593u, 2170143720u, 1307820918u, 3279733909u, 265733131u, ++ 2057717559u, 3054258089u, 948125770u, 4096344276u, 4276898253u, 843467091u, 3167309488u, 1885556270u, ++ 2839764098u, 1709792284u, 3949353983u, 667704161u, 755585656u, 3785577190u, 1865176325u, 2743489947u, ++ 102594076u, 3401021058u, 1144549729u, 2291298815u, 2186770662u, 1325234296u, 3228729243u, 215514885u, ++ 3589828009u, 424832311u, 2547870420u, 1534552650u, 1370645331u, 2635621325u, 328688686u, 3745342640u, ++ 2211456353u, 1333405183u, 3254067740u, 224338562u, 127544219u, 3408931589u, 1170156774u, 2299866232u, ++ 1345666772u, 2627681866u, 303053225u, 3736746295u, 3565105198u, 416624816u, 2522494803u, 1525692365u, ++ 4285207626u, 868291796u, 3176010551u, 1910772649u, 2065767088u, 3079346734u, 956571085u, 4121828691u, ++ 747507711u, 3760459617u, 1856702594u, 2717976604u, 2831417605u, 1684930971u, 3940615800u, 642451174u, ++ }, ++ { ++ 0u, 393942083u, 787884166u, 965557445u, 1575768332u, 1251427663u, 1931114890u, 1684106697u, ++ 3151536664u, 2896410203u, 2502855326u, 2186649309u, 3862229780u, 4048545623u, 3368213394u, 3753496529u, ++ 2898281073u, 3149616690u, 2184604407u, 2504883892u, 4046197629u, 3864463166u, 3755621371u, 3366006712u, ++ 387506281u, 6550570u, 971950319u, 781573292u, 1257550181u, 1569695014u, 1677892067u, 1937345952u, ++ 2196865699u, 2508887776u, 2886183461u, 3145514598u, 3743273903u, 3362179052u, 4058774313u, 3868258154u, ++ 958996667u, 777139448u, 400492605u, 10755198u, 1690661303u, 1941857780u, 1244879153u, 1565019506u, ++ 775012562u, 961205393u, 13101140u, 398261271u, 1943900638u, 1688634781u, 1563146584u, 1246801179u, ++ 2515100362u, 2190636681u, 3139390028u, 2892258831u, 3355784134u, 3749586821u, 3874691904u, 4052225795u, ++ 3734110983u, 3387496260u, 4033096577u, 3877584834u, 2206093835u, 2483373640u, 2911402637u, 3136515790u, ++ 1699389727u, 1915860316u, 1270647193u, 1556585946u, 950464531u, 803071056u, 374397077u, 19647702u, ++ 1917993334u, 1697207605u, 1554278896u, 1272937907u, 800985210u, 952435769u, 21510396u, 372452543u, ++ 3381322606u, 3740399405u, 3883715560u, 4027047851u, 2489758306u, 2199758369u, 3130039012u, 2917895847u, ++ 1550025124u, 1259902439u, 1922410786u, 1710144865u, 26202280u, 385139947u, 796522542u, 939715693u, ++ 3887801276u, 4039129087u, 3377269562u, 3728088953u, 3126293168u, 2905368307u, 2493602358u, 2212122229u, ++ 4037264341u, 3889747862u, 3730172755u, 3375300368u, 2907673305u, 3124004506u, 2209987167u, 2495786524u, ++ 1266377165u, 1543533966u, 1703758155u, 1928748296u, 379007169u, 32253058u, 945887303u, 790236164u, ++ 1716846671u, 1898845196u, 1218652361u, 1608006794u, 1002000707u, 750929152u, 357530053u, 36990342u, ++ 3717046871u, 3405166100u, 4084959953u, 3825245842u, 2153902939u, 2535122712u, 2929187805u, 3119304606u, ++ 3398779454u, 3723384445u, 3831720632u, 4078468859u, 2541294386u, 2147616625u, 3113171892u, 2935238647u, ++ 1900929062u, 1714877541u, 1606142112u, 1220599011u, 748794154u, 1004184937u, 39295404u, 355241455u, ++ 3835986668u, 4091516591u, 3394415210u, 3710500393u, 3108557792u, 2922629027u, 2545875814u, 2160455461u, ++ 1601970420u, 1208431799u, 1904871538u, 1727077425u, 43020792u, 367748539u, 744905086u, 991776061u, ++ 1214562461u, 1595921630u, 1720903707u, 1911159896u, 361271697u, 49513938u, 998160663u, 738569556u, ++ 4089209477u, 3838277318u, 3712633347u, 3392233024u, 2924491657u, 3106613194u, 2158369551u, 2547846988u, ++ 3100050248u, 2948339467u, 2519804878u, 2169126797u, 3844821572u, 4065347079u, 3420289730u, 3701894785u, ++ 52404560u, 342144275u, 770279894u, 982687125u, 1593045084u, 1233708063u, 1879431386u, 1736363161u, ++ 336019769u, 58479994u, 988899775u, 764050940u, 1240141877u, 1586496630u, 1729968307u, 1885744368u, ++ 2950685473u, 3097818978u, 2166999975u, 2522013668u, 4063474221u, 3846743662u, 3703937707u, 3418263272u, ++ 976650731u, 760059304u, 348170605u, 62635310u, 1742393575u, 1889649828u, 1227683937u, 1582820386u, ++ 2179867635u, 2526361520u, 2937588597u, 3093503798u, 3691148031u, 3413731004u, 4076100217u, 3851374138u, ++ 2532754330u, 2173556697u, 3087067932u, 2944139103u, 3407516310u, 3697379029u, 3857496592u, 4070026835u, ++ 758014338u, 978679233u, 64506116u, 346250567u, 1891774606u, 1740186829u, 1580472328u, 1229917259u, ++ }, { ++ 0u, 4022496062u, 83218493u, 3946298115u, 166436986u, 3861498692u, 220098631u, 3806075769u, ++ 332873972u, 4229245898u, 388141257u, 4175494135u, 440197262u, 4127099824u, 516501683u, 4044053389u, ++ 665747944u, 3362581206u, 593187285u, 3432594155u, 776282514u, 3246869164u, 716239279u, 3312622225u, ++ 880394524u, 3686509090u, 814485793u, 3746462239u, 1033003366u, 3528460888u, 963096923u, 3601193573u, ++ 1331495888u, 2694801646u, 1269355501u, 2758457555u, 1186374570u, 2843003028u, 1111716759u, 2910918825u, ++ 1552565028u, 3007850522u, 1484755737u, 3082680359u, 1432478558u, 3131279456u, 1368666979u, 3193329757u, ++ 1760789048u, 2268195078u, 1812353541u, 2210675003u, 1628971586u, 2396670332u, 1710092927u, 2318375233u, ++ 2066006732u, 2498144754u, 2144408305u, 2417195471u, 1926193846u, 2634877320u, 1983558283u, 2583222709u, ++ 2662991776u, 1903717534u, 2588923805u, 1972223139u, 2538711002u, 2022952164u, 2477029351u, 2087066841u, ++ 2372749140u, 1655647338u, 2308478825u, 1717238871u, 2223433518u, 1799654416u, 2155034387u, 1873894445u, ++ 3105130056u, 1456926070u, 3185661557u, 1378041163u, 2969511474u, 1597852940u, 3020617231u, 1539874097u, ++ 2864957116u, 1157737858u, 2922780289u, 1106542015u, 2737333958u, 1290407416u, 2816325371u, 1210047941u, ++ 3521578096u, 1042640718u, 3574781005u, 986759027u, 3624707082u, 936300340u, 3707335735u, 859512585u, ++ 3257943172u, 770846650u, 3334837433u, 688390023u, 3420185854u, 605654976u, 3475911875u, 552361981u, ++ 4132013464u, 428600998u, 4072428965u, 494812827u, 4288816610u, 274747100u, 4216845791u, 345349857u, ++ 3852387692u, 173846098u, 3781891409u, 245988975u, 3967116566u, 62328360u, 3900749099u, 121822741u, ++ 3859089665u, 164061759u, 3807435068u, 221426178u, 4025395579u, 2933317u, 3944446278u, 81334904u, ++ 4124199413u, 437265099u, 4045904328u, 518386422u, 4231653775u, 335250097u, 4174133682u, 386814604u, ++ 3249244393u, 778691543u, 3311294676u, 714879978u, 3359647891u, 662848429u, 3434477742u, 595039120u, ++ 3531393053u, 1035903779u, 3599308832u, 961245982u, 3684132967u, 877986649u, 3747788890u, 815846244u, ++ 2841119441u, 1184522735u, 2913852140u, 1114616274u, 2696129195u, 1332855189u, 2756082326u, 1266946472u, ++ 3129952805u, 1431118107u, 3195705880u, 1371074854u, 3009735263u, 1554415969u, 3079748194u, 1481855324u, ++ 2398522169u, 1630855175u, 2315475716u, 1707159610u, 2266835779u, 1759461501u, 2213084030u, 1814728768u, ++ 2636237773u, 1927520499u, 2580814832u, 1981182158u, 2496293815u, 2064121993u, 2420095882u, 2147340468u, ++ 2025787041u, 2541577631u, 2085281436u, 2475210146u, 1901375195u, 2660681189u, 1973518054u, 2590184920u, ++ 1801997909u, 2225743211u, 1872600680u, 2153772374u, 1652813359u, 2369881361u, 1719025170u, 2310296876u, ++ 1594986313u, 2966676599u, 1541693300u, 3022402634u, 1459236659u, 3107472397u, 1376780046u, 3184366640u, ++ 1288097725u, 2734990467u, 1211309952u, 2817619134u, 1160605639u, 2867791097u, 1104723962u, 2920993988u, ++ 937561457u, 3626001999u, 857201996u, 3704993394u, 1040821515u, 3519792693u, 989625654u, 3577615880u, ++ 607473029u, 3421972155u, 549494200u, 3473077894u, 769584639u, 3256649409u, 690699714u, 3337180924u, ++ 273452185u, 4287555495u, 347692196u, 4219156378u, 430386403u, 4133832669u, 491977950u, 4069562336u, ++ 60542061u, 3965298515u, 124656720u, 3903616878u, 175139863u, 3853649705u, 243645482u, 3779581716u, ++ }, { ++ 0u, 3247366080u, 1483520449u, 2581751297u, 2967040898u, 1901571138u, 3904227907u, 691737987u, ++ 3133399365u, 2068659845u, 3803142276u, 589399876u, 169513671u, 3415493895u, 1383475974u, 2482566342u, ++ 2935407819u, 1870142219u, 4137319690u, 924099274u, 506443593u, 3751897225u, 1178799752u, 2278412616u, ++ 339027342u, 3585866318u, 1280941135u, 2379694991u, 2766951948u, 1700956620u, 4236308429u, 1024339981u, ++ 2258407383u, 1192382487u, 3740284438u, 528411094u, 910556245u, 4157285269u, 1848198548u, 2946996820u, ++ 1012887186u, 4258378066u, 1681119059u, 2780629139u, 2357599504u, 1292419792u, 3572147409u, 358906641u, ++ 678054684u, 3924071644u, 1879503581u, 2978491677u, 2561882270u, 1497229150u, 3235873119u, 22109855u, ++ 2460592729u, 1395094937u, 3401913240u, 189516888u, 577821147u, 3825075739u, 2048679962u, 3146956762u, ++ 3595049455u, 398902831u, 2384764974u, 1336573934u, 1720805997u, 2803873197u, 1056822188u, 4285729900u, ++ 1821112490u, 2902796138u, 887570795u, 4117339819u, 3696397096u, 500978920u, 2218668777u, 1169222953u, ++ 2025774372u, 3106931428u, 550659301u, 3780950821u, 3362238118u, 166293862u, 2416645991u, 1367722151u, ++ 3262987361u, 66315169u, 2584839584u, 1537170016u, 1923370979u, 3005911075u, 717813282u, 3947244002u, ++ 1356109368u, 2438613496u, 146288633u, 3375820857u, 3759007162u, 562248314u, 3093388411u, 2045739963u, ++ 3927406461u, 731490493u, 2994458300u, 1945440636u, 1523451135u, 2604718911u, 44219710u, 3274466046u, ++ 4263662323u, 1068272947u, 2790189874u, 1740649714u, 1325080945u, 2406874801u, 379033776u, 3608758128u, ++ 1155642294u, 2238671990u, 479005303u, 3708016055u, 4097359924u, 901128180u, 2891217397u, 1843045941u, ++ 2011248031u, 3060787807u, 797805662u, 3993195422u, 3342353949u, 112630237u, 2673147868u, 1591353372u, ++ 3441611994u, 212601626u, 2504944923u, 1421914843u, 2113644376u, 3161815192u, 630660761u, 3826893145u, ++ 3642224980u, 412692116u, 2172340373u, 1089836885u, 1775141590u, 2822790422u, 832715543u, 4029474007u, ++ 1674842129u, 2723860433u, 1001957840u, 4197873168u, 3540870035u, 310623315u, 2338445906u, 1257178514u, ++ 4051548744u, 821257608u, 2836464521u, 1755307081u, 1101318602u, 2150241802u, 432566283u, 3628511179u, ++ 1270766349u, 2318435533u, 332587724u, 3529260300u, 4217841807u, 988411727u, 2735444302u, 1652903566u, ++ 1602977411u, 2651169091u, 132630338u, 3328776322u, 4015131905u, 786223809u, 3074340032u, 1991273216u, ++ 3846741958u, 616972294u, 3173262855u, 2091579847u, 1435626564u, 2485072772u, 234706309u, 3430124101u, ++ 2712218736u, 1613231024u, 4190475697u, 944458353u, 292577266u, 3506339890u, 1226630707u, 2291284467u, ++ 459984181u, 3672380149u, 1124496628u, 2189994804u, 2880683703u, 1782407543u, 4091479926u, 844224694u, ++ 257943739u, 3469817723u, 1462980986u, 2529005242u, 3213269817u, 2114471161u, 3890881272u, 644152632u, ++ 3046902270u, 1947391550u, 3991973951u, 746483711u, 88439420u, 3301680572u, 1563018173u, 2628197501u, ++ 657826727u, 3871046759u, 2136545894u, 3201811878u, 2548879397u, 1449267173u, 3481299428u, 235845156u, ++ 2650161890u, 1551408418u, 3315268387u, 68429027u, 758067552u, 3970035360u, 1967360161u, 3033356129u, ++ 2311284588u, 1213053100u, 3517963949u, 270598509u, 958010606u, 4170500910u, 1635167535u, 2700636911u, ++ 855672361u, 4069415401u, 1802256360u, 2866995240u, 2212099499u, 1113008747u, 3686091882u, 440112042u, ++ }, { ++ 0u, 2611301487u, 3963330207u, 2006897392u, 50740095u, 2560849680u, 4013794784u, 1956178319u, ++ 101480190u, 2645113489u, 3929532513u, 1905435662u, 84561281u, 2662269422u, 3912356638u, 1922342769u, ++ 202960380u, 2545787283u, 3760419683u, 2072395532u, 253679235u, 2495322860u, 3810871324u, 2021655667u, ++ 169122562u, 2444351341u, 3861841309u, 2106214898u, 152215677u, 2461527058u, 3844685538u, 2123133581u, ++ 405920760u, 2207553431u, 4094313831u, 1873742088u, 456646791u, 2157096168u, 4144791064u, 1823027831u, ++ 507358470u, 2241388905u, 4060492697u, 1772322806u, 490444409u, 2258557462u, 4043311334u, 1789215881u, ++ 338245124u, 2408348267u, 4161972379u, 1672996084u, 388959611u, 2357870868u, 4212429796u, 1622269835u, ++ 304431354u, 2306870421u, 4263435877u, 1706791434u, 287538053u, 2324051946u, 4246267162u, 1723705717u, ++ 811841520u, 2881944479u, 3696765295u, 1207788800u, 862293135u, 2831204576u, 3747484176u, 1157324415u, ++ 913293582u, 2915732833u, 3662962577u, 1106318334u, 896137841u, 2932651550u, 3646055662u, 1123494017u, ++ 1014716940u, 2816349795u, 3493905555u, 1273334012u, 1065181555u, 2765630748u, 3544645612u, 1222882179u, ++ 980888818u, 2714919069u, 3595350637u, 1307180546u, 963712909u, 2731826146u, 3578431762u, 1324336509u, ++ 676490248u, 3019317351u, 3295277719u, 1607253752u, 726947703u, 2968591128u, 3345992168u, 1556776327u, ++ 777919222u, 3053147801u, 3261432937u, 1505806342u, 760750473u, 3070062054u, 3244539670u, 1522987897u, ++ 608862708u, 3220163995u, 3362856811u, 1406423812u, 659339915u, 3169449700u, 3413582868u, 1355966587u, ++ 575076106u, 3118709605u, 3464325525u, 1440228858u, 557894773u, 3135602714u, 3447411434u, 1457397381u, ++ 1623683040u, 4217512847u, 2365387135u, 391757072u, 1673614495u, 4167309552u, 2415577600u, 341804655u, ++ 1724586270u, 4251866481u, 2331019137u, 290835438u, 1707942497u, 4268256782u, 2314648830u, 307490961u, ++ 1826587164u, 4152020595u, 2162433155u, 457265388u, 1876539747u, 4101829900u, 2212636668u, 407333779u, ++ 1792275682u, 4051089549u, 2263378557u, 491595282u, 1775619997u, 4067460082u, 2246988034u, 508239213u, ++ 2029433880u, 3813931127u, 2496473735u, 258500328u, 2079362919u, 3763716872u, 2546668024u, 208559511u, ++ 2130363110u, 3848244873u, 2462145657u, 157552662u, 2113730969u, 3864638966u, 2445764358u, 174205801u, ++ 1961777636u, 4014675339u, 2564147067u, 57707284u, 2011718299u, 3964481268u, 2614361092u, 7778411u, ++ 1927425818u, 3913769845u, 2665066885u, 92077546u, 1910772837u, 3930150922u, 2648673018u, 108709525u, ++ 1352980496u, 3405878399u, 3164554895u, 658115296u, 1403183983u, 3355946752u, 3214507504u, 607924639u, ++ 1453895406u, 3440239233u, 3130208369u, 557218846u, 1437504913u, 3456883198u, 3113552654u, 573589345u, ++ 1555838444u, 3340335491u, 2961681267u, 723707676u, 1606028947u, 3290383100u, 3011612684u, 673504355u, ++ 1521500946u, 3239382909u, 3062619533u, 758026722u, 1505130605u, 3256038402u, 3045975794u, 774417053u, ++ 1217725416u, 3543158663u, 2762906999u, 1057739032u, 1267939479u, 3493229816u, 2812847624u, 1007544935u, ++ 1318679830u, 3577493881u, 2728586121u, 956803046u, 1302285929u, 3594125830u, 2711933174u, 973184153u, ++ 1150152212u, 3743982203u, 2830528651u, 856898788u, 1200346475u, 3694041348u, 2880457716u, 806684571u, ++ 1115789546u, 3643069573u, 2931426933u, 891243034u, 1099408277u, 3659722746u, 2914794762u, 907637093u, ++ }, { ++ 0u, 3717650821u, 1616688459u, 3184159950u, 3233376918u, 489665299u, 2699419613u, 2104690264u, ++ 1510200173u, 2274691816u, 979330598u, 3888758691u, 2595928571u, 1194090622u, 4209380528u, 661706037u, ++ 3020400346u, 1771143007u, 3562738577u, 164481556u, 1958661196u, 2837976521u, 350386439u, 3379863682u, ++ 3993269687u, 865250354u, 2388181244u, 1406015865u, 784146209u, 4079732388u, 1323412074u, 2474079215u, ++ 3011398645u, 1860735600u, 3542286014u, 246687547u, 1942430051u, 2924607718u, 328963112u, 3456978349u, ++ 3917322392u, 887832861u, 2300653011u, 1421341782u, 700772878u, 4099025803u, 1234716485u, 2483986112u, ++ 125431087u, 3673109674u, 1730500708u, 3132326369u, 3351283641u, 441867836u, 2812031730u, 2047535991u, ++ 1568292418u, 2163009479u, 1025936137u, 3769651852u, 2646824148u, 1079348561u, 4255113631u, 537475098u, ++ 3180171691u, 1612400686u, 3721471200u, 4717925u, 2100624189u, 2694980280u, 493375094u, 3237910515u, ++ 3884860102u, 974691139u, 2278750093u, 1514417672u, 657926224u, 4204917205u, 1198234907u, 2600289438u, ++ 160053105u, 3558665972u, 1775665722u, 3024116671u, 3375586791u, 346391650u, 2842683564u, 1962488105u, ++ 1401545756u, 2384412057u, 869618007u, 3997403346u, 2469432970u, 1319524111u, 4083956673u, 788193860u, ++ 250862174u, 3546612699u, 1856990997u, 3006903952u, 3461001416u, 333211981u, 2920678787u, 1937824774u, ++ 1425017139u, 2305216694u, 883735672u, 3912918525u, 2487837605u, 1239398944u, 4095071982u, 696455019u, ++ 3136584836u, 1734518017u, 3668494799u, 121507914u, 2051872274u, 2816200599u, 437363545u, 3347544796u, ++ 3774328809u, 1029797484u, 2158697122u, 1564328743u, 542033279u, 4258798842u, 1074950196u, 2642717105u, ++ 2691310871u, 2113731730u, 3224801372u, 497043929u, 1624461185u, 3175454212u, 9435850u, 3709412175u, ++ 4201248378u, 671035391u, 2587181873u, 1201904308u, 986750188u, 3880142185u, 1519135143u, 2266689570u, ++ 342721485u, 3388693064u, 1949382278u, 2846355203u, 3570723163u, 155332830u, 3028835344u, 1763607957u, ++ 1315852448u, 2482538789u, 775087595u, 4087626862u, 2396469814u, 1396827059u, 4002123645u, 857560824u, ++ 320106210u, 3464673127u, 1934154665u, 2933785132u, 3551331444u, 238804465u, 3018961215u, 1852270778u, ++ 1226292623u, 2491507722u, 692783300u, 4108177729u, 2309936921u, 1412959900u, 3924976210u, 879016919u, ++ 2803091512u, 2055541181u, 3343875443u, 450471158u, 1739236014u, 3124525867u, 133568485u, 3663777376u, ++ 4245691221u, 545702608u, 2639048222u, 1088059291u, 1034514883u, 3762268230u, 1576387720u, 2153979149u, ++ 501724348u, 3228659001u, 2109407735u, 2687359090u, 3713981994u, 13109167u, 3171052385u, 1620357860u, ++ 1206151121u, 2591211092u, 666423962u, 4197321503u, 2271022407u, 1523307714u, 3875649548u, 982999433u, ++ 2850034278u, 1953942499u, 3384583981u, 338329256u, 1767471344u, 3033506165u, 151375291u, 3566408766u, ++ 4091789579u, 779425934u, 2478797888u, 1311354309u, 861580189u, 4006375960u, 1392910038u, 2391852883u, ++ 2929327945u, 1930372812u, 3469036034u, 324244359u, 1847629279u, 3015068762u, 243015828u, 3555391761u, ++ 4103744548u, 688715169u, 2496043375u, 1229996266u, 874727090u, 3920994103u, 1417671673u, 2313759356u, ++ 446585235u, 3339223062u, 2059594968u, 2807313757u, 3660002053u, 129100416u, 3128657486u, 1743609803u, ++ 1084066558u, 2634765179u, 549535669u, 4250396208u, 2149900392u, 1571961325u, 3765982499u, 1039043750u, ++ }, { ++ 0u, 2635063670u, 3782132909u, 2086741467u, 430739227u, 2225303149u, 4173482934u, 1707977408u, ++ 861478454u, 2924937024u, 3526875803u, 1329085421u, 720736557u, 3086643291u, 3415954816u, 1452586230u, ++ 1722956908u, 4223524122u, 2279405761u, 450042295u, 2132718455u, 3792785921u, 2658170842u, 58693292u, ++ 1441473114u, 3370435372u, 3028674295u, 696911745u, 1279765825u, 3511176247u, 2905172460u, 807831706u, ++ 3445913816u, 1349228974u, 738901109u, 2969918723u, 3569940419u, 1237784245u, 900084590u, 2829701656u, ++ 4265436910u, 1664255896u, 525574723u, 2187084597u, 3885099509u, 2057177219u, 117386584u, 2616249390u, ++ 2882946228u, 920233410u, 1253605401u, 3619119471u, 2994391983u, 796207833u, 1393823490u, 3457937012u, ++ 2559531650u, 92322804u, 2044829231u, 3840835417u, 2166609305u, 472659183u, 1615663412u, 4249022530u, ++ 1102706673u, 3702920839u, 2698457948u, 1037619754u, 1477802218u, 3306854812u, 3111894087u, 611605809u, ++ 1927342535u, 4025419953u, 2475568490u, 243387420u, 1800169180u, 4131620778u, 2317525617u, 388842247u, ++ 655084445u, 3120835307u, 3328511792u, 1533734470u, 1051149446u, 2745738736u, 3754524715u, 1120297309u, ++ 340972971u, 2304586973u, 4114354438u, 1748234352u, 234773168u, 2431761350u, 3968900637u, 1906278251u, ++ 2363330345u, 299003487u, 1840466820u, 4038896370u, 2507210802u, 142532932u, 1948239007u, 3910149609u, ++ 3213136159u, 579563625u, 1592415666u, 3286611140u, 2787646980u, 992477042u, 1195825833u, 3662232543u, ++ 3933188933u, 2002801203u, 184645608u, 2517538462u, 4089658462u, 1858919720u, 313391347u, 2409765253u, ++ 3644239219u, 1144605701u, 945318366u, 2773977256u, 3231326824u, 1570095902u, 569697989u, 3170568115u, ++ 2205413346u, 511446676u, 1646078799u, 4279421497u, 2598330617u, 131105167u, 2075239508u, 3871229218u, ++ 2955604436u, 757403810u, 1363424633u, 3427521551u, 2844163791u, 881434553u, 1223211618u, 3588709140u, ++ 3854685070u, 2026779384u, 78583587u, 2577462869u, 4235025557u, 1633861091u, 486774840u, 2148301134u, ++ 3600338360u, 1268198606u, 938871061u, 2868504675u, 3476308643u, 1379640277u, 777684494u, 3008718712u, ++ 1310168890u, 3541595724u, 2943964055u, 846639841u, 1471879201u, 3400857943u, 3067468940u, 735723002u, ++ 2102298892u, 3762382970u, 2619362721u, 19901655u, 1692534295u, 4193118049u, 2240594618u, 411247564u, ++ 681945942u, 3047836192u, 3385552891u, 1422167693u, 822682701u, 2886124859u, 3496468704u, 1298661782u, ++ 469546336u, 2264093718u, 4203901389u, 1738379451u, 38812283u, 2673859341u, 3812556502u, 2117148576u, ++ 3268024339u, 1606809957u, 598006974u, 3198893512u, 3680933640u, 1181316734u, 973624229u, 2802299603u, ++ 4052944421u, 1822222163u, 285065864u, 2381456382u, 3896478014u, 1966106696u, 156323219u, 2489232613u, ++ 2759337087u, 964150537u, 1159127250u, 3625517476u, 3184831332u, 551242258u, 1555722185u, 3249901247u, ++ 2535537225u, 170842943u, 1984954084u, 3946848146u, 2391651666u, 327308324u, 1877176831u, 4075589769u, ++ 263086283u, 2460058045u, 4005602406u, 1942963472u, 369291216u, 2332888742u, 4151061373u, 1784924683u, ++ 1022852861u, 2717425547u, 3717839440u, 1083595558u, 626782694u, 3092517008u, 3291821387u, 1497027645u, ++ 1763466407u, 4094934481u, 2289211402u, 360544636u, 1890636732u, 3988730570u, 2447251217u, 215086695u, ++ 1514488465u, 3343557607u, 3140191804u, 639919946u, 1139395978u, 3739626748u, 2726758695u, 1065936977u, ++ }, { ++ 0u, 3120290792u, 2827399569u, 293431929u, 2323408227u, 864534155u, 586863858u, 2600537882u, ++ 3481914503u, 1987188591u, 1729068310u, 3740575486u, 1173727716u, 4228805132u, 3983743093u, 1418249117u, ++ 1147313999u, 4254680231u, 3974377182u, 1428157750u, 3458136620u, 2011505092u, 1721256893u, 3747844181u, ++ 2347455432u, 839944224u, 594403929u, 2593536433u, 26687147u, 3094146371u, 2836498234u, 283794642u, ++ 2294627998u, 826205558u, 541298447u, 2578994407u, 45702141u, 3141697557u, 2856315500u, 331624836u, ++ 1196225049u, 4273416689u, 4023010184u, 1446090848u, 3442513786u, 1959480466u, 1706436331u, 3696098563u, ++ 3433538001u, 1968994873u, 1679888448u, 3722103720u, 1188807858u, 4280295258u, 3999102243u, 1470541515u, ++ 53374294u, 3134568126u, 2879970503u, 307431215u, 2303854645u, 816436189u, 567589284u, 2553242188u, ++ 3405478781u, 1929420949u, 1652411116u, 3682996484u, 1082596894u, 4185703926u, 3892424591u, 1375368295u, ++ 91404282u, 3163122706u, 2918450795u, 336584067u, 2400113305u, 922028401u, 663249672u, 2658384096u, ++ 2392450098u, 929185754u, 639587747u, 2682555979u, 82149713u, 3172883129u, 2892181696u, 362343208u, ++ 1091578037u, 4176212829u, 3918960932u, 1349337804u, 3412872662u, 1922537022u, 1676344391u, 3658557359u, ++ 1111377379u, 4224032267u, 3937989746u, 1396912026u, 3359776896u, 1908013928u, 1623494929u, 3644803833u, ++ 2377615716u, 877417100u, 623982837u, 2630542109u, 130804743u, 3190831087u, 2941083030u, 381060734u, ++ 106748588u, 3215393092u, 2933549885u, 388083925u, 2350956495u, 903570471u, 614862430u, 2640172470u, ++ 3386185259u, 1882115523u, 1632872378u, 3634920530u, 1135178568u, 4199721120u, 3945775833u, 1389631793u, ++ 1317531835u, 4152109907u, 3858841898u, 1610259138u, 3304822232u, 2097172016u, 1820140617u, 3582394273u, ++ 2165193788u, 955639764u, 696815021u, 2423477829u, 192043359u, 2995356343u, 2750736590u, 437203750u, ++ 182808564u, 3005133852u, 2724453989u, 462947725u, 2157513367u, 962777471u, 673168134u, 2447663342u, ++ 3312231283u, 2090301595u, 1844056802u, 3557935370u, 1326499344u, 4142603768u, 3885397889u, 1584245865u, ++ 3326266917u, 2142836173u, 1858371508u, 3611272284u, 1279175494u, 4123357358u, 3837270743u, 1564721471u, ++ 164299426u, 2955991370u, 2706223923u, 414607579u, 2209834945u, 978107433u, 724686416u, 2462715320u, ++ 2183156074u, 1004243586u, 715579643u, 2472360723u, 140260361u, 2980573153u, 2698675608u, 421617264u, ++ 1302961645u, 4099032581u, 3845074044u, 1557460884u, 3352688782u, 2116952934u, 1867729183u, 3601371895u, ++ 2222754758u, 1032278062u, 754596439u, 2499928511u, 234942117u, 3086693709u, 2793824052u, 528319708u, ++ 1274365761u, 4061043881u, 3816027856u, 1518873912u, 3246989858u, 2020800970u, 1762628531u, 3505670235u, ++ 3223196809u, 2045103969u, 1754834200u, 3512958704u, 1247965674u, 4086934018u, 3806642299u, 1528765331u, ++ 261609486u, 3060532198u, 2802936223u, 518697591u, 2246819181u, 1007707781u, 762121468u, 2492913428u, ++ 213497176u, 3041029808u, 2755593417u, 499441441u, 2261110843u, 1061030867u, 776167850u, 2545465922u, ++ 3274734047u, 2060165687u, 1807140942u, 3528266662u, 1229724860u, 4038575956u, 3788156205u, 1479636677u, ++ 1222322711u, 4045468159u, 3764231046u, 1504067694u, 3265744756u, 2069664924u, 1780612837u, 3554288909u, ++ 2270357136u, 1051278712u, 802445057u, 2519698665u, 221152243u, 3033880603u, 2779263586u, 475261322u, ++ }, { ++ 0u, 2926088593u, 2275419491u, 701019378u, 3560000647u, 2052709654u, 1402038756u, 4261017717u, ++ 1930665807u, 3715829470u, 4105419308u, 1524313021u, 2804077512u, 155861593u, 545453739u, 2397726522u, ++ 3861331614u, 1213181711u, 1636244477u, 3488582252u, 840331801u, 2625561480u, 3048626042u, 467584747u, ++ 2503254481u, 995897408u, 311723186u, 3170637091u, 1090907478u, 4016929991u, 3332753461u, 1758288292u, ++ 390036349u, 3109546732u, 2426363422u, 1056427919u, 3272488954u, 1835443819u, 1152258713u, 3938878216u, ++ 1680663602u, 3393484195u, 3817652561u, 1306808512u, 2954733749u, 510998820u, 935169494u, 2580880455u, ++ 4044899811u, 1601229938u, 1991794816u, 3637571857u, 623446372u, 2336332021u, 2726898695u, 216120726u, ++ 2181814956u, 744704829u, 95158223u, 2881711710u, 1446680107u, 4166125498u, 3516576584u, 2146575065u, ++ 780072698u, 2148951915u, 2849952665u, 129384968u, 4199529085u, 1411853292u, 2112855838u, 3548843663u, ++ 1567451573u, 4077254692u, 3670887638u, 1957027143u, 2304517426u, 657765539u, 251396177u, 2694091200u, ++ 3361327204u, 1714510325u, 1341779207u, 3784408214u, 476611811u, 2986349938u, 2613617024u, 899690513u, ++ 3142211371u, 354600634u, 1021997640u, 2458051545u, 1870338988u, 3239283261u, 3906682575u, 1186180958u, ++ 960597383u, 2536053782u, 3202459876u, 277428597u, 3983589632u, 1125666961u, 1792074851u, 3300423154u, ++ 1246892744u, 3829039961u, 3455203243u, 1671079482u, 2657312335u, 806080478u, 432241452u, 3081497277u, ++ 3748049689u, 1896751752u, 1489409658u, 4138600427u, 190316446u, 2772397583u, 2365053693u, 580864876u, ++ 2893360214u, 35503559u, 735381813u, 2243795108u, 2017747153u, 3593269568u, 4293150130u, 1368183843u, ++ 1560145396u, 4069882981u, 3680356503u, 1966430470u, 2295112051u, 648294626u, 258769936u, 2701399425u, ++ 804156091u, 2173100842u, 2823706584u, 103204425u, 4225711676u, 1438101421u, 2088704863u, 3524758222u, ++ 3134903146u, 347226875u, 1031468553u, 2467456920u, 1860935661u, 3229814396u, 3914054286u, 1193487135u, ++ 3385412645u, 1738661300u, 1315531078u, 3758225623u, 502792354u, 3012596019u, 2589468097u, 875607120u, ++ 1271043721u, 3853125400u, 3429020650u, 1644831355u, 2683558414u, 832261023u, 408158061u, 3057348348u, ++ 953223622u, 2528745559u, 3211865253u, 286899508u, 3974120769u, 1116263632u, 1799381026u, 3307794867u, ++ 2917509143u, 59586950u, 709201268u, 2217549029u, 2043995280u, 3619452161u, 4269064691u, 1344032866u, ++ 3740677976u, 1889445577u, 1498812987u, 4148069290u, 180845535u, 2762992206u, 2372361916u, 588238637u, ++ 1921194766u, 3706423967u, 4112727661u, 1531686908u, 2796705673u, 148555288u, 554857194u, 2407195515u, ++ 26248257u, 2952271312u, 2251333922u, 676868275u, 3584149702u, 2076793175u, 1375858085u, 4234771508u, ++ 2493785488u, 986493953u, 319029491u, 3178008930u, 1083533591u, 4009621638u, 3342158964u, 1767759333u, ++ 3887577823u, 1239362382u, 1612160956u, 3464433197u, 864482904u, 2649647049u, 3022443323u, 441336490u, ++ 1706844275u, 3419730402u, 3793503504u, 1282724993u, 2978819316u, 535149925u, 908921239u, 2554697734u, ++ 380632892u, 3100077741u, 2433735263u, 1063734222u, 3265180603u, 1828069930u, 1161729752u, 3948283721u, ++ 2207997677u, 770953084u, 71007118u, 2857626143u, 1470763626u, 4190274555u, 3490330377u, 2120394392u, ++ 4035494306u, 1591758899u, 1999168705u, 3644880208u, 616140069u, 2328960180u, 2736367686u, 225524183u, ++ }, + }; + +-#define WUFFS_GIF__QUIRKS_BASE 1041635328 +- +-#define WUFFS_GIF__QUIRKS_COUNT 7 +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_frame( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__reset_gc( +- wuffs_gif__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_up_to_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_header( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_lsd( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_extension( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_blocks( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_ae( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_gc( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part0( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part2( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++wuffs_crc32__ieee_hasher__up( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__copy_to_image_buffer( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_pb, +- wuffs_base__slice_u8 a_src); ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up__choosy_default( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_init( +- wuffs_gif__decoder* self); ++wuffs_crc32__ieee_hasher__up_arm_crc32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_read_from( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_crc32__ieee_hasher__up_x86_sse42( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + + // ---------------- VTables + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect), ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_gif__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_gif__decoder__restart_frame), ++ uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_gif__decoder__set_quirk), ++ uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk), + (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_gif__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_gif__decoder__initialize( +- wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__initialize( ++ wuffs_crc32__ieee_hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -36681,23 +37083,25 @@ wuffs_gif__decoder__initialize( + } + } + ++ self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default; ++ + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_gif__decoder* +-wuffs_gif__decoder__alloc(void) { +- wuffs_gif__decoder* x = +- (wuffs_gif__decoder*)(calloc(sizeof(wuffs_gif__decoder), 1)); ++wuffs_crc32__ieee_hasher* ++wuffs_crc32__ieee_hasher__alloc(void) { ++ wuffs_crc32__ieee_hasher* x = ++ (wuffs_crc32__ieee_hasher*)(calloc(1, sizeof(wuffs_crc32__ieee_hasher))); + if (!x) { + return NULL; + } +- if (wuffs_gif__decoder__initialize( +- x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_crc32__ieee_hasher__initialize( ++ x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -36705,18 +37109,18 @@ wuffs_gif__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_gif__decoder(void) { +- return sizeof(wuffs_gif__decoder); ++sizeof__wuffs_crc32__ieee_hasher(void) { ++ return sizeof(wuffs_crc32__ieee_hasher); + } + + // ---------------- Function Implementations + +-// -------- func gif.decoder.get_quirk ++// -------- func crc32.ieee_hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__get_quirk( +- const wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__get_quirk( ++ const wuffs_crc32__ieee_hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -36726,25 +37130,15 @@ wuffs_gif__decoder__get_quirk( + return 0; + } + +- uint32_t v_key = 0; +- +- if (a_key >= 1041635328u) { +- v_key = (a_key - 1041635328u); +- if (v_key < 7u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; +- } +- } +- } + return 0u; + } + +-// -------- func gif.decoder.set_quirk ++// -------- func crc32.ieee_hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__set_quirk( +- wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__set_quirk( ++ wuffs_crc32__ieee_hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -36757,377 +37151,812 @@ wuffs_gif__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + +- if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 1041635328u)) { +- a_key -= 1041635328u; +- if (a_key < 7u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func gif.decoder.decode_image_config ++// -------- func crc32.ieee_hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__update( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; ++ if (self->private_impl.f_state == 0u) { ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++ wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); + } ++ wuffs_crc32__ieee_hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- func crc32.ieee_hasher.update_u32 + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_crc32__ieee_hasher__update_u32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return 0; + } +- return status; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; ++ } ++ ++ wuffs_crc32__ieee_hasher__update(self, a_x); ++ return self->private_impl.f_state; + } + +-// -------- func gif.decoder.do_decode_image_config ++// -------- func crc32.ieee_hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- bool v_ffio = false; ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up__choosy_default( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if ( ! self->private_impl.f_seen_header) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__decode_header(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_lsd(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_header = true; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- v_ffio = ! self->private_impl.f_gc_has_transparent_index; +- if ( ! self->private_impl.f_quirks[2u]) { +- v_ffio = (v_ffio && +- (self->private_impl.f_frame_rect_x0 == 0u) && +- (self->private_impl.f_frame_rect_y0 == 0u) && +- (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) && +- (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height)); +- } else if (v_ffio) { +- self->private_impl.f_black_color_u32_argb_premul = 4278190080u; +- } +- if (self->private_impl.f_background_color_u32_argb_premul == 77u) { +- self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul; ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 16; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; + } +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- 2198077448u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- v_ffio); ++ v_p.len = 16; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16)); ++ while (v_p.ptr < i_end1_p) { ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; + } +- if (self->private_impl.f_call_sequence == 0u) { +- self->private_impl.f_call_sequence = 32u; ++ v_p.len = 1; ++ const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end2_p) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; + } +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; ++ v_p.len = 0; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- return status; ++ self->private_impl.f_state = (4294967295u ^ v_s); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gif.decoder.set_report_metadata ++// -------- func crc32.ieee_hasher.checksum_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_gif__decoder__set_report_metadata( +- wuffs_gif__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_crc32__ieee_hasher__checksum_u32( ++ const wuffs_crc32__ieee_hasher* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- if (a_fourcc == 1229144912u) { +- self->private_impl.f_report_metadata_iccp = a_report; +- } else if (a_fourcc == 1481461792u) { +- self->private_impl.f_report_metadata_xmp = a_report; ++ return self->private_impl.f_state; ++} ++ ++// ‼ WUFFS MULTI-FILE SECTION +arm_crc32 ++// -------- func crc32.ieee_hasher.up_arm_crc32 ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up_arm_crc32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_s = 0; ++ ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = __crc32b(v_s, a_x.ptr[0u]); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 8; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128)); ++ while (v_p.ptr < i_end0_p) { ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ } ++ v_p.len = 8; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end1_p) { ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end2_p) { ++ v_s = __crc32b(v_s, v_p.ptr[0u]); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } ++ self->private_impl.f_state = (4294967295u ^ v_s); + return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++// ‼ WUFFS MULTI-FILE SECTION -arm_crc32 + +-// -------- func gif.decoder.tell_me_more ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func crc32.ieee_hasher.up_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up_x86_sse42( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s = 0; ++ __m128i v_kk = {0}; ++ __m128i v_x0 = {0}; ++ __m128i v_x1 = {0}; ++ __m128i v_x2 = {0}; ++ __m128i v_x3 = {0}; ++ __m128i v_x4 = {0}; ++ __m128i v_x5 = {0}; ++ __m128i v_x6 = {0}; ++ __m128i v_x7 = {0}; ++ __m128i v_y0 = {0}; ++ __m128i v_y1 = {0}; ++ __m128i v_y2 = {0}; ++ __m128i v_y3 = {0}; ++ __m128i v_y4 = {0}; ++ __m128i v_y5 = {0}; ++ __m128i v_y6 = {0}; ++ __m128i v_y7 = {0}; ++ ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (((uint64_t)(a_x.len)) >= 128u) { ++ v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); ++ v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ v_x4 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)); ++ v_x5 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)); ++ v_x6 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)); ++ v_x7 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2433674945u), (int32_t)(0u), (int32_t)(872412467u)); ++ v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ while (((uint64_t)(a_x.len)) >= 128u) { ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(0u)); ++ v_x1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(17u)); ++ v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u)); ++ v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u)); ++ v_y3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(0u)); ++ v_x3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(0u)); ++ v_x5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(17u)); ++ v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u)); ++ v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u)); ++ v_y7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(0u)); ++ v_x7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y1 = _mm_xor_si128(v_y1, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_x1 = _mm_xor_si128(v_x1, v_y1); ++ v_y2 = _mm_xor_si128(v_y2, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_x2 = _mm_xor_si128(v_x2, v_y2); ++ v_y3 = _mm_xor_si128(v_y3, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ v_x3 = _mm_xor_si128(v_x3, v_y3); ++ v_y4 = _mm_xor_si128(v_y4, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u))); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_y5 = _mm_xor_si128(v_y5, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u))); ++ v_x5 = _mm_xor_si128(v_x5, v_y5); ++ v_y6 = _mm_xor_si128(v_y6, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u))); ++ v_x6 = _mm_xor_si128(v_x6, v_y6); ++ v_y7 = _mm_xor_si128(v_y7, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u))); ++ v_x7 = _mm_xor_si128(v_x7, v_y7); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ } ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(3433693342u), (int32_t)(0u), (int32_t)(2926088593u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u)); ++ v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u)); ++ v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x1); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y2 = _mm_xor_si128(v_y2, v_x3); ++ v_x2 = _mm_xor_si128(v_x2, v_y2); ++ v_y4 = _mm_xor_si128(v_y4, v_x5); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_y6 = _mm_xor_si128(v_y6, v_x7); ++ v_x6 = _mm_xor_si128(v_x6, v_y6); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2166711591u), (int32_t)(0u), (int32_t)(4057597354u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x2); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y4 = _mm_xor_si128(v_y4, v_x6); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(496309207u), (int32_t)(0u), (int32_t)(2402626965u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x4); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)(((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(0u)))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(1u)))) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ } ++ while (((uint64_t)(a_x.len)) >= 8u) { ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((wuffs_base__peek_u64le__no_bounds_check(a_x.ptr) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 8u); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ self->private_impl.f_state = (4294967295u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++// ---------------- Status Codes Implementations + +- ok: +- self->private_impl.p_tell_me_more[0] = 0; +- goto exit; +- } ++// ---------------- Private Consts + +- goto suspend; +- suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++static const uint64_t ++WUFFS_CRC64__ECMA_TABLE[8][256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 12911341560706588527u, 17619267392293085275u, 5164075066763771700u, 8921845837811637811u, 14483170935171449180u, 10328150133527543400u, 4357999468653093127u, ++ 17843691675623275622u, 4940391307328217865u, 226782375002905661u, 12685511915359257426u, 10119945210068853333u, 4566377562367245626u, 8715998937306186254u, 14689403211693301089u, ++ 9051005139383707209u, 14895072503764629798u, 9880782614656435730u, 4193374422961527165u, 453564750005811322u, 13070904082541799189u, 17496296445768931361u, 4747102235666401102u, ++ 9960315520700766767u, 4113029525020509504u, 9132755124734491252u, 14812441257301386523u, 17431997874612372508u, 4811156168024382323u, 391483189436228679u, 13132671735097031464u, ++ 18102010278767414418u, 5195199925788447741u, 1131375642422963401u, 13591081480414639014u, 9288535643022529185u, 3731739485546663374u, 8386748845923054330u, 14361410892855143829u, ++ 907129500011622644u, 13814943346342178715u, 17875617253995106479u, 5421418680781082560u, 8594564625313771207u, 14152643483341451688u, 9494204471332802204u, 3525329033817543155u, ++ 9704381199536204507u, 3855837706121835956u, 8226059050041019008u, 13908973417437222383u, 18265510249468982504u, 5643692520190618503u, 718348998302913715u, 13463047253836762076u, ++ 8146277531524994749u, 13989069943491807698u, 9622312336048764646u, 3938150108875254153u, 782966378872457358u, 13399312233903888353u, 18327840216347633877u, 5582173445676054458u, ++ 7257036000092981153u, 15535280666427316430u, 10390399851576895482u, 2529986302517213333u, 2262751284845926802u, 12414353723947190013u, 16997392145760156105u, 6398650419759490726u, ++ 10599130201908394951u, 2322133910755632296u, 7463478971093326748u, 15329644185724306675u, 16773497691846108660u, 6622864283287239323u, 2036569382881248687u, 12640783567252986560u, ++ 1814259000023245288u, 12250853444207230599u, 17125426475222188467u, 6811676960462675676u, 7132938157145702363u, 15119434731753103540u, 10842837361562165120u, 2690676064372932847u, ++ 17189129250627542414u, 6747026957542163169u, 1875814858707893717u, 12188560364711551674u, 10762704257491731389u, 2770420489343360210u, 7050658067635086310u, 15201536148867841161u, ++ 11493583972846619443u, 3219832958944941148u, 7711675412243671912u, 15576564987190227975u, 16452118100082038016u, 6305011443818121839u, 1213047649942025563u, 11816267669673208372u, ++ 7503259434831574869u, 15784731923736995898u, 11287385040381237006u, 3425713581329221729u, 1436697996605827430u, 11591809733187859977u, 16677985422973077821u, 6078267261889762898u, ++ 16292555063049989498u, 5851447209550246421u, 1630020308903038241u, 11939238787801010766u, 11081681957373440841u, 3090674103720225830u, 7876300217750508306u, 16023932746787097725u, ++ 1565932757744914716u, 12003503911822413427u, 16230825569204842823u, 5913566482019610152u, 7956607163135676207u, 15944361922680361024u, 11164346891352108916u, 3008957496780927003u, ++ 14514072000185962306u, 8809633696146542637u, 4460922918905818905u, 10287960411460399222u, 12879331835779764593u, 113391187501452830u, 5059972605034426666u, 17660565739912801861u, ++ 4525502569691853604u, 10224187249629523019u, 14576435430675780479u, 8748148222884465680u, 4980157760350383383u, 17740628527280140920u, 12797300839518981452u, 195741594718114339u, ++ 13040162471224305931u, 565687821211481700u, 4644267821511264592u, 17536326748496696895u, 14926957942186653496u, 8937808626997553239u, 4297282312656885603u, 9839608450464401420u, ++ 4852190599768102253u, 17327666750234135042u, 13245728566574478646u, 359174499151456857u, 4073138765762497374u, 10063573324157604913u, 14700457781105076997u, 9163920108173816938u, ++ 3628518000046490576u, 9328460452529085631u, 14330211790445699979u, 8498696072880078052u, 5299565100954197475u, 18061012165519327884u, 13623353920925351352u, 1018284691440624343u, ++ 14265876314291404726u, 8562713237611094233u, 3566469078572851181u, 9390260331795218562u, 13702854325316886917u, 937907429353946858u, 5381352128745865694u, 17978417549248290481u, ++ 5746791986423309721u, 18225777846762470134u, 13494053915084326338u, 606523824971012781u, 3751629717415787434u, 9745292510640121029u, 13876787882151992305u, 8338992711486538910u, ++ 13285957365033343487u, 815010154451519120u, 5540840978686720420u, 18431906428167644875u, 14101316135270172620u, 8115412784602421411u, 3978303581567838103u, 9519354766961195256u, ++ 12527462061959317731u, 2230461459452909452u, 6439665917889882296u, 16893009583564617687u, 15423350824487343824u, 7288217715337890239u, 2490078880175191691u, 10493603952060017124u, ++ 6520081235612152965u, 16813546994155744234u, 12610022887636243678u, 2148641156328442801u, 2426095299884051126u, 10557972909709735385u, 15361512820870335213u, 7350228890552538498u, ++ 15006518869663149738u, 7165105895222849989u, 2649782550477098737u, 10947027550912647582u, 12362696414880903321u, 1783234539286425590u, 6851427162658443458u, 17022309211647725485u, ++ 2873395993211654860u, 10722532847870938531u, 15232418832718623383u, 6938393941075996152u, 6642978682516671743u, 17230443782969840528u, 12156534523779525796u, 1989151790783919051u, ++ 6263731030979658865u, 16556202624882645790u, 11702894419100492842u, 1245039440087595845u, 3260040617806076482u, 11390642587947386157u, 15688795063501830681u, 7680756410435167606u, ++ 11622868312827688983u, 1324891275238549368u, 6181348207440451660u, 16638201170595874595u, 15752600435501016612u, 7616209416359311691u, 3321489341258335871u, 11328242235714328848u, ++ 3131865515489829432u, 10977756817953029463u, 16137146508898304611u, 7844397531750915340u, 5811434156413844491u, 16395372229761246052u, 11827132964039220304u, 1660744670629167935u, ++ 15913214326271352414u, 8068573254449152305u, 2905717078206922245u, 11204220263579804010u, 12035829987123708013u, 1452858539103461122u, 6017914993561854006u, 16189773752444600153u, ++ }, { ++ 0u, 6118555238288912653u, 12237110476577825306u, 18247330833359770391u, 13942380710360636081u, 10778293617712507836u, 7543452712389327019u, 4343374206906190246u, ++ 1162559746622204903u, 4957131115480832746u, 13398436261328603645u, 17084888254066768112u, 15086905424778654038u, 9634902877839851611u, 8686748413812380492u, 3198961161184305729u, ++ 2325119493244409806u, 8407378615347160771u, 9914262230961665492u, 15960741045388068057u, 16229058527915052415u, 13101053971319389298u, 5254506258681524069u, 2018377927885299304u, ++ 3487552142959377449u, 7246080283574668580u, 11075676491871100467u, 14798208821638459198u, 17373496827624760984u, 11957750539307177877u, 6397922322368611458u, 873845550624159119u, ++ 4650238986488819612u, 1468611264581623441u, 16814757230694321542u, 13669406796222545035u, 9364600845881799981u, 15356367945216001056u, 2893367039927949111u, 8993183146101597754u, ++ 5812680741028562043u, 307286854339917174u, 17976181078471403105u, 12506848973898782572u, 10509012517363048138u, 14213073068277772231u, 4036755855770598608u, 7848658706446142941u, ++ 6975104285918754898u, 3757679901787621727u, 14492160567149337160u, 11382574084698991429u, 11651310343450272483u, 17679087685142107118u, 604386294999662841u, 6668229816820511220u, ++ 8137636784695169973u, 2596263716583940792u, 15653459723670892975u, 10220140060479144098u, 12795844644737222916u, 16535671346696648713u, 1747691101248318238u, 5523790692630174227u, ++ 9300477972977639224u, 15418239225476001333u, 2937222529163246882u, 8947075512310451247u, 4642267913777087881u, 1478833794519692420u, 16842993350473770899u, 13643422681269376670u, ++ 10462937938231096543u, 14256895642581861842u, 4098594218943518405u, 7784568886045304776u, 5786734079855898222u, 335485660068962147u, 17986366292203195508u, 12498915352811683193u, ++ 11625361482057124086u, 17707288688936286715u, 614573708679834348u, 6660293997941431265u, 6929031904881267271u, 3801500275841901386u, 14553996732492558429u, 11318486464284246352u, ++ 12787875770090627857u, 16545891676414235164u, 1775925023235784971u, 5497808777625382918u, 8073511711541197216u, 2658137194938402989u, 15697317412892285882u, 10174030228858301111u, ++ 13950208571837509796u, 10768213751408296361u, 7515359803575243454u, 4369215658492879795u, 64266086328445461u, 6056541296517372696u, 12193111774187735055u, 18293581128395077890u, ++ 15112713823828466499u, 9606842886146402894u, 8676701462472931673u, 3206755967968430164u, 1208772589999325682u, 4913169729330573567u, 13336459633641022440u, 17149116886581154533u, ++ 16275273569390339946u, 13057090384914568807u, 5192527433167881584u, 2082608760381092989u, 2350925692077440475u, 8379320821714095318u, 9904217479574233025u, 15968533654375526092u, ++ 17437760713698643085u, 11895738795633802624u, 6353925819959930519u, 920093647833407386u, 3495382202496636476u, 7235998217053677361u, 11047581385260348454u, 14824052473177163051u, ++ 10447068876609200373u, 14128364157388739064u, 4118967294799201007u, 7908597456515216354u, 5874445058326493764u, 391603411424480073u, 17894151024620902494u, 12447300791057279315u, ++ 9284535827554175762u, 15289779793358354975u, 2957667589039384840u, 9071030930460645381u, 4729911307347480995u, 1535020299074674862u, 16750846767572792249u, 13591740465559749300u, ++ 12735909365018523451u, 16453465302197274166u, 1832394617641637153u, 5585730863000118316u, 8197188437887036810u, 2678299164963691655u, 15569137772090609552u, 10158372272797335197u, ++ 11573468159711796444u, 17614790262716542417u, 670971320137924294u, 6748289234561093579u, 7052776217202099821u, 3821593491595032416u, 14425748405936874615u, 11302896163253294458u, ++ 15020497008676966249u, 9555230900528283236u, 8764415362900159859u, 3262871967819308158u, 1229147417359668696u, 5037195377843840213u, 13320587995882862530u, 17020586948957226703u, ++ 13858063809762534542u, 10716528681989657987u, 7603000551683802772u, 4425403642365261721u, 84709666887204415u, 6180499360129388338u, 12177172482473303077u, 18165119875451415848u, ++ 17309582619392432295u, 11880078264510294442u, 6477599625422879421u, 940257368289594288u, 3551850046471569942u, 7323923223311315739u, 10995617555250765836u, 14731624552464748801u, ++ 16147023423082394432u, 13041502936518885965u, 5316274389876805978u, 2102700497890566231u, 2407324781779167729u, 8467313413945678076u, 9852321304593615851u, 15876037047908055782u, ++ 1291018766690942925u, 4973072573440528064u, 13274480430592564695u, 17064442507263798490u, 15030719607150486908u, 9547259896855319665u, 8738431316985759590u, 3291108156134209131u, ++ 128532172656890922u, 6134424711959717159u, 12113082593034745392u, 18226958170089932605u, 13886262546419256987u, 10690581952315096982u, 7595066862094806145u, 4435588787024731532u, ++ 3580050981226981379u, 7297974293382715662u, 10987681667836234265u, 14741811897106152212u, 17353402924945863346u, 11834005814401532863u, 6413511935936860328u, 1002093465131966885u, ++ 2417545179998651364u, 8459344608371405545u, 9826339458661147134u, 15904271038397419763u, 16208896970474576213u, 12977377931899316312u, 5270164626790366031u, 2146558256149678658u, ++ 5864365122984562769u, 399431204366950748u, 17919992407673188939u, 12419207813205476166u, 10385054866335763168u, 14192630174644861933u, 4165217520762185978u, 7864598685623228919u, ++ 4701851384154880950u, 1560828767195761339u, 16758641643428190636u, 13581693582721149089u, 9240574510442684679u, 15335992705270927370u, 3021896290089222941u, 9009054371811832336u, ++ 8153224920554538911u, 2724514274940876434u, 15633368673088300421u, 10096393516356015240u, 12707851639919861038u, 16479271570068024355u, 1840187295666814772u, 5575686180147088953u, ++ 6990764404993272952u, 3885857308630146421u, 14471996434107354722u, 11258899592309161839u, 11563386024119531209u, 17622620253752952772u, 696814903175779539u, 6720194058879067614u, ++ }, { ++ 0u, 4542972359516777931u, 9085944719033555862u, 4691664355513513565u, 18171889438067111724u, 14061474303606774503u, 9383328711027027130u, 13633424072306524529u, ++ 7676286055365832925u, 6164376987427609878u, 1481798532234586955u, 3142253189322229376u, 10855962452864321521u, 12223826156538735162u, 16771372852738792551u, 15543052108730888620u, ++ 15352572110731665850u, 16862791698018765937u, 12328753974855219756u, 10669987536837040103u, 2963597064469173910u, 1597421751597874013u, 6284506378644458752u, 7511137813735006411u, ++ 13801544397233820007u, 9260261528098962604u, 13951919735851666161u, 18344511890033026874u, 4874982405016790603u, 8983709158270585728u, 4445237816650825181u, 196831773885239318u, ++ 4091022007653359089u, 562346998784700474u, 5103132815620245095u, 8780357948041161644u, 14189083196432476893u, 18150173592266475286u, 13474345022262784331u, 9652793049543924864u, ++ 5927194128938347820u, 7875246409875505383u, 3194843503195748026u, 1395478681687169905u, 12569012757288917504u, 10477056948030502859u, 15022275627470012822u, 17253916197967211613u, ++ 17134349580696108107u, 15186860751721288064u, 10655150290339489757u, 12453952663903504918u, 1289987737384422247u, 3381381201708377772u, 8066289525279445233u, 5835212509754572090u, ++ 9749964810033581206u, 13278076374523191645u, 17967418316541171456u, 14290755639648123595u, 8890475633301650362u, 4929947589851190897u, 393663547770478636u, 4214651972966108647u, ++ 8182044015306718178u, 5658655167774316073u, 1124693997569400948u, 3499391957275839935u, 10206265631240490190u, 12873559114121502981u, 17560715896082323288u, 14753743294414502547u, ++ 1948880861322201919u, 2594127930539943668u, 7285718382500778153u, 6491924633276939618u, 16655531858934856723u, 15577868310755742168u, 11039333611388512133u, 11977453108914408014u, ++ 11854388257876695640u, 11207451878732806035u, 15750492819751010766u, 16545974958769302533u, 6389687006391496052u, 7469038772501250239u, 2790957363374339810u, 1851148384058628905u, ++ 14845159798643632773u, 17370237963685480270u, 12687582131971748115u, 10311195790054169816u, 3615017233668480425u, 946035540305899618u, 5493509258033841727u, 8302171348940565492u, ++ 5281120895271462419u, 8521283507583323096u, 3989500891288354181u, 600787064567550030u, 13071075951463747903u, 9974957613568212212u, 14659789384177486505u, 17616368207971182434u, ++ 2579975474768844494u, 2073357103652371205u, 6762762403416755544u, 7120694423275413651u, 16132579050558890466u, 16206641305794825257u, 11670425019509144180u, 11456679111066785727u, ++ 11260412520859862953u, 11767594448091671138u, 16308316081471249471u, 15949821717821010420u, 6947506857025941637u, 6872882154850049358u, 2196985003345963795u, 2411294364755134168u, ++ 17780951266603300724u, 14540225107906894527u, 9859895179702381794u, 13249171359945539881u, 787327095540957272u, 3884007889973030291u, 8429303945932217294u, 5472161678768272901u, ++ 16364088030613436356u, 15858029804260760079u, 11317310335548632146u, 11674676600264311193u, 2249387995138801896u, 2322888996435045667u, 6998783914551679870u, 6785602652076537525u, ++ 9916730820443375385u, 13156333278251739858u, 17836661041797717135u, 14448512960480194884u, 8480501340405739573u, 5384944246861192702u, 839650424281590691u, 3795664592519366248u, ++ 3897761722644403838u, 656471011406904245u, 5188255861079887336u, 8578093388688728099u, 14571436765001556306u, 17668683201823263897u, 12983849266553879236u, 10026146741872662287u, ++ 6669836397870376611u, 7177582867921406824u, 2488175334770097461u, 2129119614032302334u, 11583119667977343375u, 11507929313807383620u, 16044147764761037337u, 16259017374083049426u, ++ 15843330937415051829u, 16489139217633298430u, 11946100509993103779u, 11151742071862860904u, 2878174689517968665u, 1799951022334374098u, 6478030266801178255u, 7416715545229372228u, ++ 12779374012782992104u, 10255423946675697443u, 14938077545002500478u, 17313340186040954037u, 5581914726748679620u, 8249768321177223183u, 3702296768117257810u, 894758378090191769u, ++ 1067805515879173007u, 3592318064290702916u, 8126281399163064345u, 5750455340522077650u, 17509465798031703203u, 14841048614271029608u, 10153889598922762037u, 12961990299524614910u, ++ 7230034467336960850u, 6583663697231173273u, 1892071080611799236u, 2686992928761285903u, 10987018516067683454u, 12065805765134311861u, 16604342697881130984u, 15665095101429070371u, ++ 10562241790542924838u, 12510858718452294125u, 17042567015166646192u, 15242640940723501691u, 7979001782576708362u, 5886480219318720193u, 1201574129135100060u, 3433774845539634519u, ++ 17875696825445760251u, 14346457162030502192u, 9657117384671061869u, 13334903762452155046u, 305328503063841751u, 4266984645440464412u, 8803266454141587521u, 4981154328058445194u, ++ 5159950949537688988u, 8687502257518297175u, 4146714207304742410u, 470617173809470401u, 13525524806833511088u, 9565558111887030139u, 14241388846550827302u, 18061812720343526637u, ++ 3250597773715660097u, 1303669193657626762u, 5984074333724313303u, 7782311056298339100u, 15074661043719826029u, 17165493152098584486u, 12620272307991097851u, 10389759836427934768u, ++ 12273052416502600151u, 10761709128327461916u, 15295744618112993857u, 16955639155056813962u, 6232173811933554427u, 7599472825692375856u, 2912390363305901421u, 1684630829289181350u, ++ 13895013714051883274u, 18437420284065877185u, 13745764309700098716u, 9352044056584181591u, 4393970006691927590u, 284119552558480365u, 4822588729510268336u, 9072122871209877627u, ++ 9177754244107333741u, 4635909983525117350u, 92935459340889083u, 4486092121981797936u, 9471751652205676353u, 13581038687731985034u, 18259186513699183831u, 14010214853299335452u, ++ 1574654191081914544u, 3085435160094502267u, 7768015779946060582u, 6108684823746459373u, 16858607891864434588u, 15491872287116188247u, 10944323357536545802u, 12171520400656925121u, ++ }, { ++ 0u, 2156813408461955548u, 4313626816923911096u, 2752718492472304228u, 8627253633847822192u, 7661928252530632364u, 5505436984944608456u, 5875429064940414228u, ++ 17254507267695644384u, 17481523150583344956u, 15323856505061264728u, 14503785508944014468u, 11010873969889216912u, 9592933115173218380u, 11750858129880828456u, 13762408288327199732u, ++ 5489899806547772229u, 5899293950881604249u, 8641596751236382973u, 7639112309309301025u, 4290280838231655477u, 2766522915734824425u, 24548853041579917u, 2141951263632483921u, ++ 11764625126767791525u, 13739024951972572281u, 10995904098661322269u, 9617374173086412737u, 15347829100153899733u, 14488356108428585737u, 17231728733602892141u, 17495903608387299505u, ++ 10979799613095544458u, 9623805157521532758u, 11798587901763208498u, 13714458609834648814u, 17283193502472765946u, 17452775347443867686u, 15278224618618602050u, 14549338234851124126u, ++ 8580561676463310954u, 7708699370463537590u, 5533045831469648850u, 5847881786764880398u, 49097706083159834u, 2107935609010204358u, 4283902527264967842u, 2782645096555375998u, ++ 15298762408106657231u, 14537220494637179923u, 17261466032775972471u, 17465946411177207723u, 11811312492909331135u, 13692276008895521635u, 10968273481005252871u, 9644925621600215259u, ++ 4261616546501692207u, 2795266376586341107u, 70185227798988951u, 2096376465831291211u, 5520961050865536095u, 5868452604588535171u, 8593836137267777511u, 7687075229128879675u, ++ 11680230827506930577u, 13832259058284016205u, 11080421551794245673u, 9523735455073038837u, 15394057194608301281u, 14432953972299937085u, 17185658977434064729u, 17550865948466574981u, ++ 5579070418531851633u, 5801301123735731373u, 8552830750928559817u, 7736981982542757653u, 4239857041646656001u, 2826138345940532189u, 75412445699561913u, 2082177495183685733u, ++ 17161123352926621908u, 17565732457015587080u, 15417398740927075180u, 14419136389292487344u, 11066091662939297700u, 9546555762013386360u, 11695763573529760796u, 13808381012597372352u, ++ 98195412166319668u, 2067810197125185512u, 4215871218020408716u, 2841563382736944208u, 8567805054529935684u, 7712554084374493336u, 5565290193110751996u, 5824680096370817824u, ++ 4213277561403610395u, 2852497928146826439u, 118647349622822563u, 2038740285422565247u, 5603244184571253355u, 5777048188553278391u, 8511711324634206675u, 7778039831901335567u, ++ 15351860113773370363u, 14475212630091872807u, 17208772955998935107u, 17527831139023518111u, 11724816064851319947u, 13787876126790335831u, 11055209722282565427u, 9549167182608629487u, ++ 8523233093003384414u, 7756906139291137922u, 5590532753172682214u, 5799235221864313914u, 140370455597977902u, 2025555993157185778u, 4192752931662582422u, 2864620100732154698u, ++ 11041922101731072190u, 9570786891571902818u, 11736905209177070342u, 13767318537498720986u, 17187672274535555022u, 17539385849830522386u, 15374150458257759350u, 14462604578592423338u, ++ 15486092620961298855u, 14629711868178897019u, 17092483903335922207u, 17355247692313779139u, 11624791503456485079u, 13600030943165030155u, 11137009302703308143u, 9754815117126884531u, ++ 4151744643171039047u, 2626583331457439387u, 162377516962444543u, 2282879863086044451u, 5631712546292871223u, 6037452326221451755u, 8501327171535303567u, 7499692239708246611u, ++ 11158140837063703266u, 9743299917872012094u, 11602602247471462746u, 13612749016692676742u, 17105661501857119634u, 17333526894853233742u, 15473963965085515306u, 14650238604571402230u, ++ 8479714083293312002u, 7512977616177960414u, 5652276691881064378u, 6025361010828170854u, 150824891399123826u, 2303974039851176622u, 4164354990367371466u, 2604286280411140374u, ++ 5659250822143950637u, 6009834889821986545u, 8454565055791594645u, 7546392787102457161u, 4121809449076176989u, 2656298618920900993u, 211263906290727909u, 2233791159333640761u, ++ 11672732454520566221u, 13552292306546298897u, 11106145987650286197u, 9785898338790069161u, 15440531030182573757u, 14675335027319969633u, 17121240571213837573u, 17326570184971408601u, ++ 196390824332639336u, 2258328937796115892u, 4135620394250371024u, 2632959299571932684u, 8431742436040817432u, 7560729365405768388u, 5683126765473888416u, 5994308631384381820u, ++ 17135610109059871368u, 17303780593489122132u, 15425108168748986672u, 14699314298944934124u, 11130580386221503992u, 9770921945649714212u, 11649360192741635648u, 13566070240564762524u, ++ 8426555122807220790u, 7574959341548112874u, 5704995856293652878u, 5963537623700588626u, 237294699245645126u, 2208312048661695642u, 4077480570845130494u, 2700071425513574178u, ++ 11206488369142506710u, 9686112028953249034u, 11554096377106556782u, 13670376701660284594u, 17023422649268413350u, 17424940338905547386u, 15556079663802671134u, 14559229772221530562u, ++ 4089596066908350835u, 2679540256679954607u, 224121464376355531u, 2230046074588744471u, 5727171952466636291u, 5950815117732351967u, 8405427952099257787u, 7586487769270013031u, ++ 15543464952953907091u, 14581513594800801359u, 17034988434643772459u, 17403850594581005815u, 11533527867866456291u, 13682454788587061567u, 11228114617197060955u, 9672831084924650119u, ++ 17046466186006768828u, 17401835225210195296u, 15513812278582275844u, 14601417988320120536u, 11181065506345364428u, 9711332585899690512u, 11598470443728627828u, 13625782737014311336u, ++ 280740911195955804u, 2165085734748128128u, 4051111986314371556u, 2726642315882184760u, 8385505863325164844u, 7616087770173211888u, 5729240201464309396u, 5939354855465699144u, ++ 11574598932837183481u, 13641322155266051621u, 11203874897631210561u, 9696991643941850525u, 15500005765847099529u, 14624770467483748693u, 17061326039500450609u, 17377293083093715693u, ++ 5752625691707646233u, 5925581285101240517u, 8361067032314929825u, 7631051003498906493u, 4066548076212889193u, 2702667407911749557u, 266366940911429073u, 2187862166416278541u, ++ }, { ++ 0u, 6642096280510406750u, 13284192561020813500u, 16462795876764246242u, 16315823105410768893u, 13708963636559134627u, 6500836570635362113u, 439922346977066783u, ++ 6197597939812213119u, 733872460607717665u, 17174658310779658691u, 12859417258165748125u, 13001673141270724226u, 16736026809386770140u, 879844693954133566u, 5771540452186644064u, ++ 12395195879624426238u, 17305613297699152544u, 1467744921215435330u, 5220531075568771612u, 5650300446275329283u, 1316336633116425565u, 17740532779662220735u, 12258375912742239713u, ++ 18016332033719362433u, 11973850846087693279u, 4781749989466252093u, 2193612730179060579u, 1759689387908267132u, 4919860766213921826u, 11543080904373288128u, 18166453874549300382u, ++ 14614610554166352761u, 10879836598703668007u, 8253805222095936453u, 3361408799105547163u, 2935489842430870660u, 8399638907315561690u, 10441062151137543224u, 14757009366268798054u, ++ 11300600892550658566u, 13906759146888600152u, 2632673266232851130u, 8693166652788693732u, 9132946036408395259u, 2491556468171146661u, 14331668736193815879u, 11153489555886392601u, ++ 7409848711186274695u, 4249257595424012761u, 16037314857127418171u, 9413239572791867749u, 9563499978932504186u, 15606406401646028324u, 4387225460358121158u, 6976068332272625304u, ++ 3519378775816534264u, 7852640824571713702u, 9839721532427843652u, 15321459211647031322u, 15184496315767285509u, 10274783960564057947u, 7701371084599273401u, 3949009615571978215u, ++ 539203352115488887u, 6581683165424715817u, 13772373076031531211u, 16360516657443457173u, 16507610444191872906u, 13347445937900984276u, 6722817598211094326u, 99441604310980456u, ++ 5870979684861741320u, 960568039155968342u, 16799277814631123380u, 13046489736199563754u, 12904108438562707189u, 17238069777753355947u, 814716683761407561u, 6296880972452001303u, ++ 12357655745765665417u, 17821378201246059223u, 1379747099228580405u, 5694995023857257067u, 5265346532465702260u, 1530999186474390826u, 17386333305577387464u, 12494636173022434710u, ++ 18265892072816790518u, 11623803214076996520u, 4983112936342293322u, 1804507146630605588u, 2238305212630619147u, 4845162757404030037u, 12054694172541097143u, 18115614168568345833u, ++ 14819697422372549390u, 10486441695742104400u, 8498515190848025522u, 3016776137306395628u, 3442815973027425523u, 8352525304506551469u, 10925090729870978127u, 14677459070913039377u, ++ 11216336045685248625u, 14376925237369287215u, 2590274523633996493u, 9214355580338500243u, 8774450920716242316u, 2731551919773330898u, 13952136664545250608u, 11363291318662491502u, ++ 7038757551633068528u, 4432606169309893038u, 15705281649143427404u, 9644785238863483154u, 9494645848386137613u, 16136034042300943955u, 4294513027018469041u, 7472698529450626799u, ++ 4011857131457007759u, 7746628612951437521u, 10373500843358195763u, 15265904688119197805u, 15402742169198546802u, 9938598876682809132u, 7898019231143956430u, 3582070091934478224u, ++ 1078406704230977774u, 5970139571501035696u, 13163366330849431634u, 16897748309796073484u, 17049000381336047379u, 12733717820530814797u, 6107119981172920239u, 643361792051163121u, ++ 6410046491609887121u, 349161128571523535u, 16190407203032477997u, 13583585392940618099u, 13445635196422188652u, 16624205252526067250u, 198883208621960912u, 6840937431151644302u, ++ 11741959369723482640u, 18365299631022420558u, 1921136078311936684u, 5081265949533565682u, 4656338829252136429u, 2068229881835728307u, 17925537898651110737u, 11883093821164285199u, ++ 17650059563187254127u, 12167860639460954929u, 5524638460789093331u, 1190641388963713933u, 1629433367522815122u, 5382257181810330828u, 12593761944904002606u, 17504208224571739248u, ++ 14134199920450915223u, 10956049054195313609u, 8970094247992396587u, 2328741787718953845u, 2759494198457160810u, 8819954874021999668u, 11389990047714514134u, 13996106797082358920u, ++ 10530693064931404520u, 14846677937748691638u, 3061998372948781652u, 8526176301674629642u, 8091274350704555285u, 3198835872954668363u, 14416890915810522537u, 10682083699634542071u, ++ 7503655637611612521u, 3751252662574033207u, 15021960841764981205u, 10112215774463453579u, 9966225872684586644u, 15448000658827392714u, 3609014293261211176u, 7942304654960916086u, ++ 4476610425261238294u, 7065420035288041544u, 9690325514808060074u, 15733189881789008116u, 15874467260079749099u, 9250420838410950581u, 7212375292832610135u, 4051821833783301897u, ++ 688179623118076057u, 6170372224719608007u, 12814440204992854053u, 17148438651140642939u, 16997030381696051044u, 13244209591132604218u, 6033552274612791256u, 1123099122930255750u, ++ 6885631946054851046u, 262293608834169272u, 16705050609013102938u, 13544914965422553348u, 13683025758949262875u, 16271127284595091013u, 412415468322195111u, 6454862019777308409u, ++ 11927910341603441255u, 17988788832627006009u, 2148953154424896219u, 4755777988240824965u, 5180549047267992986u, 2001980365486523844u, 18428711160677000486u, 11786650616022549880u, ++ 17548901841432484632u, 12657171448130714438u, 5463103839546661796u, 1728714438829439994u, 1290082918514197733u, 5605359706950509755u, 12231113943998710873u, 17694874057198724103u, ++ 14077515103266137056u, 11488706867561743294u, 8865212338619786076u, 2822341649514070786u, 2391433177253116957u, 9015472726907116611u, 11054926469989481633u, 14215482952762858751u, ++ 10763369033251996319u, 14515766235920655041u, 3244216653174833699u, 8153963644554617469u, 8589026054036938082u, 3107253741862419772u, 14945397058901253598u, 10612099275430968704u, ++ 8023714262914015518u, 3707732413820797248u, 15493257225902875042u, 10029072425162228220u, 10174906129304731363u, 15067338284929851069u, 3850131242430201439u, 7584939832928591361u, ++ 4133108057121652833u, 7311251501606674495u, 9295800309597257949u, 15937155243838988419u, 15796038462287912860u, 9735579710801330114u, 7164140183868956448u, 4558017662132191102u, ++ }, { ++ 0u, 7026975924517234630u, 14053951849034469260u, 11713158812725061706u, 1498566550037692829u, 8453026741656872539u, 15547077823203331601u, 13134332388348864983u, ++ 2997133100075385658u, 5193532126013515004u, 16906053483313745078u, 10023477084983765872u, 4421425403924087463u, 6690338751863514465u, 18326734871926164779u, 11516110084014746349u, ++ 5994266200150771316u, 3651077923391955378u, 10387064252027030008u, 17411644826573123134u, 5180286430728521705u, 2765428220391841839u, 9578516152858789989u, 16530863678517358499u, ++ 8842850807848174926u, 1962664170658947720u, 13380677503727028930u, 15579466327313067268u, 7958959654645957843u, 1150444288916906773u, 12500388506175163231u, 14771411239789669529u, ++ 11988532400301542632u, 14401112944851970862u, 7302155846783910756u, 347530691846251682u, 12867955000885349749u, 15208934917731379891u, 8186843028093092601u, 1160054057126929727u, ++ 10360572861457043410u, 17171366937719040020u, 5530856440783683678u, 3262112454209283992u, 11170013709381963343u, 18052407625221859721u, 6344013830343901635u, 4147432248901248517u, ++ 17685701615696349852u, 10733466276663946586u, 3925328341317895440u, 6340298665266291414u, 16265807495604570881u, 9241127928571882695u, 2500178400086410381u, 4843267757373072203u, ++ 15917919309291915686u, 13646779991004769888u, 2300888577833813546u, 9109287431904666092u, 14423962049646856251u, 12225267820500938749u, 803223682168014775u, 7683504840782913649u, ++ 16025789128531904341u, 13827140552201887891u, 2120809441137969369u, 9001136188144267039u, 14604311693567821512u, 12333148557000565006u, 695061383692503364u, 7503436758785666690u, ++ 17866059964468495471u, 10841338299774886825u, 3817174930229677027u, 6160221704524114981u, 16373686056186185202u, 9421479739856314932u, 2320108114253859454u, 4735107671358188984u, ++ 10180636633891078433u, 17063072784830850791u, 5638869205660782253u, 3442330069771397483u, 11061712881567367356u, 17872478072565786490u, 6524224908418567984u, 4255451551249279222u, ++ 11880240423364919835u, 14221174549956093405u, 7482375666214882711u, 455541244296276561u, 12688027660687803270u, 15100631886079386688u, 8294864497802497034u, 1340262959281482700u, ++ 8662912472460168125u, 1854372134182743163u, 13488687978245964849u, 15759686224643400695u, 7850656682635790880u, 970516889046347238u, 12680597330532582828u, 14879432787265004138u, ++ 5885971969496909959u, 3471141773623390017u, 10567281927262422795u, 17519657531808653517u, 5000356800172820762u, 2657127470508076764u, 9686535514746144406u, 16711074697083887952u, ++ 3105005063510429129u, 5373890534425651727u, 16725976600334615109u, 9915323596096578947u, 4601777155667627092u, 6798217371950640018u, 18218574863809332184u, 11336039720248747038u, ++ 180360639130832627u, 7134845665859430709u, 13945800545768817023u, 11533079735570376377u, 1606447364336029550u, 8633376307814525096u, 15367009681565827298u, 13026170149548992292u, ++ 3321048140255203375u, 5733767250183223273u, 17086394267351834531u, 10131907641284540517u, 4241618882275938738u, 6582455852881933940u, 18002272376288534078u, 10975340495589554680u, ++ 540800415553098517u, 7351451582082282707u, 14161821513074465945u, 11892934580260027231u, 1390122767385006728u, 8272655212095272270u, 15006873517571333380u, 12810430501506267842u, ++ 9023334491325470299u, 2070960623556915613u, 13704726720259086807u, 16119558478964112913u, 7634349860459354054u, 609813203025260544u, 12320443409048229962u, 14663675712440713100u, ++ 6101997361665611105u, 3831000989484282535u, 10927717295939115757u, 17736259059608567083u, 4640216228507718908u, 2441383434118427450u, 9470215342716377968u, 16350357972595129526u, ++ 9820495924665654471u, 16847328885758262017u, 5422549171225416523u, 3081613207998608525u, 11277738411321564506u, 18232337151134792348u, 6884660139542794966u, 4472053216375158032u, ++ 11663933463862517757u, 13860471001487472699u, 7122221882022416497u, 239784031886489527u, 13048449816837135968u, 15317220237859158438u, 8510903102498558444u, 1700135351162517034u, ++ 15809464669166377651u, 13466419319190748533u, 1760673139591009599u, 8785396677427507961u, 14964751332429765422u, 12549754610540477672u, 911082488592553122u, 7863291466191287140u, ++ 17505901828360837513u, 10625576643111779919u, 3600872305391818245u, 5799522617425244611u, 16589728995604994068u, 9781356593166352338u, 2680525918562965400u, 4951691578960654430u, ++ 17325824944920336250u, 10517423154702741692u, 3708744268365486326u, 5979881026315534128u, 16481568986909349607u, 9601286230029496609u, 2860877669727689067u, 5059570199676927661u, ++ 15701313365271581760u, 13286340242614875014u, 1941033778092694476u, 8893266419348519946u, 14784683190314112477u, 12441592372201976347u, 1018963302412737105u, 8043641032810315159u, ++ 11771943938993819918u, 14040690898222216904u, 6942283547246780034u, 131491994814691652u, 13228658641689481363u, 15425241784889898837u, 8402600130983321375u, 1520207950847359193u, ++ 10000713600345641524u, 16955341590498866674u, 5314254941016153528u, 2901677057735113342u, 11385757773804508073u, 18412548169088955503u, 6704730509582687269u, 4363752465879022563u, ++ 6210010127020858258u, 4011218604585024596u, 10747781068851303454u, 17627964906259002328u, 4820427307211528719u, 2549402735887646153u, 9361914515530929539u, 16170428419360240197u, ++ 9203554311335254184u, 2178971175377796974u, 13596434743901280036u, 15939620083439087842u, 7742371330630129973u, 790022104701665011u, 12140516069312059065u, 14555372680310567295u, ++ 360721278261665254u, 7243300338934250016u, 14269691331718861418u, 12073295142069515692u, 1281960468464901243u, 8092587130592951229u, 15187223161047700471u, 12918311238500824113u, ++ 3212894728672059100u, 5553690289885640986u, 17266752615629050192u, 10239779664840078998u, 4061548595831021377u, 6474295767462639751u, 18110150936257777869u, 11155692307469580043u, ++ }, { ++ 0u, 2517245393515406572u, 5034490787030813144u, 7435750759411199284u, 10068981574061626288u, 12201157653998401372u, 14871501518822398568u, 17045318164640841348u, ++ 9628913577918544357u, 12056075433989135625u, 13870769438669140029u, 16326061061730899153u, 1016952077871524437u, 3239211695253081785u, 5459183210385793933u, 7578968205522831201u, ++ 11067918171351838031u, 13508029996328618403u, 15872723984458359959u, 18349972777811820667u, 1307470557354262271u, 3515654148887976467u, 6339673239971903271u, 8436375012170683339u, ++ 2033904155743048874u, 4528066323082129478u, 6478423390506163570u, 8865607338129291678u, 10918366420771587866u, 13072499669943034870u, 15157936411045662402u, 17344703028974807598u, ++ 11667391723826758683u, 9441211325989495031u, 16444045520167767491u, 14329311757255665967u, 3050858413050517419u, 628778578755597127u, 8036894684654706291u, 5577642697640442527u, ++ 2614941114708524542u, 478839856218937618u, 7031308297775952934u, 4862538486186004682u, 12679346479943806542u, 10167187506301176482u, 16872750024341366678u, 14467534086004917114u, ++ 4067808311486097748u, 1917635425212288440u, 9056132646164258956u, 6864284009665987680u, 12956846781012327140u, 10457633378212404744u, 17731214676258583356u, 15347951510183778256u, ++ 13678285260964991153u, 11474057634298917981u, 17873974704293108073u, 15772186515461651845u, 3922409453435093761u, 1477250791027468269u, 8336488571297909465u, 5863164957556321845u, ++ 15063804914172139187u, 17573731408537121375u, 10724047561790938987u, 13131499433903012743u, 6535100908406441219u, 8673469987586793967u, 2265113888856263899u, 4431612735036172343u, ++ 6101716826101034838u, 8521560882533092282u, 1257557157511194254u, 3719041779816530530u, 16073789369309412582u, 18302240886422657034u, 11155285395280885054u, 13267751491267498450u, ++ 5229882229417049084u, 7672809353916620560u, 957679712437875236u, 3433240205686757064u, 14062616595551905868u, 16269110787469675680u, 9725076972372009364u, 11824592944582215032u, ++ 14786588404820918809u, 17283564772171425525u, 9865866699426761665u, 12251361247433944877u, 5082513026899726761u, 7234957975966594373u, 240568853608110193u, 2430150771060047005u, ++ 8135616622972195496u, 5911125624750880324u, 3835270850424576880u, 1717722887501053852u, 18112265292328517912u, 15687370158510810612u, 13728568019331975360u, 11271004332422294572u, ++ 17674167644946721613u, 15539754686561718177u, 12725302718847165077u, 10553717607734429305u, 9150035367232403709u, 6635062193578351633u, 4261933579054297381u, 1858407040333796809u, ++ 16825062113507622887u, 14668696227990231819u, 12439147139764057663u, 10254616302904316627u, 7116415003206659159u, 4624520499557157051u, 2818284765131990415u, 428829699325493603u, ++ 7844818906870187522u, 5634399380472423150u, 2954501582054936538u, 860032292373900086u, 16672977142595818930u, 14235136279826723166u, 11726329915112643690u, 9246813302127474822u, ++ 3513487962258617315u, 1309817375275636495u, 8438743075148003899u, 6337546835477044951u, 13510341259434958931u, 11065716548023207103u, 18347741267953084811u, 15874986514718330215u, ++ 13070201816812882438u, 10920562880461237994u, 17346939975173587934u, 15155660198108440370u, 4530227777712527798u, 2031571415669472602u, 8863225470072344686u, 6480554254231811202u, ++ 12203433652202069676u, 10066744842596399680u, 17043121765066184564u, 14873799311837557656u, 2515114315022388508u, 2382082824317424u, 7438083559633061060u, 5032329272252129320u, ++ 3241337884980569929u, 1014584229661574053u, 7576621447749742225u, 5461349336866867837u, 12053812688995611897u, 9631145302510833685u, 16328262745174523169u, 13868458115447806413u, ++ 10459764458834098168u, 12954464700354433812u, 15345618707833241120u, 17733376188870843084u, 1915359424875750472u, 4070045040789094564u, 6866480411373514128u, 9053834855311329660u, ++ 1479513538183220765u, 3920177730975673073u, 5860963271950469061u, 8338799892386374441u, 11471931442405006765u, 13680653107046267201u, 15774533275401163893u, 17871808579940708505u, ++ 626467317811485367u, 3053060038512016987u, 5579874205336949615u, 8034632152261867395u, 9443377510452431111u, 11665044903776710123u, 14326943696444768479u, 16446171926791300147u, ++ 10165026053799453522u, 12681679222183806910u, 14469915951933188746u, 16870619158449294950u, 481137707216220386u, 2612744652856644622u, 4860301542120094010u, 7033584512875404758u, ++ 16271233245944390992u, 14060243759811248572u, 11822251249501760648u, 9727246909562751076u, 7670541700849153760u, 5232109988680716812u, 3435445775002107704u, 955373222128557012u, ++ 7237229143405862069u, 5080272407415421017u, 2427958334666397037u, 242871556844564865u, 17281429885116092165u, 14788965422804986857u, 12253699033039161053u, 9863708918048465457u, ++ 8671167069616523295u, 6537293559533907187u, 4433853414635209159u, 2262842661302265131u, 17575888975148309423u, 15061467343334031171u, 13129122476067492471u, 10726182388697724571u, ++ 18300070734464807418u, 16076131279156974870u, 13270124387156703266u, 11153162876657622222u, 8523867158108594762u, 6099511471519499942u, 3716814080667593618u, 1259824750463930238u, ++ 4622362935074513227u, 7118752576211060135u, 431206655032469651u, 2816149936058911871u, 14670999143827763963u, 16822869460218058263u, 10252375625438018339u, 12441418369480155087u, ++ 14232830006413318318u, 16675182499310091330u, 9249040999114314102u, 11724062320027170202u, 5636569530263980830u, 7842476994894082034u, 857659398650987206u, 2956624102806742570u, ++ 15689637813740375044u, 18110037535197587688u, 11268798760944846300u, 13730874507508556080u, 5909003164109873076u, 8137989456584309592u, 1720064584747800172u, 3833100915362378368u, ++ 6637197082762229217u, 9147658351414628621u, 1856069252600036409u, 4264091358266300629u, 15537483516989711953u, 17676408262268928701u, 10555910046260817801u, 12723000017772809061u, ++ }, { ++ 0u, 15762200328042667840u, 2856835172924432389u, 18238190752146915141u, 5713670345848864778u, 10805715811487326026u, 7561135427655163919u, 12848797446532677455u, ++ 11427340691697729556u, 4911321075843194708u, 13345174655120580625u, 7173389830452510545u, 15122270855310327838u, 820654137405644638u, 17760118084036943899u, 3226275954771115867u, ++ 12678913378224905901u, 8451595299172663789u, 9822642151686389416u, 5976168202979041768u, 16194808345499688615u, 4179641502022828519u, 14346779660905021090u, 2135996745225445858u, ++ 3558579666237890233u, 16995468946051088889u, 1641308274811289276u, 14733962144962732540u, 9090961916423626419u, 11859948271085519347u, 6452551909542231734u, 9453764156601606646u, ++ 14785799433083167711u, 1697614691135618207u, 16903190598345327578u, 3470771065211313306u, 9402037001392841685u, 6396285171454065813u, 11952336405958083536u, 9178809987380452496u, ++ 6027971268800324555u, 9878982515431963787u, 8359283004045657038u, 12591138999497481358u, 2084233168694272961u, 14290549069261356161u, 4271993490450891716u, 16282692837778922628u, ++ 7117159332475780466u, 13293411258189767218u, 4999205320339463543u, 11519692655715205687u, 3282616549622578552u, 17811921192019632696u, 732879648334208381u, 15029958398333780541u, ++ 18181923832847252838u, 2805107922438644262u, 15850048426093911395u, 92388385340408355u, 12905103819084463468u, 7612972483059622444u, 10717907374994120041u, 5621392111171994153u, ++ 629311348378851643u, 15133597752622646907u, 3395229382271236414u, 17699378041462564478u, 5183867188229904689u, 11335100742646646385u, 6941542130422626612u, 13469099241846138484u, ++ 10821536956051937583u, 5517832210058282607u, 12792570342908131626u, 7725577015716947562u, 15665448522205731109u, 277059068684322405u, 18357619974760904992u, 2629481737494357600u, ++ 12055942537600649110u, 9075274912216783062u, 9289461107078326163u, 6508930745710590163u, 16718566008091314076u, 3655465612432595164u, 14961454118931310489u, 1522030784741112025u, ++ 4168466337388545922u, 16386289672930760898u, 2196870928291817351u, 14177982363995224263u, 8543986980901783432u, 12406505804242475208u, 5852377756745475981u, 10054645982306597069u, ++ 14234318664951560932u, 2248669261341992356u, 16298510681658284769u, 4076149859246245281u, 9998410640678927086u, 5800610134637962670u, 12494386096293518059u, 8636334373997692331u, ++ 6565233099245157104u, 9341293662428177840u, 8987461698644630261u, 11963660006880118197u, 1465759296668416762u, 14909722918146729402u, 3743309483160705791u, 16810949547632248255u, ++ 7673845564465570889u, 12736298827739970313u, 5610215844877288524u, 10909381007990496012u, 2681314179816367171u, 18413922163761052419u, 184776770680816710u, 15577635352405072646u, ++ 17647610443766686813u, 3338994288425483037u, 15225944966119244888u, 717191546761911064u, 13520897736746902615u, 6997878541721926423u, 11242784222343988306u, 5096087965850491666u, ++ 1258622696757703286u, 14684288965200833846u, 3950222953022231155u, 17036158029906267443u, 6790458764542472828u, 9548224856613104956u, 8762045755503235705u, 11756540858562383161u, ++ 10367734376459809378u, 6151638724996853026u, 12124837022850257511u, 8285082520580115751u, 13883084260845253224u, 1879138195689975080u, 16649556998353834605u, 4445490780332133677u, ++ 13727827248377474267u, 7223104792207356827u, 11035664420116565214u, 4870673773980832670u, 17422178244240010449u, 3131857036752565137u, 15451154031433895124u, 924103331921597332u, ++ 2311784730144877775u, 18062687245331231631u, 554118137368644810u, 15928680121837474698u, 8024872609708797125u, 13105623011270275973u, 5258963474988715200u, 10539833548380279680u, ++ 15872427342139003305u, 502333042764009193u, 18150549824433566124u, 2404114375865757420u, 10596187595637903779u, 5310779519913856739u, 13017861491421180326u, 7932573568563556070u, ++ 4814384572959953341u, 10983915471956430589u, 7310931224865190328u, 13820193315420761848u, 980423156880069047u, 15503004023780282103u, 3044061569482224050u, 17329913425393921778u, ++ 8336932674777091844u, 12181156958151692356u, 6059373863990406913u, 10279938678082531393u, 4393741856583634702u, 16593268045114871886u, 1971504083133951755u, 13970910599835103307u, ++ 17087973961803566864u, 4006576835745435728u, 14591990156772618005u, 1170861220680101973u, 11704755513490951962u, 8705792948709298266u, 9640554597612056351u, 6878321524855255135u, ++ 1858937689852799821u, 14083548048513152013u, 4497338522683984712u, 16489741062169236488u, 6235036951360285511u, 10104345546597921799u, 8152299718492490562u, 12365860697102636034u, ++ 9753200483853429593u, 6765745319621112857u, 11601220269275925340u, 8809399250468705308u, 14416405870873226067u, 1346516287098352659u, 17272668747995384662u, 3821952007586370582u, ++ 13130466198490314208u, 7820039919040899744u, 10492627387899532773u, 5414409408661555877u, 17974923397289260522u, 2579810761044912810u, 16057098401758057967u, 317732763665910447u, ++ 2931518593336833524u, 17442526084696124084u, 1084062204544407025u, 15399436031514938033u, 7486618966321411582u, 13644576356632980158u, 4629793036166665723u, 11168576964637084347u, ++ 15347691128931141778u, 1027777753507534802u, 17534896747071563927u, 3019349226222860247u, 11220431689754577048u, 4686116923914377176u, 13552315720802183325u, 7398828111596124125u, ++ 5362628359632734342u, 10436379358185592774u, 7912374160093407363u, 13218332977821366211u, 369553541361633420u, 16113456511805446092u, 2487515902914439305u, 17887166489985742793u, ++ 8865757316743550527u, 11653040814255671679u, 6677988576850966074u, 9660905738751846778u, 3765703796660934197u, 17220887603689539957u, 1434383093523822128u, 14508740362393577840u, ++ 16546065181022836267u, 4549193289962883435u, 13995757083443852846u, 1766676892172462446u, 12309576339732698657u, 8100554995509053793u, 10192175931700983332u, 6327407589325138276u, ++ }, ++}; + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD1[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u, ++ 64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u, ++}; + +-// -------- func gif.decoder.do_tell_me_more ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD2[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 68u, 250u, 158u, 138u, 0u, 91u, 9u, 96u, ++ 81u, 175u, 225u, 15u, 163u, 83u, 230u, 59u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD4[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 243u, 65u, 212u, 157u, 187u, 239u, 227u, 106u, ++ 244u, 45u, 132u, 167u, 84u, 96u, 31u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD8[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 16u, 204u, 79u, 29u, 215u, 87u, 135u, ++ 64u, 231u, 61u, 247u, 42u, 107u, 216u, 215u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_MUPX[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u, ++ 133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); + +- uint64_t v_chunk_length = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up__choosy_default( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up_x86_sse42( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + +- uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- VTables + +- if ((self->private_impl.f_call_sequence & 16u) == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- } +- while (true) { +- while (true) { +- if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 2u, +- 0u, +- self->private_impl.f_metadata_io_position, +- 0u, +- 0u); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 0u, +- 0u, +- 0u, +- 0u, +- 0u); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- break; +- } +- v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- if (v_chunk_length <= 0u) { +- iop_a_src += 1u; +- break; +- } +- if (self->private_impl.f_metadata_fourcc == 1481461792u) { +- v_chunk_length += 1u; +- } else { +- iop_a_src += 1u; +- } +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length); +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 3u, +- self->private_impl.f_metadata_fourcc, +- 0u, +- wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), +- self->private_impl.f_metadata_io_position); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++const wuffs_base__hasher_u64__func_ptrs ++wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64 = { ++ (uint64_t(*)(const void*))(&wuffs_crc64__ecma_hasher__checksum_u64), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_crc64__ecma_hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_crc64__ecma_hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update), ++ (uint64_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update_u64), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_crc64__ecma_hasher__initialize( ++ wuffs_crc64__ecma_hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 3u, +- self->private_impl.f_metadata_fourcc, +- 0u, +- self->private_impl.f_metadata_io_position, +- self->private_impl.f_metadata_io_position); ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- self->private_impl.f_call_sequence &= 239u; +- self->private_impl.f_metadata_fourcc = 0u; +- self->private_impl.f_metadata_io_position = 0u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- self->private_impl.p_do_tell_me_more[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.choosy_up = &wuffs_crc64__ecma_hasher__up__choosy_default; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = ++ wuffs_base__hasher_u64__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = ++ (const void*)(&wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_crc64__ecma_hasher* ++wuffs_crc64__ecma_hasher__alloc(void) { ++ wuffs_crc64__ecma_hasher* x = ++ (wuffs_crc64__ecma_hasher*)(calloc(1, sizeof(wuffs_crc64__ecma_hasher))); ++ if (!x) { ++ return NULL; + } ++ if (wuffs_crc64__ecma_hasher__initialize( ++ x, sizeof(wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +- return status; ++size_t ++sizeof__wuffs_crc64__ecma_hasher(void) { ++ return sizeof(wuffs_crc64__ecma_hasher); + } + +-// -------- func gif.decoder.num_animation_loops ++// ---------------- Function Implementations ++ ++// -------- func crc64.ecma_hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_gif__decoder__num_animation_loops( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__get_quirk( ++ const wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key) { + if (!self) { + return 0; + } +@@ -37136,38 +37965,134 @@ wuffs_gif__decoder__num_animation_loops( + return 0; + } + +- if (self->private_impl.f_seen_num_animation_loops_value) { +- return self->private_impl.f_num_animation_loops_value; +- } +- if (self->private_impl.f_num_decoded_frame_configs_value > 1u) { +- return 1u; +- } + return 0u; + } + +-// -------- func gif.decoder.num_decoded_frame_configs ++// -------- func crc64.ecma_hasher.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_crc64__ecma_hasher__set_quirk( ++ wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func crc64.ecma_hasher.update ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__update( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if (self->private_impl.f_state == 0u) { ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); ++ } ++ wuffs_crc64__ecma_hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func crc64.ecma_hasher.update_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__num_decoded_frame_configs( +- const wuffs_gif__decoder* self) { ++wuffs_crc64__ecma_hasher__update_u64( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { + return 0; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return 0; + } + +- return self->private_impl.f_num_decoded_frame_configs_value; ++ wuffs_crc64__ecma_hasher__update(self, a_x); ++ return wuffs_crc64__ecma_hasher__checksum_u64(self); + } + +-// -------- func gif.decoder.num_decoded_frames ++// -------- func crc64.ecma_hasher.up ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up__choosy_default( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ v_s = (18446744073709551615u ^ self->private_impl.f_state); ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 8; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end0_p) { ++ v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) | ++ (((uint64_t)(v_p.ptr[1u])) << 8u) | ++ (((uint64_t)(v_p.ptr[2u])) << 16u) | ++ (((uint64_t)(v_p.ptr[3u])) << 24u) | ++ (((uint64_t)(v_p.ptr[4u])) << 32u) | ++ (((uint64_t)(v_p.ptr[5u])) << 40u) | ++ (((uint64_t)(v_p.ptr[6u])) << 48u) | ++ (((uint64_t)(v_p.ptr[7u])) << 56u)); ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 8; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; ++ } ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func crc64.ecma_hasher.checksum_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__num_decoded_frames( +- const wuffs_gif__decoder* self) { ++wuffs_crc64__ecma_hasher__checksum_u64( ++ const wuffs_crc64__ecma_hasher* self) { + if (!self) { + return 0; + } +@@ -37176,72 +38101,473 @@ wuffs_gif__decoder__num_decoded_frames( + return 0; + } + +- return self->private_impl.f_num_decoded_frames_value; ++ return self->private_impl.f_state; + } + +-// -------- func gif.decoder.frame_dirty_rect ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func crc64.ecma_hasher.up_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_gif__decoder__frame_dirty_rect( +- const wuffs_gif__decoder* self) { ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up_x86_sse42( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8_t v_buf[48] = {0}; ++ __m128i v_xa = {0}; ++ __m128i v_xb = {0}; ++ __m128i v_xc = {0}; ++ __m128i v_xd = {0}; ++ __m128i v_xe = {0}; ++ __m128i v_xf = {0}; ++ __m128i v_xg = {0}; ++ __m128i v_xh = {0}; ++ __m128i v_mu1 = {0}; ++ __m128i v_mu2 = {0}; ++ __m128i v_mu4 = {0}; ++ __m128i v_mu8 = {0}; ++ __m128i v_mupx = {0}; ++ ++ v_s = (18446744073709551615u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ do { ++ do { ++ if (((uint64_t)(a_x.len)) >= 128u) { ++ } else if (((uint64_t)(a_x.len)) >= 64u) { ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u); ++ break; ++ } else if (((uint64_t)(a_x.len)) >= 32u) { ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u); ++ goto label__chain2__break; ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; ++ } ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++ } ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ v_xe = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)); ++ v_xf = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)); ++ v_xg = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)); ++ v_xh = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ v_mu8 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD8)); ++ while (((uint64_t)(a_x.len)) >= 128u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ v_xe = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u))); ++ v_xf = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u))); ++ v_xg = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u))); ++ v_xh = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ } ++ v_mu4 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD4)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), v_xe); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), v_xf); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), v_xg); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), v_xh); ++ if (((uint64_t)(a_x.len)) > 64u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u); ++ } ++ } while (0); ++ v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), v_xc); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), v_xd); ++ if (((uint64_t)(a_x.len)) > 32u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u); ++ } ++ } while (0); ++ label__chain2__break:; ++ v_mu1 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD1)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), v_xb); ++ if (((uint64_t)(a_x.len)) > 24u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u); ++ if (((uint64_t)(a_x.len)) > 24u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ } ++ _mm_storeu_si128((__m128i*)(void*)(v_buf + (24u - ((uint64_t)(a_x.len)))), v_xa); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(v_buf, ((24u - ((uint64_t)(a_x.len))) + 16u), 48), a_x); ++ v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2)); ++ v_xa = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 0u)); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 32u)); ++ v_xd = _mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))); ++ v_xe = _mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(17u))); ++ v_xa = _mm_xor_si128(v_xd, _mm_xor_si128(v_xe, v_xc)); ++ v_mupx = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_MUPX)); ++ v_xb = _mm_clmulepi64_si128(v_xa, v_mupx, (int32_t)(0u)); ++ v_xc = _mm_clmulepi64_si128(v_xb, v_mupx, (int32_t)(16u)); ++ v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(_mm_xor_si128(v_xc, _mm_slli_si128(v_xb, (int32_t)(8u))), v_xa), (int32_t)(1u)))); ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)"; ++const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)"; ++const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count"; ++const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition"; ++const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code"; ++const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length"; ++const char wuffs_deflate__error__bad_block[] = "#deflate: bad block"; ++const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance"; ++const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count"; ++const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count"; ++const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length"; ++const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code"; ++const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes"; ++const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input"; ++const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state"; ++const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O"; ++const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance"; ++const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 16u, 17u, 18u, 0u, 8u, 7u, 9u, 6u, ++ 10u, 5u, 11u, 4u, 12u, 3u, 13u, 2u, ++ 14u, 1u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 128u, 64u, 192u, 32u, 160u, 96u, 224u, ++ 16u, 144u, 80u, 208u, 48u, 176u, 112u, 240u, ++ 8u, 136u, 72u, 200u, 40u, 168u, 104u, 232u, ++ 24u, 152u, 88u, 216u, 56u, 184u, 120u, 248u, ++ 4u, 132u, 68u, 196u, 36u, 164u, 100u, 228u, ++ 20u, 148u, 84u, 212u, 52u, 180u, 116u, 244u, ++ 12u, 140u, 76u, 204u, 44u, 172u, 108u, 236u, ++ 28u, 156u, 92u, 220u, 60u, 188u, 124u, 252u, ++ 2u, 130u, 66u, 194u, 34u, 162u, 98u, 226u, ++ 18u, 146u, 82u, 210u, 50u, 178u, 114u, 242u, ++ 10u, 138u, 74u, 202u, 42u, 170u, 106u, 234u, ++ 26u, 154u, 90u, 218u, 58u, 186u, 122u, 250u, ++ 6u, 134u, 70u, 198u, 38u, 166u, 102u, 230u, ++ 22u, 150u, 86u, 214u, 54u, 182u, 118u, 246u, ++ 14u, 142u, 78u, 206u, 46u, 174u, 110u, 238u, ++ 30u, 158u, 94u, 222u, 62u, 190u, 126u, 254u, ++ 1u, 129u, 65u, 193u, 33u, 161u, 97u, 225u, ++ 17u, 145u, 81u, 209u, 49u, 177u, 113u, 241u, ++ 9u, 137u, 73u, 201u, 41u, 169u, 105u, 233u, ++ 25u, 153u, 89u, 217u, 57u, 185u, 121u, 249u, ++ 5u, 133u, 69u, 197u, 37u, 165u, 101u, 229u, ++ 21u, 149u, 85u, 213u, 53u, 181u, 117u, 245u, ++ 13u, 141u, 77u, 205u, 45u, 173u, 109u, 237u, ++ 29u, 157u, 93u, 221u, 61u, 189u, 125u, 253u, ++ 3u, 131u, 67u, 195u, 35u, 163u, 99u, 227u, ++ 19u, 147u, 83u, 211u, 51u, 179u, 115u, 243u, ++ 11u, 139u, 75u, 203u, 43u, 171u, 107u, 235u, ++ 27u, 155u, 91u, 219u, 59u, 187u, 123u, 251u, ++ 7u, 135u, 71u, 199u, 39u, 167u, 103u, 231u, ++ 23u, 151u, 87u, 215u, 55u, 183u, 119u, 247u, ++ 15u, 143u, 79u, 207u, 47u, 175u, 111u, 239u, ++ 31u, 159u, 95u, 223u, 63u, 191u, 127u, 255u, ++}; ++ ++static const uint32_t ++WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742848u, 1073743104u, 1073743360u, 1073743616u, ++ 1073743888u, 1073744400u, 1073744912u, 1073745424u, 1073745952u, 1073746976u, 1073748000u, 1073749024u, ++ 1073750064u, 1073752112u, 1073754160u, 1073756208u, 1073758272u, 1073762368u, 1073766464u, 1073770560u, ++ 1073774672u, 1073782864u, 1073791056u, 1073799248u, 1073807104u, 134217728u, 134217728u, 134217728u, ++}; ++ ++static const uint32_t ++WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742864u, 1073743376u, 1073743904u, 1073744928u, ++ 1073745968u, 1073748016u, 1073750080u, 1073754176u, 1073758288u, 1073766480u, 1073774688u, 1073791072u, ++ 1073807472u, 1073840240u, 1073873024u, 1073938560u, 1074004112u, 1074135184u, 1074266272u, 1074528416u, ++ 1074790576u, 1075314864u, 1075839168u, 1076887744u, 1077936336u, 1080033488u, 134217728u, 134217728u, ++}; ++ ++#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024u ++ ++#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__do_transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_blocks( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_uncompressed( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_fixed_huffman( ++ wuffs_deflate__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_dynamic_huffman( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_huff( ++ wuffs_deflate__decoder* self, ++ uint32_t a_which, ++ uint32_t a_n_codes0, ++ uint32_t a_n_codes1, ++ uint32_t a_base_symbol); ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_bmi2( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast32( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_slow( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_deflate__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_deflate__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_deflate__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_deflate__decoder__initialize( ++ wuffs_deflate__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- return wuffs_base__utility__make_rect_ie_u32( +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height)); ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default; ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_deflate__decoder* ++wuffs_deflate__decoder__alloc(void) { ++ wuffs_deflate__decoder* x = ++ (wuffs_deflate__decoder*)(calloc(1, sizeof(wuffs_deflate__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_deflate__decoder__initialize( ++ x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_deflate__decoder(void) { ++ return sizeof(wuffs_deflate__decoder); + } + +-// -------- func gif.decoder.history_retain_length ++// ---------------- Function Implementations ++ ++// -------- func deflate.decoder.add_history + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__history_retain_length( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_deflate__decoder__add_history( ++ wuffs_deflate__decoder* self, ++ wuffs_base__slice_u8 a_hist) { + if (!self) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n_copied = 0; ++ uint32_t v_already_full = 0; ++ ++ v_s = a_hist; ++ if (((uint64_t)(v_s.len)) >= 32768u) { ++ v_s = wuffs_private_impl__slice_u8__suffix(v_s, 32768u); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); ++ self->private_impl.f_history_index = 32768u; ++ } else { ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767u), 32768), v_s); ++ if (v_n_copied < ((uint64_t)(v_s.len))) { ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); ++ self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u); ++ } else { ++ v_already_full = 0u; ++ if (self->private_impl.f_history_index >= 32768u) { ++ v_already_full = 32768u; ++ } ++ self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full); ++ } ++ } ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gif.decoder.workbuf_len ++// -------- func deflate.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_gif__decoder__workbuf_len( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_deflate__decoder__get_quirk( ++ const wuffs_deflate__decoder* self, ++ uint32_t a_key) { + if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return 0u; + } + +-// -------- func gif.decoder.restart_frame ++// -------- func deflate.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__restart_frame( +- wuffs_gif__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { ++wuffs_deflate__decoder__set_quirk( ++ wuffs_deflate__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -37252,28 +38578,52 @@ wuffs_gif__decoder__restart_frame( + : wuffs_base__error__initialize_not_called); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if (a_io_position == 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func deflate.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_deflate__decoder__dst_history_retain_length( ++ const wuffs_deflate__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } +- self->private_impl.f_delayed_num_decoded_frames = false; +- self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_num_decoded_frame_configs_value = a_index; +- self->private_impl.f_num_decoded_frames_value = a_index; +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); + } + +-// -------- func gif.decoder.decode_frame_config ++// -------- func deflate.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_deflate__decoder__workbuf_len( ++ const wuffs_deflate__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func deflate.decoder.transform_io + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_deflate__decoder__transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -37283,12 +38633,12 @@ wuffs_gif__decoder__decode_frame_config( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_src) { ++ if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -37297,17 +38647,17 @@ wuffs_gif__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_deflate__error__truncated_input); + goto exit; + } + status = v_status; +@@ -37315,14 +38665,14 @@ wuffs_gif__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -37332,403 +38682,103 @@ wuffs_gif__decoder__decode_frame_config( + return status; + } + +-// -------- func gif.decoder.do_decode_frame_config ++// -------- func deflate.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_deflate__decoder__do_transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_background_color = 0; +- uint8_t v_flags = 0; ++ uint64_t v_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- if (coro_susp_point) { +- v_background_color = self->private_data.s_do_decode_frame_config[0].v_background_color; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_dirty_max_excl_y = 0u; +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.choosy_decode_huffman_fast64 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 : ++#endif ++ self->private_impl.choosy_decode_huffman_fast64); ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src); ++ v_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__skip_frame(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- } +- v_background_color = self->private_impl.f_black_color_u32_argb_premul; +- if ( ! self->private_impl.f_gc_has_transparent_index) { +- v_background_color = self->private_impl.f_background_color_u32_argb_premul; +- if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) { +- while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } +- v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_flags & 128u) != 0u) { +- v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } ++ goto ok; + } +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)), +- ((wuffs_base__flicks)(self->private_impl.f_gc_duration)), +- self->private_impl.f_num_decoded_frame_configs_value, +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_gc_disposal, +- ! self->private_impl.f_gc_has_transparent_index, +- false, +- v_background_color); +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame_config[0].v_background_color = v_background_color; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func gif.decoder.skip_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_frame( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_flags = 0; +- uint8_t v_lw = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_flags = t_0; +- } +- if ((v_flags & 128u) != 0u) { +- self->private_data.s_skip_frame[0].scratch = (((uint32_t)(3u)) << (1u + (v_flags & 7u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_lw = t_1; +- } +- if (v_lw > 8u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_quirks[0u]) { +- self->private_impl.f_delayed_num_decoded_frames = true; +- } else { +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- } +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_skip_frame[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func gif.decoder.decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))); ++ wuffs_deflate__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func gif.decoder.do_decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_quirks[5u] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); +- goto exit; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend); +- if (status.repr) { +- goto suspend; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf); +- if (status.repr) { +- goto suspend; +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 32u; +- +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: + return status; + } + +-// -------- func gif.decoder.reset_gc +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__reset_gc( +- wuffs_gif__decoder* self) { +- self->private_impl.f_gc_has_transparent_index = false; +- self->private_impl.f_gc_transparent_index = 0u; +- self->private_impl.f_gc_disposal = 0u; +- self->private_impl.f_gc_duration = 0u; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func gif.decoder.decode_up_to_id_part1 ++// -------- func deflate.decoder.decode_blocks + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_up_to_id_part1( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_blocks( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_block_type = 0; ++ uint32_t v_final = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_type = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37741,71 +38791,125 @@ wuffs_gif__decoder__decode_up_to_id_part1( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_blocks; ++ if (coro_susp_point) { ++ v_final = self->private_data.s_decode_blocks.v_final; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) { +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ label__outer__continue:; ++ while (v_final == 0u) { ++ while (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; + } +- uint8_t t_0 = *iop_a_src++; +- v_block_type = t_0; ++ self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u)); ++ self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u); + } +- if (v_block_type == 33u) { ++ v_final = (self->private_impl.f_bits & 1u); ++ v_type = ((self->private_impl.f_bits >> 1u) & 3u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ if (v_type == 0u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_extension(self, a_src); ++ status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } else if (v_block_type == 44u) { +- if (self->private_impl.f_delayed_num_decoded_frames) { +- self->private_impl.f_delayed_num_decoded_frames = false; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ continue; ++ } else if (v_type == 1u) { ++ v_status = wuffs_deflate__decoder__init_fixed_huffman(self); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; + } ++ } else if (v_type == 2u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_id_part0(self, a_src); ++ status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- break; + } else { +- if (self->private_impl.f_delayed_num_decoded_frames) { +- self->private_impl.f_delayed_num_decoded_frames = false; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_block); ++ goto exit; ++ } ++ self->private_impl.f_end_of_block = false; ++ while (true) { ++ if (sizeof(void*) == 4u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ if (self->private_impl.f_end_of_block) { ++ goto label__outer__continue; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_end_of_block) { ++ goto label__outer__continue; + } +- self->private_impl.f_call_sequence = 96u; +- break; + } + } + +- goto ok; + ok: +- self->private_impl.p_decode_up_to_id_part1[0] = 0; ++ self->private_impl.p_decode_blocks = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_up_to_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_blocks.v_final = v_final; + + goto exit; + exit: +@@ -37816,18 +38920,32 @@ wuffs_gif__decoder__decode_up_to_id_part1( + return status; + } + +-// -------- func gif.decoder.decode_header ++// -------- func deflate.decoder.decode_uncompressed + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_header( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_uncompressed( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c[6] = {0}; +- uint32_t v_i = 0; ++ uint32_t v_length = 0; ++ uint32_t v_n_copied = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37839,50 +38957,85 @@ wuffs_gif__decoder__decode_header( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_header[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed; + if (coro_susp_point) { +- memcpy(v_c, self->private_data.s_decode_header[0].v_c, sizeof(v_c)); +- v_i = self->private_data.s_decode_header[0].v_i; ++ v_length = self->private_data.s_decode_uncompressed.v_length; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (v_i < 6u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_n_bits = 0u; ++ self->private_impl.f_bits = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_uncompressed.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_uncompressed.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } +- uint8_t t_0 = *iop_a_src++; +- v_c[v_i] = t_0; + } +- v_i += 1u; ++ v_length = t_0; + } +- if ((v_c[0u] != 71u) || +- (v_c[1u] != 73u) || +- (v_c[2u] != 70u) || +- (v_c[3u] != 56u) || +- ((v_c[4u] != 55u) && (v_c[4u] != 57u)) || +- (v_c[5u] != 97u)) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_header); ++ if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length); + goto exit; + } ++ v_length = ((v_length) & 0xFFFFu); ++ while (true) { ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); ++ if (v_length <= v_n_copied) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ v_length -= v_n_copied; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ } + +- goto ok; + ok: +- self->private_impl.p_decode_header[0] = 0; ++ self->private_impl.p_decode_uncompressed = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_header[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- memcpy(self->private_data.s_decode_header[0].v_c, v_c, sizeof(v_c)); +- self->private_data.s_decode_header[0].v_i = v_i; ++ self->private_impl.p_decode_uncompressed = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_uncompressed.v_length = v_length; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -37890,21 +39043,80 @@ wuffs_gif__decoder__decode_header( + return status; + } + +-// -------- func gif.decoder.decode_lsd ++// -------- func deflate.decoder.init_fixed_huffman + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_lsd( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__init_fixed_huffman( ++ wuffs_deflate__decoder* self) { ++ uint32_t v_i = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ while (v_i < 144u) { ++ self->private_data.f_code_lengths[v_i] = 8u; ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_code_lengths[v_i] = 9u; ++ v_i += 1u; ++ } ++ while (v_i < 280u) { ++ self->private_data.f_code_lengths[v_i] = 7u; ++ v_i += 1u; ++ } ++ while (v_i < 288u) { ++ self->private_data.f_code_lengths[v_i] = 8u; ++ v_i += 1u; ++ } ++ while (v_i < 320u) { ++ self->private_data.f_code_lengths[v_i] = 5u; ++ v_i += 1u; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ 288u, ++ 257u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ return v_status; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 1u, ++ 288u, ++ 320u, ++ 0u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ return v_status; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func deflate.decoder.init_dynamic_huffman ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_dynamic_huffman( ++ wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_flags = 0; +- uint8_t v_background_color_index = 0; +- uint32_t v_num_palette_entries = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_n_lit = 0; ++ uint32_t v_n_dist = 0; ++ uint32_t v_n_clen = 0; + uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_argb = 0; ++ uint32_t v_b1 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_mask = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_b2 = 0; ++ uint32_t v_n_extra_bits = 0; ++ uint8_t v_rep_symbol = 0; ++ uint32_t v_rep_count = 0; ++ uint32_t v_b3 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37917,172 +39129,215 @@ wuffs_gif__decoder__decode_lsd( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_lsd[0]; ++ uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman; + if (coro_susp_point) { +- v_flags = self->private_data.s_decode_lsd[0].v_flags; +- v_background_color_index = self->private_data.s_decode_lsd[0].v_background_color_index; +- v_num_palette_entries = self->private_data.s_decode_lsd[0].v_num_palette_entries; +- v_i = self->private_data.s_decode_lsd[0].v_i; ++ v_bits = self->private_data.s_init_dynamic_huffman.v_bits; ++ v_n_bits = self->private_data.s_init_dynamic_huffman.v_n_bits; ++ v_n_lit = self->private_data.s_init_dynamic_huffman.v_n_lit; ++ v_n_dist = self->private_data.s_init_dynamic_huffman.v_n_dist; ++ v_n_clen = self->private_data.s_init_dynamic_huffman.v_n_clen; ++ v_i = self->private_data.s_init_dynamic_huffman.v_i; ++ v_mask = self->private_data.s_init_dynamic_huffman.v_mask; ++ v_n_extra_bits = self->private_data.s_init_dynamic_huffman.v_n_extra_bits; ++ v_rep_symbol = self->private_data.s_init_dynamic_huffman.v_rep_symbol; ++ v_rep_count = self->private_data.s_init_dynamic_huffman.v_rep_count; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ while (v_n_bits < 14u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; ++ } ++ v_bits |= (v_b0 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_n_lit = (((v_bits) & 0x1Fu) + 257u); ++ if (v_n_lit > 286u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count); ++ goto exit; ++ } ++ v_bits >>= 5u; ++ v_n_dist = (((v_bits) & 0x1Fu) + 1u); ++ if (v_n_dist > 30u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count); ++ goto exit; ++ } ++ v_bits >>= 5u; ++ v_n_clen = (((v_bits) & 0xFu) + 4u); ++ v_bits >>= 4u; ++ v_n_bits -= 14u; ++ v_i = 0u; ++ while (v_i < v_n_clen) { ++ while (v_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ uint32_t t_1 = *iop_a_src++; ++ v_b1 = t_1; + } ++ v_bits |= (v_b1 << v_n_bits); ++ v_n_bits += 8u; + } +- self->private_impl.f_width = t_0; ++ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u))); ++ v_bits >>= 3u; ++ v_n_bits -= 3u; ++ v_i += 1u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { ++ while (v_i < 19u) { ++ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u; ++ v_i += 1u; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ 19u, ++ 4095u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_i = 0u; ++ while (v_i < (v_n_lit + v_n_dist)) { ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ uint32_t t_2 = *iop_a_src++; ++ v_b2 = t_2; + } ++ v_bits |= (v_b2 << v_n_bits); ++ v_n_bits += 8u; + } +- self->private_impl.f_height = t_1; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((v_table_entry >> 24u) != 128u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- uint8_t t_2 = *iop_a_src++; +- v_flags = t_2; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_table_entry = ((v_table_entry >> 8u) & 255u); ++ if (v_table_entry < 16u) { ++ self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry)); ++ v_i += 1u; ++ continue; + } +- uint8_t t_3 = *iop_a_src++; +- v_background_color_index = t_3; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src++; +- v_i = 0u; +- self->private_impl.f_has_global_palette = ((v_flags & 128u) != 0u); +- if (self->private_impl.f_has_global_palette) { +- v_num_palette_entries = (((uint32_t)(1u)) << (1u + (v_flags & 7u))); +- while (v_i < v_num_palette_entries) { ++ v_n_extra_bits = 0u; ++ v_rep_symbol = 0u; ++ v_rep_count = 0u; ++ if (v_table_entry == 16u) { ++ v_n_extra_bits = 2u; ++ if (v_i <= 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition); ++ goto exit; ++ } ++ v_rep_symbol = ((uint8_t)(self->private_data.f_code_lengths[(v_i - 1u)] & 15u)); ++ v_rep_count = 3u; ++ } else if (v_table_entry == 17u) { ++ v_n_extra_bits = 3u; ++ v_rep_symbol = 0u; ++ v_rep_count = 3u; ++ } else if (v_table_entry == 18u) { ++ v_n_extra_bits = 7u; ++ v_rep_symbol = 0u; ++ v_rep_count = 11u; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ while (v_n_bits < v_n_extra_bits) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 16) { +- t_4 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_argb = t_4; ++ uint32_t t_3 = *iop_a_src++; ++ v_b3 = t_3; + } +- v_argb |= 4278190080u; +- self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ v_bits |= (v_b3 << v_n_bits); ++ v_n_bits += 8u; + } +- if (self->private_impl.f_quirks[2u]) { +- if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) { +- v_j = (4u * ((uint32_t)(v_background_color_index))); +- self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u)); +- } else { +- self->private_impl.f_background_color_u32_argb_premul = 77u; ++ v_rep_count += ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_n_extra_bits)); ++ v_bits >>= v_n_extra_bits; ++ v_n_bits -= v_n_extra_bits; ++ while (v_rep_count > 0u) { ++ if (v_i >= (v_n_lit + v_n_dist)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ goto exit; + } ++ self->private_data.f_code_lengths[v_i] = v_rep_symbol; ++ v_i += 1u; ++ v_rep_count -= 1u; + } + } +- while (v_i < 256u) { +- self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++ if (v_i != (v_n_lit + v_n_dist)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ goto exit; ++ } ++ if (self->private_data.f_code_lengths[256u] == 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code); ++ goto exit; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ v_n_lit, ++ 257u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 1u, ++ v_n_lit, ++ (v_n_lit + v_n_dist), ++ 0u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; + } ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; + + goto ok; + ok: +- self->private_impl.p_decode_lsd[0] = 0; ++ self->private_impl.p_init_dynamic_huffman = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_lsd[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_lsd[0].v_flags = v_flags; +- self->private_data.s_decode_lsd[0].v_background_color_index = v_background_color_index; +- self->private_data.s_decode_lsd[0].v_num_palette_entries = v_num_palette_entries; +- self->private_data.s_decode_lsd[0].v_i = v_i; ++ self->private_impl.p_init_dynamic_huffman = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_init_dynamic_huffman.v_bits = v_bits; ++ self->private_data.s_init_dynamic_huffman.v_n_bits = v_n_bits; ++ self->private_data.s_init_dynamic_huffman.v_n_lit = v_n_lit; ++ self->private_data.s_init_dynamic_huffman.v_n_dist = v_n_dist; ++ self->private_data.s_init_dynamic_huffman.v_n_clen = v_n_clen; ++ self->private_data.s_init_dynamic_huffman.v_i = v_i; ++ self->private_data.s_init_dynamic_huffman.v_mask = v_mask; ++ self->private_data.s_init_dynamic_huffman.v_n_extra_bits = v_n_extra_bits; ++ self->private_data.s_init_dynamic_huffman.v_rep_symbol = v_rep_symbol; ++ self->private_data.s_init_dynamic_huffman.v_rep_count = v_rep_count; + + goto exit; + exit: +@@ -38093,185 +39348,299 @@ wuffs_gif__decoder__decode_lsd( + return status; + } + +-// -------- func gif.decoder.decode_extension ++// -------- func deflate.decoder.init_huff + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_extension( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_label = 0; ++wuffs_deflate__decoder__init_huff( ++ wuffs_deflate__decoder* self, ++ uint32_t a_which, ++ uint32_t a_n_codes0, ++ uint32_t a_n_codes1, ++ uint32_t a_base_symbol) { ++ uint16_t v_counts[16] = {0}; ++ uint32_t v_i = 0; ++ uint32_t v_remaining = 0; ++ uint16_t v_offsets[16] = {0}; ++ uint32_t v_n_symbols = 0; ++ uint32_t v_count = 0; ++ uint16_t v_symbols[320] = {0}; ++ uint32_t v_min_cl = 0; ++ uint32_t v_max_cl = 0; ++ uint32_t v_initial_high_bits = 0; ++ uint32_t v_prev_cl = 0; ++ uint32_t v_prev_redirect_key = 0; ++ uint32_t v_top = 0; ++ uint32_t v_next_top = 0; ++ uint32_t v_code = 0; ++ uint32_t v_key = 0; ++ uint32_t v_value = 0; ++ uint32_t v_cl = 0; ++ uint32_t v_redirect_key = 0; ++ uint32_t v_j = 0; ++ uint32_t v_reversed_key = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_high_bits = 0; ++ uint32_t v_delta = 0; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_i = a_n_codes0; ++ while (v_i < a_n_codes1) { ++ if (v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_i += 1u; + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_extension[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_label = t_0; ++ if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) { ++ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ } ++ v_remaining = 1u; ++ v_i = 1u; ++ while (v_i <= 15u) { ++ if (v_remaining > 1073741824u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- if (v_label == 249u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_gc(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if (v_label == 255u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_ae(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ v_remaining <<= 1u; ++ if (v_remaining < ((uint32_t)(v_counts[v_i]))) { ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed); ++ } ++ v_remaining -= ((uint32_t)(v_counts[v_i])); ++ v_i += 1u; ++ } ++ if (v_remaining != 0u) { ++ if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) { ++ v_i = 0u; ++ while (v_i <= 29u) { ++ if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) { ++ self->private_impl.f_n_huffs_bits[1u] = 1u; ++ self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u); ++ self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u); ++ return wuffs_base__make_status(NULL); ++ } ++ v_i += 1u; + } +- status = wuffs_base__make_status(NULL); +- goto ok; + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed); ++ } ++ v_i = 1u; ++ while (v_i <= 15u) { ++ v_offsets[v_i] = ((uint16_t)(v_n_symbols)); ++ v_count = ((uint32_t)(v_counts[v_i])); ++ if (v_n_symbols > (320u - v_count)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ v_n_symbols = (v_n_symbols + v_count); ++ v_i += 1u; ++ } ++ if (v_n_symbols > 288u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_i = a_n_codes0; ++ while (v_i < a_n_codes1) { ++ if (v_i < a_n_codes0) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- if (status.repr) { +- goto suspend; ++ if (self->private_data.f_code_lengths[v_i] != 0u) { ++ if (v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_symbols[v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))]] = ((uint16_t)((v_i - a_n_codes0))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } +- +- ok: +- self->private_impl.p_decode_extension[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_extension[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_i += 1u; + } +- +- return status; +-} +- +-// -------- func gif.decoder.skip_blocks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_blocks( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_block_size = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_min_cl = 1u; ++ while (true) { ++ if (v_counts[v_min_cl] != 0u) { ++ break; ++ } ++ if (v_min_cl >= 9u) { ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length); ++ } ++ v_min_cl += 1u; + } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_blocks[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_max_cl = 15u; ++ while (true) { ++ if (v_counts[v_max_cl] != 0u) { ++ break; ++ } ++ if (v_max_cl <= 1u) { ++ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ } ++ v_max_cl -= 1u; ++ } ++ if (v_max_cl <= 9u) { ++ self->private_impl.f_n_huffs_bits[a_which] = v_max_cl; ++ } else { ++ self->private_impl.f_n_huffs_bits[a_which] = 9u; ++ } ++ v_i = 0u; ++ if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_initial_high_bits = 512u; ++ if (v_max_cl < 9u) { ++ v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl); ++ } ++ v_prev_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u)))); ++ v_prev_redirect_key = 4294967295u; ++ v_top = 0u; ++ v_next_top = 512u; ++ v_code = 0u; ++ v_key = 0u; ++ v_value = 0u; ++ while (true) { ++ if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u)))); ++ if (v_cl > v_prev_cl) { ++ v_code <<= (v_cl - v_prev_cl); ++ if (v_code >= 32768u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ } ++ v_prev_cl = v_cl; ++ v_key = v_code; ++ if (v_cl > 9u) { ++ v_cl -= 9u; ++ v_redirect_key = ((v_key >> v_cl) & 511u); ++ v_key = ((v_key) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_cl)); ++ if (v_prev_redirect_key != v_redirect_key) { ++ v_prev_redirect_key = v_redirect_key; ++ v_remaining = (((uint32_t)(1u)) << v_cl); ++ v_j = v_prev_cl; ++ while (v_j <= 15u) { ++ if (v_remaining <= ((uint32_t)(v_counts[v_j]))) { ++ break; ++ } ++ v_remaining -= ((uint32_t)(v_counts[v_j])); ++ if (v_remaining > 1073741824u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_remaining <<= 1u; ++ v_j += 1u; + } +- uint8_t t_0 = *iop_a_src++; +- v_block_size = t_0; ++ if ((v_j <= 9u) || (15u < v_j)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_j -= 9u; ++ v_initial_high_bits = (((uint32_t)(1u)) << v_j); ++ v_top = v_next_top; ++ if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_next_top = (v_top + (((uint32_t)(1u)) << v_j)); ++ v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u)); ++ self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u)); + } +- if (v_block_size == 0u) { +- status = wuffs_base__make_status(NULL); +- goto ok; ++ } ++ if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_counts[v_prev_cl] -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u)); ++ v_reversed_key >>= (9u - v_cl); ++ v_symbol = ((uint32_t)(v_symbols[v_i])); ++ if (v_symbol == 256u) { ++ v_value = (536870912u | v_cl); ++ } else if ((v_symbol < 256u) && (a_which == 0u)) { ++ v_value = (2147483648u | (v_symbol << 8u) | v_cl); ++ } else if (v_symbol >= a_base_symbol) { ++ v_symbol -= a_base_symbol; ++ if (a_which == 0u) { ++ v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); ++ } else { ++ v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); + } +- self->private_data.s_skip_blocks[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_skip_blocks[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_blocks[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ } else { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_high_bits = v_initial_high_bits; ++ v_delta = (((uint32_t)(1u)) << v_cl); ++ while (v_high_bits >= v_delta) { ++ v_high_bits -= v_delta; ++ if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- iop_a_src += self->private_data.s_skip_blocks[0].scratch; ++ self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value; ++ } ++ v_i += 1u; ++ if (v_i >= v_n_symbols) { ++ break; ++ } ++ v_code += 1u; ++ if (v_code >= 32768u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- +- ok: +- self->private_impl.p_skip_blocks[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_status(NULL); + } + +-// -------- func gif.decoder.decode_ae ++// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2 ++// -------- func deflate.decoder.decode_huffman_bmi2 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2") + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_ae( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_bmi2( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_block_size = 0; +- bool v_is_animexts = false; +- bool v_is_netscape = false; +- bool v_is_iccp = false; +- bool v_is_xmp = false; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint64_t v_lmask = 0; ++ uint64_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38283,214 +39652,206 @@ wuffs_gif__decoder__decode_ae( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_ae[0]; +- if (coro_susp_point) { +- v_block_size = self->private_data.s_decode_ae[0].v_block_size; +- v_is_animexts = self->private_data.s_decode_ae[0].v_is_animexts; +- v_is_netscape = self->private_data.s_decode_ae[0].v_is_netscape; +- v_is_iccp = self->private_data.s_decode_ae[0].v_is_iccp; +- v_is_xmp = self->private_data.s_decode_ae[0].v_is_xmp; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- do { +- if (self->private_impl.f_metadata_fourcc != 0u) { +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_block_size = t_0; +- } +- if (v_block_size == 0u) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- if (v_block_size != 11u) { +- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; ++ v_bits = ((uint64_t)(self->private_impl.f_bits)); ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { ++ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); ++ iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; + break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- v_is_animexts = true; +- v_is_netscape = true; +- v_is_iccp = true; +- v_is_xmp = true; +- v_block_size = 0u; +- while (v_block_size < 11u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_is_animexts = (v_is_animexts && (v_c == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size])); +- v_is_netscape = (v_is_netscape && (v_c == WUFFS_GIF__NETSCAPE2DOT0[v_block_size])); +- v_is_iccp = (v_is_iccp && (v_c == WUFFS_GIF__ICCRGBG1012[v_block_size])); +- v_is_xmp = (v_is_xmp && (v_c == WUFFS_GIF__XMPDATAXMP[v_block_size])); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_block_size += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- if (v_is_animexts || v_is_netscape) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_block_size = t_2; +- } +- if (v_block_size != 3u) { +- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; + } +- if (v_c != 1u) { +- self->private_data.s_decode_ae[0].scratch = 2u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; +- break; ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_ae[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ae[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_num_animation_loops_value = t_4; ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; + } +- self->private_impl.f_seen_num_animation_loops_value = true; +- if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) { +- self->private_impl.f_num_animation_loops_value += 1u; ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; + } +- } else if (self->private_impl.f_call_sequence >= 32u) { +- } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { +- self->private_impl.f_metadata_fourcc = 1229144912u; +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { +- self->private_impl.f_metadata_fourcc = 1481461792u; +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; ++ } ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else if ((v_dist_minus_1 + 1u) == 1u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); + } + } while (0); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ } ++ if (v_n_bits > 63u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ goto exit; + } +- +- ok: +- self->private_impl.p_decode_ae[0] = 0; ++ } ++ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_ae[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_ae[0].v_block_size = v_block_size; +- self->private_data.s_decode_ae[0].v_is_animexts = v_is_animexts; +- self->private_data.s_decode_ae[0].v_is_netscape = v_is_netscape; +- self->private_data.s_decode_ae[0].v_is_iccp = v_is_iccp; +- self->private_data.s_decode_ae[0].v_is_xmp = v_is_xmp; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2 + +-// -------- func gif.decoder.decode_gc ++// -------- func deflate.decoder.decode_huffman_fast32 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_gc( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_fast32( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_flags = 0; +- uint16_t v_gc_duration_centiseconds = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_lmask = 0; ++ uint32_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38502,106 +39863,205 @@ wuffs_gif__decoder__decode_gc( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_gc[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { + } +- if (v_c != 4u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { ++ } ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { + } +- uint8_t t_1 = *iop_a_src++; +- v_flags = t_1; ++ v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } else { + } +- self->private_impl.f_gc_has_transparent_index = ((v_flags & 1u) != 0u); +- v_flags = ((v_flags >> 2u) & 7u); +- if (v_flags == 2u) { +- self->private_impl.f_gc_disposal = 1u; +- } else if ((v_flags == 3u) || (v_flags == 4u)) { +- self->private_impl.f_gc_disposal = 2u; ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } else { +- self->private_impl.f_gc_disposal = 0u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint16_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } else { +- self->private_data.s_decode_gc[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_gc[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 8) { +- t_2 = ((uint16_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } + } +- v_gc_duration_centiseconds = t_2; ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } else { + } +- self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- uint8_t t_3 = *iop_a_src++; +- self->private_impl.f_gc_transparent_index = t_3; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_n_bits < v_table_entry_n_bits) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; ++ } ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; ++ } ++ } ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } ++ } while (0); ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); + goto exit; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_gc[0] = 0; ++ } ++ self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u)); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_gc[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38609,15 +40069,52 @@ wuffs_gif__decoder__decode_gc( + return status; + } + +-// -------- func gif.decoder.decode_id_part0 ++// -------- func deflate.decoder.decode_huffman_fast64 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part0( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_fast64( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint64_t v_lmask = 0; ++ uint64_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38629,147 +40126,160 @@ wuffs_gif__decoder__decode_id_part0( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part0[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ v_bits = ((uint64_t)(self->private_impl.f_bits)); ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { ++ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); ++ iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- self->private_impl.f_frame_rect_x0 = t_0; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_frame_rect_y0 = t_1; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- self->private_impl.f_frame_rect_x1 = t_2; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; ++ } ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; + } + } +- self->private_impl.f_frame_rect_y1 = t_3; +- } +- self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; +- if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) && ! self->private_impl.f_quirks[4u]) { +- self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); +- self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else if ((v_dist_minus_1 + 1u) == 1u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } ++ } while (0); ++ } ++ if (v_n_bits > 63u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ goto exit; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_id_part0[0] = 0; ++ } ++ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_id_part0[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38777,25 +40287,49 @@ wuffs_gif__decoder__decode_id_part0( + return status; + } + +-// -------- func gif.decoder.decode_id_part1 ++// -------- func deflate.decoder.decode_huffman_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend) { ++wuffs_deflate__decoder__decode_huffman_slow( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_flags = 0; +- uint8_t v_which_palette = 0; +- uint32_t v_num_palette_entries = 0; +- uint32_t v_i = 0; +- uint32_t v_argb = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint8_t v_lw = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_lmask = 0; ++ uint32_t v_dmask = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_b1 = 0; ++ uint32_t v_length = 0; ++ uint32_t v_b2 = 0; ++ uint32_t v_b3 = 0; ++ uint32_t v_b4 = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_b5 = 0; ++ uint32_t v_n_copied = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38807,139 +40341,275 @@ wuffs_gif__decoder__decode_id_part1( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part1[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow; + if (coro_susp_point) { +- v_which_palette = self->private_data.s_decode_id_part1[0].v_which_palette; +- v_num_palette_entries = self->private_data.s_decode_id_part1[0].v_num_palette_entries; +- v_i = self->private_data.s_decode_id_part1[0].v_i; ++ v_bits = self->private_data.s_decode_huffman_slow.v_bits; ++ v_n_bits = self->private_data.s_decode_huffman_slow.v_n_bits; ++ v_table_entry_n_bits = self->private_data.s_decode_huffman_slow.v_table_entry_n_bits; ++ v_lmask = self->private_data.s_decode_huffman_slow.v_lmask; ++ v_dmask = self->private_data.s_decode_huffman_slow.v_dmask; ++ v_redir_top = self->private_data.s_decode_huffman_slow.v_redir_top; ++ v_redir_mask = self->private_data.s_decode_huffman_slow.v_redir_mask; ++ v_length = self->private_data.s_decode_huffman_slow.v_length; ++ v_dist_minus_1 = self->private_data.s_decode_huffman_slow.v_dist_minus_1; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_flags = t_0; +- } +- if ((v_flags & 64u) != 0u) { +- self->private_impl.f_interlace = 4u; +- } else { +- self->private_impl.f_interlace = 0u; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; + } +- v_which_palette = 1u; +- if ((v_flags & 128u) != 0u) { +- v_num_palette_entries = (((uint32_t)(1u)) << (1u + (v_flags & 7u))); +- v_i = 0u; +- while (v_i < v_num_palette_entries) { ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ label__loop__continue:; ++ while ( ! (self->private_impl.p_decode_huffman_slow != 0)) { ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_id_part1[0].scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; ++ } ++ v_bits |= (v_b0 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ if ((v_table_entry >> 31u) != 0u) { ++ self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch)); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part1[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 16) { +- t_1 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint32_t t_1 = *iop_a_src++; ++ v_b1 = t_1; + } +- v_argb = t_1; ++ v_bits |= (v_b1 << v_n_bits); ++ v_n_bits += 8u; + } +- v_argb |= 4278190080u; +- self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ if ((v_table_entry >> 31u) != 0u) { ++ self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch)); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- while (v_i < 256u) { +- self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ while (v_n_bits < v_table_entry_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_2 = *iop_a_src++; ++ v_b2 = t_2; ++ } ++ v_bits |= (v_b2 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; + } +- } else if (self->private_impl.f_quirks[6u] && ! self->private_impl.f_has_global_palette) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_palette); +- goto exit; +- } else if (self->private_impl.f_gc_has_transparent_index) { +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1u], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0u], 1024)); +- } else { +- v_which_palette = 0u; +- } +- if (self->private_impl.f_gc_has_transparent_index) { +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(2198077448u), +- wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_3 = *iop_a_src++; ++ v_b3 = t_3; ++ } ++ v_bits |= (v_b3 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_4 = *iop_a_src++; ++ v_b4 = t_4; ++ } ++ v_bits |= (v_b4 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } +- goto ok; +- } +- if (self->private_impl.f_ignored_but_affects_benchmarks) { +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ while (v_n_bits < v_table_entry_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_5 = *iop_a_src++; ++ v_b5 = t_5; ++ } ++ v_bits |= (v_b5 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ while (true) { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_hdist < v_length) { ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ } ++ v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))))); ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_n_copied < v_hlen) { ++ v_length -= v_n_copied; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ continue; ++ } ++ v_length -= v_hlen; ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ } ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ if (v_length <= v_n_copied) { ++ goto label__loop__continue; ++ } ++ v_length -= v_n_copied; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); + } +- uint8_t t_2 = *iop_a_src++; +- v_lw = t_2; + } +- if (v_lw > 8u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)((1u + v_lw))); +- self->private_impl.f_ignored_but_affects_benchmarks = true; + + ok: +- self->private_impl.p_decode_id_part1[0] = 0; ++ self->private_impl.p_decode_huffman_slow = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_id_part1[0].v_which_palette = v_which_palette; +- self->private_data.s_decode_id_part1[0].v_num_palette_entries = v_num_palette_entries; +- self->private_data.s_decode_id_part1[0].v_i = v_i; ++ self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_slow.v_bits = v_bits; ++ self->private_data.s_decode_huffman_slow.v_n_bits = v_n_bits; ++ self->private_data.s_decode_huffman_slow.v_table_entry_n_bits = v_table_entry_n_bits; ++ self->private_data.s_decode_huffman_slow.v_lmask = v_lmask; ++ self->private_data.s_decode_huffman_slow.v_dmask = v_dmask; ++ self->private_data.s_decode_huffman_slow.v_redir_top = v_redir_top; ++ self->private_data.s_decode_huffman_slow.v_redir_mask = v_redir_mask; ++ self->private_data.s_decode_huffman_slow.v_length = v_length; ++ self->private_data.s_decode_huffman_slow.v_dist_minus_1 = v_dist_minus_1; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38947,782 +40617,538 @@ wuffs_gif__decoder__decode_id_part1( + return status; + } + +-// -------- func gif.decoder.decode_id_part2 ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code"; ++const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label"; ++const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size"; ++const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control"; ++const char wuffs_gif__error__bad_header[] = "#gif: bad header"; ++const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width"; ++const char wuffs_gif__error__bad_palette[] = "#gif: bad palette"; ++const char wuffs_gif__error__truncated_input[] = "#gif: truncated input"; ++const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 4294967295u, 1u, 2u, 4u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 2u, 4u, 8u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 4u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 65u, 78u, 73u, 77u, 69u, 88u, 84u, 83u, ++ 49u, 46u, 48u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 78u, 69u, 84u, 83u, 67u, 65u, 80u, 69u, ++ 50u, 46u, 48u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 73u, 67u, 67u, 82u, 71u, 66u, 71u, 49u, ++ 48u, 49u, 50u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 88u, 77u, 80u, 32u, 68u, 97u, 116u, 97u, ++ 88u, 77u, 80u, ++}; ++ ++#define WUFFS_GIF__QUIRKS_BASE 1041635328u ++ ++#define WUFFS_GIF__QUIRKS_COUNT 7u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part2( ++wuffs_gif__decoder__do_decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_tell_me_more( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__skip_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint64_t v_block_size = 0; +- bool v_need_block_size = false; +- uint32_t v_n_copied = 0; +- uint64_t v_n_compressed = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_mark = 0; +- wuffs_base__status v_copy_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__reset_gc( ++ wuffs_gif__decoder* self); + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part2[0]; +- if (coro_susp_point) { +- v_block_size = self->private_data.s_decode_id_part2[0].v_block_size; +- v_need_block_size = self->private_data.s_decode_id_part2[0].v_need_block_size; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_up_to_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- wuffs_gif__decoder__lzw_init(self); +- v_need_block_size = true; +- label__outer__continue:; +- while (true) { +- if (v_need_block_size) { +- v_need_block_size = false; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t t_0 = *iop_a_src++; +- v_block_size = t_0; +- } +- } +- if (v_block_size == 0u) { +- break; +- } +- while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) { +- self->private_impl.f_compressed_ri = 0u; +- self->private_impl.f_compressed_wi = 0u; +- } +- while (self->private_impl.f_compressed_wi <= 3841u) { +- v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src))); +- if (v_n_compressed <= 0u) { +- break; +- } +- v_n_copied = wuffs_base__io_reader__limited_copy_u32_to_slice( +- &iop_a_src, io2_a_src,((uint32_t)(v_n_compressed)), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); +- wuffs_base__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); +- if (v_block_size > 0u) { +- break; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- v_need_block_size = true; +- break; +- } +- v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- iop_a_src += 1u; +- } +- while (true) { +- if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) { +- status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, +- self->private_impl.f_compressed_ri, +- self->private_impl.f_compressed_wi), +- 0u); +- v_mark = ((uint64_t)(iop_v_r - io0_v_r)); +- u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr)); +- wuffs_gif__decoder__lzw_read_from(self, v_r); +- iop_v_r = u_r.data.ptr + u_r.meta.ri; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r)))); +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) { +- v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_lzw_output, +- self->private_impl.f_lzw_output_ri, +- self->private_impl.f_lzw_output_wi)); +- if (wuffs_base__status__is_error(&v_copy_status)) { +- status = v_copy_status; +- goto exit; +- } +- self->private_impl.f_lzw_output_ri = 0u; +- self->private_impl.f_lzw_output_wi = 0u; +- } +- if (self->private_impl.f_lzw_read_from_return_value == 0u) { +- self->private_impl.f_ignored_but_affects_benchmarks = false; +- if (v_need_block_size || (v_block_size > 0u)) { +- self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_id_part2[0].scratch; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- goto label__outer__break; +- } else if (self->private_impl.f_lzw_read_from_return_value == 1u) { +- continue; +- } else if (self->private_impl.f_lzw_read_from_return_value == 2u) { +- goto label__outer__continue; +- } else if (self->private_impl.f_quirks[3u] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0u)) { +- if (v_need_block_size || (v_block_size > 0u)) { +- self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_id_part2[0].scratch; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- goto label__outer__break; +- } else if (self->private_impl.f_lzw_read_from_return_value == 3u) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } else if (self->private_impl.f_lzw_read_from_return_value == 4u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- } +- label__outer__break:; +- self->private_impl.f_compressed_ri = 0u; +- self->private_impl.f_compressed_wi = 0u; +- if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) { +- status = wuffs_base__make_status(wuffs_base__error__not_enough_data); +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_header( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- ok: +- self->private_impl.p_decode_id_part2[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_lsd( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_id_part2[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_id_part2[0].v_block_size = v_block_size; +- self->private_data.s_decode_id_part2[0].v_need_block_size = v_need_block_size; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_extension( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__skip_blocks( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_ae( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +-// -------- func gif.decoder.copy_to_image_buffer ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_gc( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part0( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part2( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_gif__decoder__copy_to_image_buffer( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_pb, +- wuffs_base__slice_u8 a_src) { +- wuffs_base__slice_u8 v_dst = {0}; +- wuffs_base__slice_u8 v_src = {0}; +- uint64_t v_width_in_bytes = 0; +- uint64_t v_n = 0; +- uint64_t v_src_ri = 0; +- wuffs_base__pixel_format v_pixfmt = {0}; +- uint32_t v_bytes_per_pixel = 0; +- uint32_t v_bits_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint32_t v_replicate_y0 = 0; +- uint32_t v_replicate_y1 = 0; +- wuffs_base__slice_u8 v_replicate_dst = {0}; +- wuffs_base__slice_u8 v_replicate_src = {0}; ++ wuffs_base__slice_u8 a_src); + +- v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb); +- v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt); +- if ((v_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_init( ++ wuffs_gif__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_read_from( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_gif__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_gif__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_gif__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_gif__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_gif__decoder__initialize( ++ wuffs_gif__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- v_bytes_per_pixel = (v_bits_per_pixel >> 3u); +- v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u); +- while (v_src_ri < ((uint64_t)(a_src.len))) { +- v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri); +- if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) { +- if (self->private_impl.f_quirks[3u]) { +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__too_much_data); +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u); +- } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel))); +- if (v_i < ((uint64_t)(v_dst.len))) { +- v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel))); +- if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) { +- v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j); +- } else { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); +- } +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src); +- wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u)); +- } +- if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- if (self->private_impl.f_interlace == 0u) { +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u); +- continue; +- } +- if ((self->private_impl.f_num_decoded_frames_value == 0u) && ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) { +- v_replicate_src = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u); +- v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace]))); +- v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1); +- while (v_replicate_y0 < v_replicate_y1) { +- v_replicate_dst = wuffs_base__table_u8__row_u32(v_tab, v_replicate_y0); +- wuffs_base__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src); +- v_replicate_y0 += 1u; +- } +- self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1); +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); +- while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +-#if defined(__GNUC__) ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) + #pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #endif +- self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); +- } +- continue; +- } +- if (((uint64_t)(a_src.len)) == v_src_ri) { +- break; +- } else if (((uint64_t)(a_src.len)) < v_src_ri) { +- return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x))); +- v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri)); +- wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); +- while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace -= 1u; +-#if defined(__GNUC__) ++#if !defined(__clang__) && defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); +- } +- continue; +- } +- if (v_src_ri != ((uint64_t)(a_src.len))) { +- return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- break; + } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); + } + +-// -------- func gif.decoder.lzw_init ++wuffs_gif__decoder* ++wuffs_gif__decoder__alloc(void) { ++ wuffs_gif__decoder* x = ++ (wuffs_gif__decoder*)(calloc(1, sizeof(wuffs_gif__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_gif__decoder__initialize( ++ x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_init( +- wuffs_gif__decoder* self) { +- uint32_t v_i = 0; ++size_t ++sizeof__wuffs_gif__decoder(void) { ++ return sizeof(wuffs_gif__decoder); ++} + +- self->private_impl.f_lzw_literal_width = 8u; +- if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) { +- self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u); ++// ---------------- Function Implementations ++ ++// -------- func gif.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__get_quirk( ++ const wuffs_gif__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; + } +- self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width); +- self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u); +- self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code; +- self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code; +- self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u); +- self->private_impl.f_lzw_bits = 0u; +- self->private_impl.f_lzw_n_bits = 0u; +- self->private_impl.f_lzw_output_ri = 0u; +- self->private_impl.f_lzw_output_wi = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_lzw_clear_code) { +- self->private_data.f_lzw_lm1s[v_i] = 0u; +- self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i)); +- v_i += 1u; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } +- return wuffs_base__make_empty_struct(); ++ ++ uint32_t v_key = 0; ++ ++ if (a_key >= 1041635328u) { ++ v_key = (a_key - 1041635328u); ++ if (v_key < 7u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; + } + +-// -------- func gif.decoder.lzw_read_from ++// -------- func gif.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_read_from( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__set_quirk( + wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_clear_code = 0; +- uint32_t v_end_code = 0; +- uint32_t v_save_code = 0; +- uint32_t v_prev_code = 0; +- uint32_t v_width = 0; +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_output_wi = 0; +- uint32_t v_code = 0; +- uint32_t v_c = 0; +- uint32_t v_o = 0; +- uint32_t v_steps = 0; +- uint8_t v_first_byte = 0; +- uint16_t v_lm1_b = 0; +- uint16_t v_lm1_a = 0; ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 1041635328u)) { ++ a_key -= 1041635328u; ++ if (a_key < 7u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} + +- v_clear_code = self->private_impl.f_lzw_clear_code; +- v_end_code = self->private_impl.f_lzw_end_code; +- v_save_code = self->private_impl.f_lzw_save_code; +- v_prev_code = self->private_impl.f_lzw_prev_code; +- v_width = self->private_impl.f_lzw_width; +- v_bits = self->private_impl.f_lzw_bits; +- v_n_bits = self->private_impl.f_lzw_n_bits; +- v_output_wi = self->private_impl.f_lzw_output_wi; +- while (true) { +- if (v_n_bits < v_width) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_lzw_read_from_return_value = 3u; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits >= v_width) { +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_lzw_read_from_return_value = 3u; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits < v_width) { +- self->private_impl.f_lzw_read_from_return_value = 5u; +- break; +- } +- } +- } +- } +- v_code = ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_width)); +- v_bits >>= v_width; +- v_n_bits -= v_width; +- if (v_code < v_clear_code) { +- self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code)); +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- if (v_save_code <= 4095u) { +- v_lm1_a = (((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a; +- if ((v_lm1_a % 8u) != 0u) { +- self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; +- memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); +- self->private_data.f_lzw_suffixes[v_save_code][(v_lm1_a % 8u)] = ((uint8_t)(v_code)); +- } else { +- self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else if (v_code <= v_end_code) { +- if (v_code == v_end_code) { +- self->private_impl.f_lzw_read_from_return_value = 0u; +- break; +- } +- v_save_code = v_end_code; +- v_prev_code = v_end_code; +- v_width = (self->private_impl.f_lzw_literal_width + 1u); +- } else if (v_code <= v_save_code) { +- v_c = v_code; +- if (v_code == v_save_code) { +- v_c = v_prev_code; +- } +- v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u); +- v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u); +- v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u); +- while (true) { +- memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u); +- if (v_steps <= 0u) { +- break; +- } +- v_steps -= 1u; +- v_o = (((uint32_t)(v_o - 8u)) & 8191u); +- v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c])); +- } +- v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u]; +- if (v_code == v_save_code) { +- self->private_data.f_lzw_output[v_output_wi] = v_first_byte; +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- } +- if (v_save_code <= 4095u) { +- v_lm1_b = (((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b; +- if ((v_lm1_b % 8u) != 0u) { +- self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; +- memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); +- self->private_data.f_lzw_suffixes[v_save_code][(v_lm1_b % 8u)] = v_first_byte; +- } else { +- self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else { +- self->private_impl.f_lzw_read_from_return_value = 4u; +- break; +- } +- if (v_output_wi > 4095u) { +- self->private_impl.f_lzw_read_from_return_value = 1u; +- break; +- } ++// -------- func gif.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (self->private_impl.f_lzw_read_from_return_value != 2u) { +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 5u; +- break; +- } +- } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- self->private_impl.f_lzw_save_code = v_save_code; +- self->private_impl.f_lzw_prev_code = v_prev_code; +- self->private_impl.f_lzw_width = v_width; +- self->private_impl.f_lzw_bits = v_bits; +- self->private_impl.f_lzw_n_bits = v_n_bits; +- self->private_impl.f_lzw_output_wi = v_output_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- return wuffs_base__make_empty_struct(); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// ---------------- Status Codes Implementations ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } + +-const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum"; +-const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method"; +-const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags"; +-const char wuffs_gzip__error__bad_header[] = "#gzip: bad header"; +-const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input"; ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } + +-// ---------------- Private Consts ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +-// ---------------- Private Initializer Prototypes ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// ---------------- Private Function Prototypes ++// -------- func gif.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gzip__decoder__do_transform_io( +- wuffs_gzip__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_gzip__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_gzip__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_gzip__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len), +-}; ++wuffs_gif__decoder__do_decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ bool v_ffio = false; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_gzip__decoder__initialize( +- wuffs_gzip__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if ( ! self->private_impl.f_seen_header) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__decode_header(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_lsd(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_header = true; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); ++ if (status.repr) { ++ goto suspend; + } +- } +- +- { +- wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( +- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ v_ffio = ! self->private_impl.f_gc_has_transparent_index; ++ if ( ! self->private_impl.f_quirks[2u]) { ++ v_ffio = (v_ffio && ++ (self->private_impl.f_frame_rect_x0 == 0u) && ++ (self->private_impl.f_frame_rect_y0 == 0u) && ++ (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) && ++ (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height)); ++ } else if (v_ffio) { ++ self->private_impl.f_black_color_u32_argb_premul = 4278190080u; + } +- } +- { +- wuffs_base__status z = wuffs_deflate__decoder__initialize( +- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ if (self->private_impl.f_background_color_u32_argb_premul == 77u) { ++ self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ 2198077448u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ v_ffio); ++ } ++ if (self->private_impl.f_call_sequence == 0u) { ++ self->private_impl.f_call_sequence = 32u; + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); +-} + +-wuffs_gzip__decoder* +-wuffs_gzip__decoder__alloc(void) { +- wuffs_gzip__decoder* x = +- (wuffs_gzip__decoder*)(calloc(sizeof(wuffs_gzip__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_gzip__decoder__initialize( +- x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_gzip__decoder(void) { +- return sizeof(wuffs_gzip__decoder); +-} + +-// ---------------- Function Implementations +- +-// -------- func gzip.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__get_quirk( +- const wuffs_gzip__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; +- } +- return 0u; ++ goto exit; ++ exit: ++ return status; + } + +-// -------- func gzip.decoder.set_quirk ++// -------- func gif.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gzip__decoder__set_quirk( +- wuffs_gzip__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_gif__decoder__set_report_metadata( ++ wuffs_gif__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func gzip.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__history_retain_length( +- const wuffs_gzip__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; +-} +- +-// -------- func gzip.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_gzip__decoder__workbuf_len( +- const wuffs_gzip__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (a_fourcc == 1229144912u) { ++ self->private_impl.f_report_metadata_iccp = a_report; ++ } else if (a_fourcc == 1481461792u) { ++ self->private_impl.f_report_metadata_xmp = a_report; + } +- +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gzip.decoder.transform_io ++// -------- func gif.decoder.tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gzip__decoder__transform_io( +- wuffs_gzip__decoder* self, ++wuffs_gif__decoder__tell_me_more( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -39737,7 +41163,7 @@ wuffs_gzip__decoder__transform_io( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -39746,17 +41172,17 @@ wuffs_gzip__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gzip__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); + goto exit; + } + status = v_status; +@@ -39764,14 +41190,14 @@ wuffs_gzip__decoder__transform_io( + } + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_tell_me_more = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: +@@ -39781,40 +41207,19 @@ wuffs_gzip__decoder__transform_io( + return status; + } + +-// -------- func gzip.decoder.do_transform_io ++// -------- func gif.decoder.do_tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gzip__decoder__do_transform_io( +- wuffs_gzip__decoder* self, ++wuffs_gif__decoder__do_tell_me_more( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_flags = 0; +- uint16_t v_xlen = 0; +- uint64_t v_mark = 0; +- uint32_t v_checksum_got = 0; +- uint32_t v_decoded_length_got = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_checksum_want = 0; +- uint32_t v_decoded_length_want = 0; ++ uint64_t v_chunk_length = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -39826,269 +41231,95 @@ wuffs_gzip__decoder__do_transform_io( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_flags = self->private_data.s_do_transform_io[0].v_flags; +- v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; +- v_decoded_length_got = self->private_data.s_do_transform_io[0].v_decoded_length_got; +- v_checksum_want = self->private_data.s_do_transform_io[0].v_checksum_want; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 31u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 139u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; +- } +- if (v_c != 8u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method); ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_flags = t_3; +- } +- self->private_data.s_do_transform_io[0].scratch = 6u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- if ((v_flags & 4u) != 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint16_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint16_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- v_xlen = t_4; +- } +- self->private_data.s_do_transform_io[0].scratch = ((uint32_t)(v_xlen)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- } +- if ((v_flags & 8u) != 0u) { ++ while (true) { + while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 2u, ++ 0u, ++ self->private_impl.f_metadata_io_position, ++ 0u, ++ 0u); + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (v_c == 0u) { +- break; ++ status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; + } +- } +- } +- if ((v_flags & 16u) != 0u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 0u, ++ 0u, ++ 0u, ++ 0u, ++ 0u); + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c == 0u) { +- break; +- } +- } +- } +- if ((v_flags & 2u) != 0u) { +- self->private_data.s_do_transform_io[0].scratch = 2u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- } +- if ((v_flags & 224u) != 0u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags); +- goto exit; +- } +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); +- v_status = t_7; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; + } ++ break; + } +- if ( ! self->private_impl.f_ignore_checksum) { +- v_checksum_got = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- v_decoded_length_got += ((uint32_t)(wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))))); +- } +- if (wuffs_base__status__is_ok(&v_status)) { ++ v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ if (v_chunk_length <= 0u) { ++ iop_a_src += 1u; + break; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint32_t t_8; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ if (self->private_impl.f_metadata_fourcc == 1481461792u) { ++ v_chunk_length += 1u; + } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; +- if (num_bits_8 == 24) { +- t_8 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_8 += 8u; +- *scratch |= ((uint64_t)(num_bits_8)) << 56; +- } ++ iop_a_src += 1u; + } +- v_checksum_want = t_8; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- uint32_t t_9; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; +- if (num_bits_9 == 24) { +- t_9 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_9 += 8u; +- *scratch |= ((uint64_t)(num_bits_9)) << 56; +- } ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length); ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 3u, ++ self->private_impl.f_metadata_fourcc, ++ 0u, ++ wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), ++ self->private_impl.f_metadata_io_position); + } +- v_decoded_length_want = t_9; ++ status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + } +- if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_got != v_checksum_want) || (v_decoded_length_got != v_decoded_length_want))) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum); +- goto exit; ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 3u, ++ self->private_impl.f_metadata_fourcc, ++ 0u, ++ self->private_impl.f_metadata_io_position, ++ self->private_impl.f_metadata_io_position); + } ++ self->private_impl.f_call_sequence &= 239u; ++ self->private_impl.f_metadata_fourcc = 0u; ++ self->private_impl.f_metadata_io_position = 0u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + + ok: +- self->private_impl.p_do_transform_io[0] = 0; ++ self->private_impl.p_do_tell_me_more = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_flags = v_flags; +- self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; +- self->private_data.s_do_transform_io[0].v_decoded_length_got = v_decoded_length_got; +- self->private_data.s_do_transform_io[0].v_checksum_want = v_checksum_want; ++ self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -40096,2260 +41327,1143 @@ wuffs_gzip__decoder__do_transform_io( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) ++// -------- func gif.decoder.num_animation_loops + +-// ---------------- Status Codes Implementations ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_gif__decoder__num_animation_loops( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker"; +-const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker"; +-const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker"; +-const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker"; +-const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker"; +-const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header"; +-const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker"; +-const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table"; +-const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table"; +-const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input"; +-const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding"; +-const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model"; +-const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling"; +-const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding"; +-const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height"; +-const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding"; +-const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker"; +-const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)"; +-const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)"; +-const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision"; +-const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count"; +-const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state"; ++ if (self->private_impl.f_seen_num_animation_loops_value) { ++ return self->private_impl.f_num_animation_loops_value; ++ } ++ if (self->private_impl.f_num_decoded_frame_configs_value > 1u) { ++ return 1u; ++ } ++ return 0u; ++} + +-// ---------------- Private Consts ++// -------- func gif.decoder.num_decoded_frame_configs + +-static const uint8_t +-WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 1, 8, 16, 9, 2, 3, +- 10, 17, 24, 32, 25, 18, 11, 4, +- 5, 12, 19, 26, 33, 40, 48, 41, +- 34, 27, 20, 13, 6, 7, 14, 21, +- 28, 35, 42, 49, 56, 57, 50, 43, +- 36, 29, 22, 15, 23, 30, 37, 44, +- 51, 58, 59, 52, 45, 38, 31, 39, +- 46, 53, 60, 61, 54, 47, 55, 62, +- 63, 63, 63, 63, 63, 63, 63, 63, +- 63, 63, 63, 63, 63, 63, 63, 63, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__num_decoded_frame_configs( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-static const uint8_t +-WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 138, 139, 140, 141, 142, 143, +- 144, 145, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 155, 156, 157, 158, 159, +- 160, 161, 162, 163, 164, 165, 166, 167, +- 168, 169, 170, 171, 172, 173, 174, 175, +- 176, 177, 178, 179, 180, 181, 182, 183, +- 184, 185, 186, 187, 188, 189, 190, 191, +- 192, 193, 194, 195, 196, 197, 198, 199, +- 200, 201, 202, 203, 204, 205, 206, 207, +- 208, 209, 210, 211, 212, 213, 214, 215, +- 216, 217, 218, 219, 220, 221, 222, 223, +- 224, 225, 226, 227, 228, 229, 230, 231, +- 232, 233, 234, 235, 236, 237, 238, 239, +- 240, 241, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, 251, 252, 253, 254, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 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, +- 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, +- 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, +- 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, +- 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, +- 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, +- 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, +- 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, +- 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, +- 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, +- 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, +- 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, +- 0, 1, 2, 3, 4, 5, 6, 7, +- 8, 9, 10, 11, 12, 13, 14, 15, +- 16, 17, 18, 19, 20, 21, 22, 23, +- 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, +- 64, 65, 66, 67, 68, 69, 70, 71, +- 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, +- 88, 89, 90, 91, 92, 93, 94, 95, +- 96, 97, 98, 99, 100, 101, 102, 103, +- 104, 105, 106, 107, 108, 109, 110, 111, +- 112, 113, 114, 115, 116, 117, 118, 119, +- 120, 121, 122, 123, 124, 125, 126, 127, +-}; ++ return self->private_impl.f_num_decoded_frame_configs_value; ++} + +-static const uint16_t +-WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 65535, 65533, 65529, 65521, 65505, 65473, 65409, +- 65281, 65025, 64513, 63489, 61441, 57345, 49153, 32769, +-}; ++// -------- func gif.decoder.num_decoded_frames + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 1, 5, 1, 1, 1, 1, +- 1, 1, 0, 0, 0, 0, 0, 0, +- 0, 0, 1, 2, 3, 4, 5, 6, +- 7, 8, 9, 10, 11, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__num_decoded_frames( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 0, 3, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 0, 0, 0, 0, +- 0, 0, 1, 2, 3, 4, 5, 6, +- 7, 8, 9, 10, 11, +-}; ++ return self->private_impl.f_num_decoded_frames_value; ++} + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 16, 0, 2, 1, 3, 3, 2, 4, +- 3, 5, 5, 4, 4, 0, 0, 1, +- 125, 1, 2, 3, 0, 4, 17, 5, +- 18, 33, 49, 65, 6, 19, 81, 97, +- 7, 34, 113, 20, 50, 129, 145, 161, +- 8, 35, 66, 177, 193, 21, 82, 209, +- 240, 36, 51, 98, 114, 130, 9, 10, +- 22, 23, 24, 25, 26, 37, 38, 39, +- 40, 41, 42, 52, 53, 54, 55, 56, +- 57, 58, 67, 68, 69, 70, 71, 72, +- 73, 74, 83, 84, 85, 86, 87, 88, +- 89, 90, 99, 100, 101, 102, 103, 104, +- 105, 106, 115, 116, 117, 118, 119, 120, +- 121, 122, 131, 132, 133, 134, 135, 136, +- 137, 138, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 162, 163, 164, 165, 166, +- 167, 168, 169, 170, 178, 179, 180, 181, +- 182, 183, 184, 185, 186, 194, 195, 196, +- 197, 198, 199, 200, 201, 202, 210, 211, +- 212, 213, 214, 215, 216, 217, 218, 225, +- 226, 227, 228, 229, 230, 231, 232, 233, +- 234, 241, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, +-}; ++// -------- func gif.decoder.frame_dirty_rect + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 17, 0, 2, 1, 2, 4, 4, 3, +- 4, 7, 5, 4, 4, 0, 1, 2, +- 119, 0, 1, 2, 3, 17, 4, 5, +- 33, 49, 6, 18, 65, 81, 7, 97, +- 113, 19, 34, 50, 129, 8, 20, 66, +- 145, 161, 177, 193, 9, 35, 51, 82, +- 240, 21, 98, 114, 209, 10, 22, 36, +- 52, 225, 37, 241, 23, 24, 25, 26, +- 38, 39, 40, 41, 42, 53, 54, 55, +- 56, 57, 58, 67, 68, 69, 70, 71, +- 72, 73, 74, 83, 84, 85, 86, 87, +- 88, 89, 90, 99, 100, 101, 102, 103, +- 104, 105, 106, 115, 116, 117, 118, 119, +- 120, 121, 122, 130, 131, 132, 133, 134, +- 135, 136, 137, 138, 146, 147, 148, 149, +- 150, 151, 152, 153, 154, 162, 163, 164, +- 165, 166, 167, 168, 169, 170, 178, 179, +- 180, 181, 182, 183, 184, 185, 186, 194, +- 195, 196, 197, 198, 199, 200, 201, 202, +- 210, 211, 212, 213, 214, 215, 216, 217, +- 218, 226, 227, 228, 229, 230, 231, 232, +- 233, 234, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_gif__decoder__frame_dirty_rect( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-// ---------------- Private Initializer Prototypes ++ return wuffs_base__utility__make_rect_ie_u32( ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height)); ++} + +-// ---------------- Private Function Prototypes ++// -------- func gif.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_gif__decoder__workbuf_len( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct_x86_avx2( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++// -------- func gif.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__restart_frame( ++ wuffs_gif__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dqt( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if (a_io_position == 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_num_decoded_frame_configs_value = a_index; ++ self->private_impl.f_num_decoded_frames_value = a_index; ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dri( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func gif.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_appn( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- uint8_t a_marker); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_sof( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__quantize_dimension( +- const wuffs_jpeg__decoder* self, +- uint32_t a_width, +- uint8_t a_h, +- uint8_t a_max_incl_h); ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dht( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_huff_tables( +- wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th, +- uint32_t a_total_count); ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_sos( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func gif.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__prepare_scan( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_gif__decoder__do_decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__use_default_huffman_table( +- wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__calculate_single_component_scan_fields( +- wuffs_jpeg__decoder* self); ++ uint32_t v_background_color = 0; ++ uint8_t v_flags = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( +- wuffs_jpeg__decoder* self); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__fill_bitstream( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ if (coro_susp_point) { ++ v_background_color = self->private_data.s_do_decode_frame_config.v_background_color; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ self->private_impl.f_dirty_max_excl_y = 0u; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__skip_frame(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ } ++ v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ if ( ! self->private_impl.f_gc_has_transparent_index) { ++ v_background_color = self->private_impl.f_background_color_u32_argb_premul; ++ if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ } ++ } ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)), ++ ((wuffs_base__flicks)(self->private_impl.f_gc_duration)), ++ self->private_impl.f_num_decoded_frame_configs_value, ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_gc_disposal, ++ ! self->private_impl.f_gc_has_transparent_index, ++ false, ++ v_background_color); ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); ++ self->private_impl.f_call_sequence = 64u; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf); ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame_config.v_background_color = v_background_color; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__save_mcu_blocks( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__skip_past_the_next_restart_marker( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return status; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__apply_progressive_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func gif.decoder.skip_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__swizzle_gray( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++wuffs_gif__decoder__skip_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__swizzle_colorful( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++ uint8_t v_flags = 0; ++ uint8_t v_lw = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__top_left_quants_has_zero( +- const wuffs_jpeg__decoder* self, +- uint32_t a_q); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ uint32_t coro_susp_point = self->private_impl.p_skip_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; ++ } ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ self->private_data.s_skip_frame.scratch = (((uint32_t)(3u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_lw = t_1; ++ } ++ if (v_lw > 8u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_quirks[0u]) { ++ self->private_impl.f_delayed_num_decoded_frames = true; ++ } else { ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 32u; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto ok; ++ ok: ++ self->private_impl.p_skip_frame = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ return status; ++} ++ ++// -------- func gif.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( +- wuffs_jpeg__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_jpeg__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_jpeg__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_jpeg__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_jpeg__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_jpeg__decoder__initialize( +- wuffs_jpeg__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default; +- self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default; +- self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-wuffs_jpeg__decoder* +-wuffs_jpeg__decoder__alloc(void) { +- wuffs_jpeg__decoder* x = +- (wuffs_jpeg__decoder*)(calloc(sizeof(wuffs_jpeg__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_jpeg__decoder__initialize( +- x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; + } +- return x; +-} + +-size_t +-sizeof__wuffs_jpeg__decoder(void) { +- return sizeof(wuffs_jpeg__decoder); +-} ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + +-// ---------------- Function Implementations ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// -------- func jpeg.decoder.decode_idct ++// -------- func gif.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q); +-} ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- uint32_t v_bq0 = 0; +- uint32_t v_bq2 = 0; +- uint32_t v_bq4 = 0; +- uint32_t v_bq6 = 0; +- uint32_t v_ca = 0; +- uint32_t v_cb2 = 0; +- uint32_t v_cb6 = 0; +- uint32_t v_ccp = 0; +- uint32_t v_ccm = 0; +- uint32_t v_cd0 = 0; +- uint32_t v_cd1 = 0; +- uint32_t v_cd2 = 0; +- uint32_t v_cd3 = 0; +- uint32_t v_bq1 = 0; +- uint32_t v_bq3 = 0; +- uint32_t v_bq5 = 0; +- uint32_t v_bq7 = 0; +- uint32_t v_ci51 = 0; +- uint32_t v_ci53 = 0; +- uint32_t v_ci71 = 0; +- uint32_t v_ci73 = 0; +- uint32_t v_cj = 0; +- uint32_t v_ck1 = 0; +- uint32_t v_ck3 = 0; +- uint32_t v_ck5 = 0; +- uint32_t v_ck7 = 0; +- uint32_t v_cl51 = 0; +- uint32_t v_cl73 = 0; +- uint32_t v_in0 = 0; +- uint32_t v_in2 = 0; +- uint32_t v_in4 = 0; +- uint32_t v_in6 = 0; +- uint32_t v_ra = 0; +- uint32_t v_rb2 = 0; +- uint32_t v_rb6 = 0; +- uint32_t v_rcp = 0; +- uint32_t v_rcm = 0; +- uint32_t v_rd0 = 0; +- uint32_t v_rd1 = 0; +- uint32_t v_rd2 = 0; +- uint32_t v_rd3 = 0; +- uint32_t v_in1 = 0; +- uint32_t v_in3 = 0; +- uint32_t v_in5 = 0; +- uint32_t v_in7 = 0; +- uint32_t v_ri51 = 0; +- uint32_t v_ri53 = 0; +- uint32_t v_ri71 = 0; +- uint32_t v_ri73 = 0; +- uint32_t v_rj = 0; +- uint32_t v_rk1 = 0; +- uint32_t v_rk3 = 0; +- uint32_t v_rk5 = 0; +- uint32_t v_rk7 = 0; +- uint32_t v_rl51 = 0; +- uint32_t v_rl73 = 0; +- uint32_t v_intermediate[64] = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (8u > a_dst_stride) { +- return wuffs_base__make_empty_struct(); +- } +- if (0u == (self->private_data.f_mcu_blocks[0u][8u] | +- self->private_data.f_mcu_blocks[0u][16u] | +- self->private_data.f_mcu_blocks[0u][24u] | +- self->private_data.f_mcu_blocks[0u][32u] | +- self->private_data.f_mcu_blocks[0u][40u] | +- self->private_data.f_mcu_blocks[0u][48u] | +- self->private_data.f_mcu_blocks[0u][56u])) { +- v_intermediate[0u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))) << 2u)); +- v_intermediate[8u] = v_intermediate[0u]; +- v_intermediate[16u] = v_intermediate[0u]; +- v_intermediate[24u] = v_intermediate[0u]; +- v_intermediate[32u] = v_intermediate[0u]; +- v_intermediate[40u] = v_intermediate[0u]; +- v_intermediate[48u] = v_intermediate[0u]; +- v_intermediate[56u] = v_intermediate[0u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][16u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][16u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][48u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][48u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][32u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][32u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][8u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][8u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][24u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][24u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][40u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][40u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][56u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][56u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_quirks[5u] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend); ++ if (status.repr) { ++ goto suspend; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf); ++ if (status.repr) { ++ goto suspend; ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][9u] | +- self->private_data.f_mcu_blocks[0u][17u] | +- self->private_data.f_mcu_blocks[0u][25u] | +- self->private_data.f_mcu_blocks[0u][33u] | +- self->private_data.f_mcu_blocks[0u][41u] | +- self->private_data.f_mcu_blocks[0u][49u] | +- self->private_data.f_mcu_blocks[0u][57u])) { +- v_intermediate[1u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))) << 2u)); +- v_intermediate[9u] = v_intermediate[1u]; +- v_intermediate[17u] = v_intermediate[1u]; +- v_intermediate[25u] = v_intermediate[1u]; +- v_intermediate[33u] = v_intermediate[1u]; +- v_intermediate[41u] = v_intermediate[1u]; +- v_intermediate[49u] = v_intermediate[1u]; +- v_intermediate[57u] = v_intermediate[1u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][17u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][17u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][49u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][49u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][33u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][33u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][9u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][9u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][25u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][25u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][41u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][41u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][57u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][57u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func gif.decoder.reset_gc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__reset_gc( ++ wuffs_gif__decoder* self) { ++ self->private_impl.f_gc_has_transparent_index = false; ++ self->private_impl.f_gc_transparent_index = 0u; ++ self->private_impl.f_gc_disposal = 0u; ++ self->private_impl.f_gc_duration = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func gif.decoder.decode_up_to_id_part1 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_up_to_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_block_type = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][10u] | +- self->private_data.f_mcu_blocks[0u][18u] | +- self->private_data.f_mcu_blocks[0u][26u] | +- self->private_data.f_mcu_blocks[0u][34u] | +- self->private_data.f_mcu_blocks[0u][42u] | +- self->private_data.f_mcu_blocks[0u][50u] | +- self->private_data.f_mcu_blocks[0u][58u])) { +- v_intermediate[2u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))) << 2u)); +- v_intermediate[10u] = v_intermediate[2u]; +- v_intermediate[18u] = v_intermediate[2u]; +- v_intermediate[26u] = v_intermediate[2u]; +- v_intermediate[34u] = v_intermediate[2u]; +- v_intermediate[42u] = v_intermediate[2u]; +- v_intermediate[50u] = v_intermediate[2u]; +- v_intermediate[58u] = v_intermediate[2u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][18u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][18u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][50u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][50u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][34u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][34u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][10u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][10u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][26u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][26u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][42u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][42u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][58u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][58u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) { ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_type = t_0; ++ } ++ if (v_block_type == 33u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_extension(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (v_block_type == 44u) { ++ if (self->private_impl.f_delayed_num_decoded_frames) { ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_id_part0(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } else { ++ if (self->private_impl.f_delayed_num_decoded_frames) { ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ break; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_up_to_id_part1 = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][11u] | +- self->private_data.f_mcu_blocks[0u][19u] | +- self->private_data.f_mcu_blocks[0u][27u] | +- self->private_data.f_mcu_blocks[0u][35u] | +- self->private_data.f_mcu_blocks[0u][43u] | +- self->private_data.f_mcu_blocks[0u][51u] | +- self->private_data.f_mcu_blocks[0u][59u])) { +- v_intermediate[3u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))) << 2u)); +- v_intermediate[11u] = v_intermediate[3u]; +- v_intermediate[19u] = v_intermediate[3u]; +- v_intermediate[27u] = v_intermediate[3u]; +- v_intermediate[35u] = v_intermediate[3u]; +- v_intermediate[43u] = v_intermediate[3u]; +- v_intermediate[51u] = v_intermediate[3u]; +- v_intermediate[59u] = v_intermediate[3u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][19u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][19u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][51u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][51u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][35u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][35u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][11u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][11u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][27u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][27u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][43u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][43u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][59u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][59u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_up_to_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (self->private_data.f_mcu_blocks[0u][12u] | +- self->private_data.f_mcu_blocks[0u][20u] | +- self->private_data.f_mcu_blocks[0u][28u] | +- self->private_data.f_mcu_blocks[0u][36u] | +- self->private_data.f_mcu_blocks[0u][44u] | +- self->private_data.f_mcu_blocks[0u][52u] | +- self->private_data.f_mcu_blocks[0u][60u])) { +- v_intermediate[4u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))) << 2u)); +- v_intermediate[12u] = v_intermediate[4u]; +- v_intermediate[20u] = v_intermediate[4u]; +- v_intermediate[28u] = v_intermediate[4u]; +- v_intermediate[36u] = v_intermediate[4u]; +- v_intermediate[44u] = v_intermediate[4u]; +- v_intermediate[52u] = v_intermediate[4u]; +- v_intermediate[60u] = v_intermediate[4u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][20u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][20u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][52u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][52u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][36u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][36u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][12u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][12u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][28u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][28u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][44u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][44u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][60u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][60u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_header ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_header( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_c48 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][13u] | +- self->private_data.f_mcu_blocks[0u][21u] | +- self->private_data.f_mcu_blocks[0u][29u] | +- self->private_data.f_mcu_blocks[0u][37u] | +- self->private_data.f_mcu_blocks[0u][45u] | +- self->private_data.f_mcu_blocks[0u][53u] | +- self->private_data.f_mcu_blocks[0u][61u])) { +- v_intermediate[5u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))) << 2u)); +- v_intermediate[13u] = v_intermediate[5u]; +- v_intermediate[21u] = v_intermediate[5u]; +- v_intermediate[29u] = v_intermediate[5u]; +- v_intermediate[37u] = v_intermediate[5u]; +- v_intermediate[45u] = v_intermediate[5u]; +- v_intermediate[53u] = v_intermediate[5u]; +- v_intermediate[61u] = v_intermediate[5u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][21u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][21u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][53u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][53u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][37u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][37u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][13u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][13u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][29u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][29u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][45u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][45u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][61u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][61u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_header; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_decode_header.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_header.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 40) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c48 = t_0; ++ } ++ if ((v_c48 != 106889795225927u) && (v_c48 != 106898385160519u)) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_header); ++ goto exit; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_header = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][14u] | +- self->private_data.f_mcu_blocks[0u][22u] | +- self->private_data.f_mcu_blocks[0u][30u] | +- self->private_data.f_mcu_blocks[0u][38u] | +- self->private_data.f_mcu_blocks[0u][46u] | +- self->private_data.f_mcu_blocks[0u][54u] | +- self->private_data.f_mcu_blocks[0u][62u])) { +- v_intermediate[6u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))) << 2u)); +- v_intermediate[14u] = v_intermediate[6u]; +- v_intermediate[22u] = v_intermediate[6u]; +- v_intermediate[30u] = v_intermediate[6u]; +- v_intermediate[38u] = v_intermediate[6u]; +- v_intermediate[46u] = v_intermediate[6u]; +- v_intermediate[54u] = v_intermediate[6u]; +- v_intermediate[62u] = v_intermediate[6u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][22u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][22u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][54u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][54u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][38u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][38u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][14u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][14u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][30u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][30u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][46u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][46u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][62u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][62u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_header = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (self->private_data.f_mcu_blocks[0u][15u] | +- self->private_data.f_mcu_blocks[0u][23u] | +- self->private_data.f_mcu_blocks[0u][31u] | +- self->private_data.f_mcu_blocks[0u][39u] | +- self->private_data.f_mcu_blocks[0u][47u] | +- self->private_data.f_mcu_blocks[0u][55u] | +- self->private_data.f_mcu_blocks[0u][63u])) { +- v_intermediate[7u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))) << 2u)); +- v_intermediate[15u] = v_intermediate[7u]; +- v_intermediate[23u] = v_intermediate[7u]; +- v_intermediate[31u] = v_intermediate[7u]; +- v_intermediate[39u] = v_intermediate[7u]; +- v_intermediate[47u] = v_intermediate[7u]; +- v_intermediate[55u] = v_intermediate[7u]; +- v_intermediate[63u] = v_intermediate[7u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][23u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][23u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][55u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][55u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][39u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][39u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][15u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][15u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][31u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][31u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][47u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][47u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][63u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][63u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_lsd ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_lsd( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_flags = 0; ++ uint8_t v_background_color_index = 0; ++ uint32_t v_num_palette_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_argb = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (v_intermediate[1u] | +- v_intermediate[2u] | +- v_intermediate[3u] | +- v_intermediate[4u] | +- v_intermediate[5u] | +- v_intermediate[6u] | +- v_intermediate[7u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[2u]; +- v_in6 = v_intermediate[6u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[0u]; +- v_in4 = v_intermediate[4u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[1u]; +- v_in3 = v_intermediate[3u]; +- v_in5 = v_intermediate[5u]; +- v_in7 = v_intermediate[7u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_lsd; ++ if (coro_susp_point) { ++ v_flags = self->private_data.s_decode_lsd.v_flags; ++ v_background_color_index = self->private_data.s_decode_lsd.v_background_color_index; ++ v_num_palette_entries = self->private_data.s_decode_lsd.v_num_palette_entries; ++ v_i = self->private_data.s_decode_lsd.v_i; + } +- if (0u == (v_intermediate[9u] | +- v_intermediate[10u] | +- v_intermediate[11u] | +- v_intermediate[12u] | +- v_intermediate[13u] | +- v_intermediate[14u] | +- v_intermediate[15u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 8) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ self->private_impl.f_width = t_0; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[10u]; +- v_in6 = v_intermediate[14u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[8u]; +- v_in4 = v_intermediate[12u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[9u]; +- v_in3 = v_intermediate[11u]; +- v_in5 = v_intermediate[13u]; +- v_in7 = v_intermediate[15u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_height = t_1; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[17u] | +- v_intermediate[18u] | +- v_intermediate[19u] | +- v_intermediate[20u] | +- v_intermediate[21u] | +- v_intermediate[22u] | +- v_intermediate[23u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_flags = t_2; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[18u]; +- v_in6 = v_intermediate[22u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[16u]; +- v_in4 = v_intermediate[20u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[17u]; +- v_in3 = v_intermediate[19u]; +- v_in5 = v_intermediate[21u]; +- v_in7 = v_intermediate[23u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_background_color_index = t_3; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[25u] | +- v_intermediate[26u] | +- v_intermediate[27u] | +- v_intermediate[28u] | +- v_intermediate[29u] | +- v_intermediate[30u] | +- v_intermediate[31u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[26u]; +- v_in6 = v_intermediate[30u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[24u]; +- v_in4 = v_intermediate[28u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[25u]; +- v_in3 = v_intermediate[27u]; +- v_in5 = v_intermediate[29u]; +- v_in7 = v_intermediate[31u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[33u] | +- v_intermediate[34u] | +- v_intermediate[35u] | +- v_intermediate[36u] | +- v_intermediate[37u] | +- v_intermediate[38u] | +- v_intermediate[39u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ iop_a_src++; ++ v_i = 0u; ++ self->private_impl.f_has_global_palette = (((uint8_t)(v_flags & 128u)) != 0u); ++ if (self->private_impl.f_has_global_palette) { ++ v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ while (v_i < v_num_palette_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 16) { ++ t_4 = ((uint32_t)(*scratch >> 40)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_argb = t_4; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ if (self->private_impl.f_quirks[2u]) { ++ if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) { ++ v_j = (4u * ((uint32_t)(v_background_color_index))); ++ self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u)); ++ } else { ++ self->private_impl.f_background_color_u32_argb_premul = 77u; ++ } ++ } + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[34u]; +- v_in6 = v_intermediate[38u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[32u]; +- v_in4 = v_intermediate[36u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[33u]; +- v_in3 = v_intermediate[35u]; +- v_in5 = v_intermediate[37u]; +- v_in7 = v_intermediate[39u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ while (v_i < 256u) { ++ self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_lsd = 0; ++ goto exit; + } +- if (0u == (v_intermediate[41u] | +- v_intermediate[42u] | +- v_intermediate[43u] | +- v_intermediate[44u] | +- v_intermediate[45u] | +- v_intermediate[46u] | +- v_intermediate[47u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[42u]; +- v_in6 = v_intermediate[46u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[40u]; +- v_in4 = v_intermediate[44u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[41u]; +- v_in3 = v_intermediate[43u]; +- v_in5 = v_intermediate[45u]; +- v_in7 = v_intermediate[47u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_lsd = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_lsd.v_flags = v_flags; ++ self->private_data.s_decode_lsd.v_background_color_index = v_background_color_index; ++ self->private_data.s_decode_lsd.v_num_palette_entries = v_num_palette_entries; ++ self->private_data.s_decode_lsd.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (v_intermediate[49u] | +- v_intermediate[50u] | +- v_intermediate[51u] | +- v_intermediate[52u] | +- v_intermediate[53u] | +- v_intermediate[54u] | +- v_intermediate[55u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_extension ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_extension( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_label = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_extension; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_label = t_0; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[50u]; +- v_in6 = v_intermediate[54u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[48u]; +- v_in4 = v_intermediate[52u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[49u]; +- v_in3 = v_intermediate[51u]; +- v_in5 = v_intermediate[53u]; +- v_in7 = v_intermediate[55u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ if (v_label == 249u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_gc(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if (v_label == 255u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_ae(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[57u] | +- v_intermediate[58u] | +- v_intermediate[59u] | +- v_intermediate[60u] | +- v_intermediate[61u] | +- v_intermediate[62u] | +- v_intermediate[63u])) { +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- } else { +- v_in2 = v_intermediate[58u]; +- v_in6 = v_intermediate[62u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[56u]; +- v_in4 = v_intermediate[60u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[57u]; +- v_in3 = v_intermediate[59u]; +- v_in5 = v_intermediate[61u]; +- v_in7 = v_intermediate[63u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ if (status.repr) { ++ goto suspend; ++ } ++ ++ ok: ++ self->private_impl.p_decode_extension = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_extension = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-// -------- func jpeg.decoder.decode_idct_x86_avx2 ++// -------- func gif.decoder.skip_blocks + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct_x86_avx2( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- __m256i v_k_0000 = {0}; +- __m256i v_k_8080 = {0}; +- __m256i v_k_0000_0002 = {0}; +- __m256i v_k_0001_FFFF = {0}; +- __m256i v_k_0400_0000 = {0}; +- __m256i v_k_29CF_1151_D630_1151 = {0}; +- __m256i v_k_E333_133E_ADFD_1051 = {0}; +- __m256i v_k_E6DC_25A1_1925_25A1 = {0}; +- __m256i v_k_ECC1_E333_EFB0_ADFD = {0}; +- __m128i v_az_coeffs = {0}; +- __m256i v_az_ah00 = {0}; +- __m256i v_az_ad00 = {0}; +- __m256i v_az_eh00 = {0}; +- __m256i v_az_adeh = {0}; +- __m256i v_rows01 = {0}; +- __m256i v_rows23 = {0}; +- __m256i v_rows45 = {0}; +- __m256i v_rows67 = {0}; +- __m256i v_quants01 = {0}; +- __m256i v_quants23 = {0}; +- __m256i v_quants45 = {0}; +- __m256i v_quants67 = {0}; +- __m256i v_rows04 = {0}; +- __m256i v_rows31 = {0}; +- __m256i v_rows26 = {0}; +- __m256i v_rows75 = {0}; +- __m256i v_fp_rows62 = {0}; +- __m256i v_fp_bq2662ad = {0}; +- __m256i v_fp_bq2662eh = {0}; +- __m256i v_fp_cb26ad = {0}; +- __m256i v_fp_cb26eh = {0}; +- __m256i v_fp_rows40pos = {0}; +- __m256i v_fp_rows04neg = {0}; +- __m256i v_fp_rows0pm4 = {0}; +- __m256i v_fp_ccpmad = {0}; +- __m256i v_fp_ccpmeh = {0}; +- __m256i v_fp_cd01ad = {0}; +- __m256i v_fp_cd01eh = {0}; +- __m256i v_fp_cd32ad = {0}; +- __m256i v_fp_cd32eh = {0}; +- __m256i v_fp_sums7351 = {0}; +- __m256i v_fp_sums5173 = {0}; +- __m256i v_fp_ci73515173ad = {0}; +- __m256i v_fp_ci73515173eh = {0}; +- __m256i v_fp_cl7351ad = {0}; +- __m256i v_fp_cl7351eh = {0}; +- __m256i v_fp_rows13 = {0}; +- __m256i v_fp_bq7153ad = {0}; +- __m256i v_fp_bq7153eh = {0}; +- __m256i v_fp_ck75ad = {0}; +- __m256i v_fp_ck75eh = {0}; +- __m256i v_fp_cl5173ad = {0}; +- __m256i v_fp_cl5173eh = {0}; +- __m256i v_fp_ck13ad = {0}; +- __m256i v_fp_ck13eh = {0}; +- __m256i v_intermediate01ad = {0}; +- __m256i v_intermediate01eh = {0}; +- __m256i v_intermediate01 = {0}; +- __m256i v_intermediate32ad = {0}; +- __m256i v_intermediate32eh = {0}; +- __m256i v_intermediate32 = {0}; +- __m256i v_intermediate45ad = {0}; +- __m256i v_intermediate45eh = {0}; +- __m256i v_intermediate45 = {0}; +- __m256i v_intermediate76ad = {0}; +- __m256i v_intermediate76eh = {0}; +- __m256i v_intermediate76 = {0}; +- __m256i v_ita0a1e0e1 = {0}; +- __m256i v_ita2a3e2e3 = {0}; +- __m256i v_ita4a5e4e5 = {0}; +- __m256i v_ita6a7e6e7 = {0}; +- __m256i v_ita0c0e0g0 = {0}; +- __m256i v_ita1c1e1g1 = {0}; +- __m256i v_ita4c4e4g4 = {0}; +- __m256i v_ita5c5e5g5 = {0}; +- __m256i v_ita0b0e0f0 = {0}; +- __m256i v_ita4b4e4f4 = {0}; +- __m256i v_itc0d0g0h0 = {0}; +- __m256i v_itc4d4g4h4 = {0}; +- __m256i v_intermediateae = {0}; +- __m256i v_intermediatebf = {0}; +- __m256i v_intermediatecg = {0}; +- __m256i v_intermediatedh = {0}; +- __m256i v_intermediatedb = {0}; +- __m256i v_intermediatehf = {0}; +- __m256i v_sp_cols62 = {0}; +- __m256i v_sp_bq2662ad = {0}; +- __m256i v_sp_bq2662eh = {0}; +- __m256i v_sp_rb26ad = {0}; +- __m256i v_sp_rb26eh = {0}; +- __m256i v_sp_cols40pos = {0}; +- __m256i v_sp_cols04neg = {0}; +- __m256i v_sp_cols0pm4 = {0}; +- __m256i v_sp_rcpmad = {0}; +- __m256i v_sp_rcpmeh = {0}; +- __m256i v_sp_rd01ad = {0}; +- __m256i v_sp_rd01eh = {0}; +- __m256i v_sp_rd32ad = {0}; +- __m256i v_sp_rd32eh = {0}; +- __m256i v_sp_sums7351 = {0}; +- __m256i v_sp_sums5173 = {0}; +- __m256i v_sp_ri73515173ad = {0}; +- __m256i v_sp_ri73515173eh = {0}; +- __m256i v_sp_rl7351ad = {0}; +- __m256i v_sp_rl7351eh = {0}; +- __m256i v_sp_cols13 = {0}; +- __m256i v_sp_bq7153ad = {0}; +- __m256i v_sp_bq7153eh = {0}; +- __m256i v_sp_rk75ad = {0}; +- __m256i v_sp_rk75eh = {0}; +- __m256i v_sp_rl5173ad = {0}; +- __m256i v_sp_rl5173eh = {0}; +- __m256i v_sp_rk13ad = {0}; +- __m256i v_sp_rk13eh = {0}; +- __m256i v_final01ad = {0}; +- __m256i v_final01eh = {0}; +- __m256i v_final01 = {0}; +- __m256i v_final32ad = {0}; +- __m256i v_final32eh = {0}; +- __m256i v_final32 = {0}; +- __m256i v_final45ad = {0}; +- __m256i v_final45eh = {0}; +- __m256i v_final45 = {0}; +- __m256i v_final76ad = {0}; +- __m256i v_final76eh = {0}; +- __m256i v_final76 = {0}; +- __m256i v_fta0a1e0e1 = {0}; +- __m256i v_fta2a3e2e3 = {0}; +- __m256i v_fta4a5e4e5 = {0}; +- __m256i v_fta6a7e6e7 = {0}; +- __m256i v_fta0c0e0g0 = {0}; +- __m256i v_fta1c1e1g1 = {0}; +- __m256i v_fta4c4e4g4 = {0}; +- __m256i v_fta5c5e5g5 = {0}; +- __m256i v_fta0b0e0f0 = {0}; +- __m256i v_ftc0d0g0h0 = {0}; +- __m256i v_fta4b4e4f4 = {0}; +- __m256i v_ftc4d4g4h4 = {0}; +- __m256i v_finalae = {0}; +- __m256i v_finalbf = {0}; +- __m256i v_finalcg = {0}; +- __m256i v_finaldh = {0}; +- __m256i v_final0145 = {0}; +- __m256i v_final2367 = {0}; +- uint64_t v_final0 = 0; +- uint64_t v_final1 = 0; +- uint64_t v_final2 = 0; +- uint64_t v_final3 = 0; +- uint64_t v_final4 = 0; +- uint64_t v_final5 = 0; +- uint64_t v_final6 = 0; +- uint64_t v_final7 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- +- if (8u > a_dst_stride) { +- return wuffs_base__make_empty_struct(); +- } +- v_k_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u)); +- v_k_8080 = _mm256_set_epi16((int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u)); +- v_k_0000_0002 = _mm256_set_epi16((int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u)); +- v_k_0001_FFFF = _mm256_set_epi16((int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u)); +- v_k_0400_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u)); +- v_k_29CF_1151_D630_1151 = _mm256_set_epi16((int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u)); +- v_k_E333_133E_ADFD_1051 = _mm256_set_epi16((int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u)); +- v_k_E6DC_25A1_1925_25A1 = _mm256_set_epi16((int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u)); +- v_k_ECC1_E333_EFB0_ADFD = _mm256_set_epi16((int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u)); +- do { +- if (0u == (wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)) | wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)))) { +- v_az_coeffs = _mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 24u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 40u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 56u))); +- if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) { +- v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); +- v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); +- v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); +- v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u)); +- v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00); +- v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00); +- v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u)); +- v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u)); +- v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u)); +- v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u)); +- v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u)); +- break; +- } +- } +- v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); +- v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)); +- v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u)); +- v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u)); +- v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); +- v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u)); +- v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u)); +- v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u)); +- v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); +- v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23); +- v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45); +- v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67); +- v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u)); +- v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u)); +- v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u)); +- v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u)); +- v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u)); +- v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62); +- v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62); +- v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151); +- v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151); +- v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u)); +- v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF); +- v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg); +- v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); +- v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); +- v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad); +- v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh); +- v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad); +- v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh); +- v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31); +- v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u)); +- v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173); +- v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173); +- v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1); +- v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1); +- v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u)); +- v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13); +- v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13); +- v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad); +- v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh); +- v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u)); +- v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u)); +- v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051)); +- v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051)); +- v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh); +- v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh); +- v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh); +- v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh); +- v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u)); +- v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u)); +- v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u)); +- v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u)); +- v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3); +- v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3); +- v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7); +- v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7); +- v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1); +- v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1); +- v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5); +- v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5); +- v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4); +- v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4); +- v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4); +- v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4); +- } while (0); +- v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u)); +- v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u)); +- v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u)); +- v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62); +- v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62); +- v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151); +- v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151); +- v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u)); +- v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF); +- v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg); +- v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); +- v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); +- v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad); +- v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh); +- v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad); +- v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh); +- v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb); +- v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u)); +- v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173); +- v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173); +- v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1); +- v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1); +- v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u)); +- v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13); +- v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13); +- v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad); +- v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh); +- v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u)); +- v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u)); +- v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051)); +- v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051)); +- v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); +- v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); +- v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh); +- v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); +- v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); +- v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh); +- v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); +- v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); +- v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh); +- v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); +- v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); +- v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh); +- v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u)); +- v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u)); +- v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u)); +- v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u)); +- v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3); +- v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3); +- v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7); +- v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7); +- v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1); +- v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1); +- v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5); +- v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5); +- v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4); +- v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4); +- v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); +- v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); +- v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080); +- v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080); +- v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u)))); +- v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u)))); +- v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u)))); +- v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u)))); +- v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u)))); +- v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u)))); +- v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u)))); +- v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u)))); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6); +- a_dst_buffer = v_remaining; +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7); +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 +- +-// -------- func jpeg.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__get_quirk( +- const wuffs_jpeg__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func jpeg.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__set_quirk( +- wuffs_jpeg__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func jpeg.decoder.decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, ++static wuffs_base__status ++wuffs_gif__decoder__skip_blocks( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_block_size = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_skip_blocks; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); +- goto exit; ++ if (v_block_size == 0u) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_data.s_skip_blocks.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_skip_blocks.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_blocks.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_blocks.scratch; + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_skip_blocks = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_skip_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func jpeg.decoder.do_decode_image_config ++// -------- func gif.decoder.decode_ae + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_gif__decoder__decode_ae( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_marker = 0; +- uint32_t v_pixfmt = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_block_size = 0; ++ bool v_is_animexts = false; ++ bool v_is_netscape = false; ++ bool v_is_iccp = false; ++ bool v_is_xmp = false; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42362,253 +42476,191 @@ wuffs_jpeg__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_ae; + if (coro_susp_point) { +- v_marker = self->private_data.s_do_decode_image_config[0].v_marker; ++ v_block_size = self->private_data.s_decode_ae.v_block_size; ++ v_is_animexts = self->private_data.s_decode_ae.v_is_animexts; ++ v_is_netscape = self->private_data.s_decode_ae.v_is_netscape; ++ v_is_iccp = self->private_data.s_decode_ae.v_is_iccp; ++ v_is_xmp = self->private_data.s_decode_ae.v_is_xmp; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ do { ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 255u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 216u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); +- goto exit; +- } +- while (true) { +- while (true) { ++ if (v_block_size == 0u) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ if (v_block_size != 11u) { ++ self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; ++ break; ++ } ++ v_is_animexts = true; ++ v_is_netscape = true; ++ v_is_iccp = true; ++ v_is_xmp = true; ++ v_block_size = 0u; ++ while (v_block_size < 11u) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_is_animexts = (v_is_animexts && (v_c8 == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size])); ++ v_is_netscape = (v_is_netscape && (v_c8 == WUFFS_GIF__NETSCAPE2DOT0[v_block_size])); ++ v_is_iccp = (v_is_iccp && (v_c8 == WUFFS_GIF__ICCRGBG1012[v_block_size])); ++ v_is_xmp = (v_is_xmp && (v_c8 == WUFFS_GIF__XMPDATAXMP[v_block_size])); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_block_size += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ if (v_is_animexts || v_is_netscape) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } + uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ v_block_size = t_2; + } +- if (v_c == 255u) { ++ if (v_block_size != 3u) { ++ self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; + break; + } +- } +- while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ v_c8 = t_3; + } +- if (v_c != 255u) { +- v_marker = v_c; ++ if (v_c8 != 1u) { ++ self->private_data.s_decode_ae.scratch = 2u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; + break; + } +- } +- if (v_marker == 0u) { +- continue; +- } else if ((208u <= v_marker) && (v_marker <= 217u)) { +- if (v_marker <= 215u) { +- continue; +- } +- } else { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ self->private_data.s_decode_ae.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_decode_ae.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch >> 48)); ++ t_4 = ((uint32_t)(*scratch)); + break; + } + num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } +- self->private_impl.f_payload_length = t_4; +- } +- if (self->private_impl.f_payload_length < 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 2u; +- } +- if (v_marker < 192u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else if (v_marker < 208u) { +- if (v_marker <= 194u) { +- if (self->private_impl.f_sof_marker != 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_sof_marker = v_marker; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_jpeg__decoder__decode_sof(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- break; +- } else if (v_marker == 195u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding); +- goto exit; +- } else if (v_marker == 196u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } else if ((197u <= v_marker) && (v_marker <= 199u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding); +- goto exit; +- } else if (v_marker == 200u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding); +- goto exit; +- } +- } else if (v_marker < 224u) { +- if (v_marker < 218u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } else if (v_marker == 218u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (v_marker == 219u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__decode_dqt(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_marker == 221u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__decode_dri(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- } else if (v_marker < 240u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ self->private_impl.f_num_animation_loops_value = t_4; + } +- continue; +- } else { +- if (v_marker == 254u) { +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; ++ self->private_impl.f_seen_num_animation_loops_value = true; ++ if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) { ++ self->private_impl.f_num_animation_loops_value += 1u; + } ++ } else if (self->private_impl.f_call_sequence >= 32u) { ++ } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { ++ self->private_impl.f_metadata_fourcc = 1229144912u; ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { ++ self->private_impl.f_metadata_fourcc = 1481461792u; ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; + } +- self->private_data.s_do_decode_image_config[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ } while (0); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.choosy_decode_idct = ( +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 : +-#endif +- self->private_impl.choosy_decode_idct); +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- v_pixfmt = 536870920u; +- if (self->private_impl.f_num_components > 1u) { +- v_pixfmt = 2415954056u; +- } +- wuffs_base__image_config__set( +- a_dst, +- v_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- true); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } +- self->private_impl.f_call_sequence = 32u; + +- goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_decode_ae = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_marker = v_marker; ++ self->private_impl.p_decode_ae = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_ae.v_block_size = v_block_size; ++ self->private_data.s_decode_ae.v_is_animexts = v_is_animexts; ++ self->private_data.s_decode_ae.v_is_netscape = v_is_netscape; ++ self->private_data.s_decode_ae.v_is_iccp = v_is_iccp; ++ self->private_data.s_decode_ae.v_is_xmp = v_is_xmp; + + goto exit; + exit: +@@ -42619,18 +42671,18 @@ wuffs_jpeg__decoder__do_decode_image_config( + return status; + } + +-// -------- func jpeg.decoder.decode_dqt ++// -------- func gif.decoder.decode_gc + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_dqt( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_gc( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_q = 0; +- uint32_t v_i = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_flags = 0; ++ uint16_t v_gc_duration_centiseconds = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42643,73 +42695,103 @@ wuffs_jpeg__decoder__decode_dqt( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_dqt[0]; +- if (coro_susp_point) { +- v_q = self->private_data.s_decode_dqt[0].v_q; +- v_i = self->private_data.s_decode_dqt[0].v_i; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_gc; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (self->private_impl.f_payload_length > 0u) { +- self->private_impl.f_payload_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if ((v_c & 15u) > 3u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_q = (v_c & 15u); +- if ((v_c >> 4u) == 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); +- goto exit; +- } else if (((v_c >> 4u) > 1u) || (self->private_impl.f_payload_length < 64u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); +- goto exit; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 4u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_payload_length -= 64u; +- v_i = 0u; +- while (v_i < 64u) { +- v_i += 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint8_t t_1 = *iop_a_src++; ++ v_flags = t_1; ++ } ++ self->private_impl.f_gc_has_transparent_index = (((uint8_t)(v_flags & 1u)) != 0u); ++ v_flags = ((uint8_t)(((uint8_t)(v_flags >> 2u)) & 7u)); ++ if (v_flags == 2u) { ++ self->private_impl.f_gc_disposal = 1u; ++ } else if ((v_flags == 3u) || (v_flags == 4u)) { ++ self->private_impl.f_gc_disposal = 2u; ++ } else { ++ self->private_impl.f_gc_disposal = 0u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint16_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_gc.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint16_t t_1 = *iop_a_src++; +- self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1; ++ uint64_t* scratch = &self->private_data.s_decode_gc.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 8) { ++ t_2 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } +- self->private_impl.f_seen_dqt[v_q] = true; +- if (self->private_impl.f_sof_marker == 0u) { +- v_i = 0u; +- while (v_i < 64u) { +- self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i]; +- v_i += 1u; +- } +- self->private_impl.f_saved_seen_dqt[v_q] = true; ++ v_gc_duration_centiseconds = t_2; ++ } ++ self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ self->private_impl.f_gc_transparent_index = t_3; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ goto exit; + } + + goto ok; + ok: +- self->private_impl.p_decode_dqt[0] = 0; ++ self->private_impl.p_decode_gc = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_dqt[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_dqt[0].v_q = v_q; +- self->private_data.s_decode_dqt[0].v_i = v_i; ++ self->private_impl.p_decode_gc = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -42720,12 +42802,12 @@ wuffs_jpeg__decoder__decode_dqt( + return status; + } + +-// -------- func jpeg.decoder.decode_dri ++// -------- func gif.decoder.decode_id_part0 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_dri( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_id_part0( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +@@ -42740,57 +42822,144 @@ wuffs_jpeg__decoder__decode_dri( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_dri[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part0; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_payload_length != 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint16_t t_0; ++ uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_dri[0].scratch = 0; ++ self->private_data.s_decode_id_part0.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_dri[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 8) { +- t_0 = ((uint16_t)(*scratch >> 48)); ++ t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_restart_interval = t_0; ++ self->private_impl.f_frame_rect_x0 = t_0; + } +- if (self->private_impl.f_sof_marker == 0u) { +- self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_y0 = t_1; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_x1 = t_2; ++ } ++ self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_y1 = t_3; ++ } ++ self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; ++ if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) && ! self->private_impl.f_quirks[4u]) { ++ self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); ++ self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); + } + + goto ok; + ok: +- self->private_impl.p_decode_dri[0] = 0; ++ self->private_impl.p_decode_id_part0 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_dri[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_id_part0 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -42801,18 +42970,24 @@ wuffs_jpeg__decoder__decode_dri( + return status; + } + +-// -------- func jpeg.decoder.decode_appn ++// -------- func gif.decoder.decode_id_part1 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_appn( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- uint8_t a_marker) { ++ wuffs_base__pixel_blend a_blend) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c8 = 0; +- uint32_t v_c32 = 0; ++ uint8_t v_flags = 0; ++ uint8_t v_which_palette = 0; ++ uint32_t v_num_palette_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_lw = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42825,184 +43000,136 @@ wuffs_jpeg__decoder__decode_appn( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_appn[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part1; ++ if (coro_susp_point) { ++ v_which_palette = self->private_data.s_decode_id_part1.v_which_palette; ++ v_num_palette_entries = self->private_data.s_decode_id_part1.v_num_palette_entries; ++ v_i = self->private_data.s_decode_id_part1.v_i; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- do { +- if (a_marker == 224u) { +- if (self->private_impl.f_payload_length >= 5u) { +- self->private_impl.f_payload_length -= 5u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_c32 = t_0; +- } +- if (v_c32 != 1179207242u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u)); +- break; +- } +- { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; ++ } ++ if (((uint8_t)(v_flags & 64u)) != 0u) { ++ self->private_impl.f_interlace = 4u; ++ } else { ++ self->private_impl.f_interlace = 0u; ++ } ++ v_which_palette = 1u; ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ v_i = 0u; ++ while (v_i < v_num_palette_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_id_part1.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c8 = t_1; +- } +- self->private_impl.f_is_jfif = (v_c8 == 0u); +- } +- } else if (a_marker == 238u) { +- if (self->private_impl.f_payload_length >= 12u) { +- self->private_impl.f_payload_length -= 12u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- v_c32 = t_2; +- } +- if (v_c32 != 1651467329u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u)); +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- v_c32 = t_3; +- } +- if ((255u & v_c32) != 101u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u)); +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ uint64_t* scratch = &self->private_data.s_decode_id_part1.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 16) { ++ t_1 = ((uint32_t)(*scratch >> 40)); ++ break; + } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- v_c32 = t_4; +- } +- if ((v_c32 >> 24u) == 0u) { +- self->private_impl.f_is_adobe = 1u; +- } else { +- self->private_impl.f_is_adobe = 2u; + } ++ v_argb = t_1; + } ++ v_argb |= 4278190080u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; + } +- } while (0); +- self->private_data.s_decode_appn[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_decode_appn[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_appn[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ while (v_i < 256u) { ++ self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; ++ } ++ } else if (self->private_impl.f_quirks[6u] && ! self->private_impl.f_has_global_palette) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_palette); ++ goto exit; ++ } else if (self->private_impl.f_gc_has_transparent_index) { ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1u], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0u], 1024)); ++ } else { ++ v_which_palette = 0u; + } +- iop_a_src += self->private_data.s_decode_appn[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ if (self->private_impl.f_gc_has_transparent_index) { ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(2198077448u), ++ wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ if (self->private_impl.f_ignored_but_affects_benchmarks) { ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_lw = t_2; ++ } ++ if (v_lw > 8u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ goto exit; ++ } ++ self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)(((uint8_t)(1u + v_lw)))); ++ self->private_impl.f_ignored_but_affects_benchmarks = true; + +- goto ok; + ok: +- self->private_impl.p_decode_appn[0] = 0; ++ self->private_impl.p_decode_id_part1 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_appn[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_id_part1.v_which_palette = v_which_palette; ++ self->private_data.s_decode_id_part1.v_num_palette_entries = v_num_palette_entries; ++ self->private_data.s_decode_id_part1.v_i = v_i; + + goto exit; + exit: +@@ -43013,30 +43140,29 @@ wuffs_jpeg__decoder__decode_appn( + return status; + } + +-// -------- func jpeg.decoder.decode_sof ++// -------- func gif.decoder.decode_id_part2 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_sof( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_gif__decoder__decode_id_part2( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_comp_h = 0; +- uint8_t v_comp_v = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- bool v_has_h24 = false; +- bool v_has_h3 = false; +- bool v_has_v24 = false; +- bool v_has_v3 = false; +- uint32_t v_upper_bound = 0; +- uint64_t v_wh0 = 0; +- uint64_t v_wh1 = 0; +- uint64_t v_wh2 = 0; +- uint64_t v_wh3 = 0; +- uint64_t v_progressive = 0; ++ uint64_t v_block_size = 0; ++ bool v_need_block_size = false; ++ uint32_t v_n_copied = 0; ++ uint64_t v_n_compressed = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_mark = 0; ++ wuffs_base__status v_copy_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43049,269 +43175,185 @@ wuffs_jpeg__decoder__decode_sof( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_sof[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part2; + if (coro_susp_point) { +- v_i = self->private_data.s_decode_sof[0].v_i; ++ v_block_size = self->private_data.s_decode_id_part2.v_block_size; ++ v_need_block_size = self->private_data.s_decode_id_part2.v_need_block_size; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_payload_length < 6u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 6u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c == 8u) { +- } else if (v_c == 12u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits); +- goto exit; +- } else if (v_c == 16u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_sof[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { ++ wuffs_gif__decoder__lzw_init(self); ++ v_need_block_size = true; ++ label__outer__continue:; ++ while (true) { ++ if (v_need_block_size) { ++ v_need_block_size = false; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_sof[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); ++ uint64_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } + } +- self->private_impl.f_height = t_1; +- } +- if (self->private_impl.f_height == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_sof[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_sof[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } ++ if (v_block_size == 0u) { ++ break; + } +- self->private_impl.f_width = t_2; +- } +- if (self->private_impl.f_width == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c == 0u) || (v_c > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } else if (v_c == 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model); +- goto exit; +- } +- self->private_impl.f_num_components = ((uint32_t)(v_c)); +- if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_components) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- self->private_impl.f_components_c[v_i] = t_4; ++ if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) { ++ self->private_impl.f_compressed_ri = 0u; ++ self->private_impl.f_compressed_wi = 0u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ while (self->private_impl.f_compressed_wi <= 3841u) { ++ v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src))); ++ if (v_n_compressed <= 0u) { ++ break; + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- v_comp_h = (v_c >> 4u); +- v_comp_v = (v_c & 15u); +- if ((v_comp_h == 0u) || +- (v_comp_h > 4u) || +- (v_comp_v == 0u) || +- (v_comp_v > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_components_h[v_i] = v_comp_h; +- if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) { +- self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i]; +- } +- self->private_impl.f_components_v[v_i] = v_comp_v; +- if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) { +- self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i]; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_n_copied = wuffs_private_impl__io_reader__limited_copy_u32_to_slice( ++ &iop_a_src, io2_a_src,((uint32_t)(v_n_compressed)), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); ++ wuffs_private_impl__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); ++ if (v_block_size > 0u) { ++ break; + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c >= 4u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ v_need_block_size = true; ++ break; ++ } ++ v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ iop_a_src += 1u; + } +- self->private_impl.f_components_tq[v_i] = v_c; +- v_j = 0u; +- while (v_j < v_i) { +- if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ while (true) { ++ if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) { ++ status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); + goto exit; + } +- v_j += 1u; +- } +- v_i += 1u; +- } +- if (self->private_impl.f_num_components == 1u) { +- self->private_impl.f_max_incl_components_h = 1u; +- self->private_impl.f_max_incl_components_v = 1u; +- self->private_impl.f_components_h[0u] = 1u; +- self->private_impl.f_components_v[0u] = 1u; +- } else { +- v_has_h24 = false; +- v_has_h3 = false; +- v_has_v24 = false; +- v_has_v3 = false; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_components) { +- v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u)); +- v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u)); +- v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u)); +- v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u)); +- v_i += 1u; +- } +- if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling); +- goto exit; +- } +- if (self->private_impl.f_num_components == 4u) { +- self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u); +- } else { +- if (self->private_impl.f_is_jfif) { +- self->private_impl.f_is_rgb_or_cmyk = false; +- } else if (self->private_impl.f_is_adobe > 0u) { +- self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u); +- } else { +- self->private_impl.f_is_rgb_or_cmyk = ((self->private_impl.f_components_c[0u] == 82u) && (self->private_impl.f_components_c[1u] == 71u) && (self->private_impl.f_components_c[2u] == 66u)); ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, ++ self->private_impl.f_compressed_ri, ++ self->private_impl.f_compressed_wi), ++ 0u); ++ v_mark = ((uint64_t)(iop_v_r - io0_v_r)); ++ u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr)); ++ wuffs_gif__decoder__lzw_read_from(self, v_r); ++ iop_v_r = u_r.data.ptr + u_r.meta.ri; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r)))); ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; + } +- } +- } +- self->private_impl.f_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, 1u, self->private_impl.f_max_incl_components_h); +- self->private_impl.f_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, 1u, self->private_impl.f_max_incl_components_v); +- v_upper_bound = 65544u; +- self->private_impl.f_components_workbuf_widths[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[0u])))); +- self->private_impl.f_components_workbuf_widths[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[1u])))); +- self->private_impl.f_components_workbuf_widths[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[2u])))); +- self->private_impl.f_components_workbuf_widths[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[3u])))); +- self->private_impl.f_components_workbuf_heights[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[0u])))); +- self->private_impl.f_components_workbuf_heights[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[1u])))); +- self->private_impl.f_components_workbuf_heights[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[2u])))); +- self->private_impl.f_components_workbuf_heights[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[3u])))); +- v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u]))); +- v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u]))); +- v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u]))); +- v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u]))); +- v_progressive = 0u; +- if (self->private_impl.f_sof_marker >= 194u) { +- v_progressive = 2u; +- v_i = 0u; +- while (v_i < 4u) { +- v_j = 0u; +- while (v_j < 10u) { +- self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; +- v_j += 1u; ++ if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) { ++ v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_lzw_output, ++ self->private_impl.f_lzw_output_ri, ++ self->private_impl.f_lzw_output_wi)); ++ if (wuffs_base__status__is_error(&v_copy_status)) { ++ status = v_copy_status; ++ goto exit; ++ } ++ self->private_impl.f_lzw_output_ri = 0u; ++ self->private_impl.f_lzw_output_wi = 0u; + } +- v_i += 1u; ++ if (self->private_impl.f_lzw_read_from_return_value == 0u) { ++ self->private_impl.f_ignored_but_affects_benchmarks = false; ++ if (v_need_block_size || (v_block_size > 0u)) { ++ self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_id_part2.scratch; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 1u) { ++ continue; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 2u) { ++ goto label__outer__continue; ++ } else if (self->private_impl.f_quirks[3u] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0u)) { ++ if (v_need_block_size || (v_block_size > 0u)) { ++ self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_id_part2.scratch; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 3u) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 4u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ goto exit; + } + } +- self->private_impl.f_components_workbuf_offsets[0u] = 0u; +- self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0); +- self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1); +- self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2); +- self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3); +- self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive)); ++ label__outer__break:; ++ self->private_impl.f_compressed_ri = 0u; ++ self->private_impl.f_compressed_wi = 0u; ++ if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) { ++ status = wuffs_base__make_status(wuffs_base__error__not_enough_data); ++ goto exit; ++ } + +- goto ok; + ok: +- self->private_impl.p_decode_sof[0] = 0; ++ self->private_impl.p_decode_id_part2 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_sof[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_sof[0].v_i = v_i; ++ self->private_impl.p_decode_id_part2 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_id_part2.v_block_size = v_block_size; ++ self->private_data.s_decode_id_part2.v_need_block_size = v_need_block_size; + + goto exit; + exit: +@@ -43322,106 +43364,182 @@ wuffs_jpeg__decoder__decode_sof( + return status; + } + +-// -------- func jpeg.decoder.quantize_dimension ++// -------- func gif.decoder.copy_to_image_buffer + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__quantize_dimension( +- const wuffs_jpeg__decoder* self, +- uint32_t a_width, +- uint8_t a_h, +- uint8_t a_max_incl_h) { +- uint32_t v_ratio = 0; ++static wuffs_base__status ++wuffs_gif__decoder__copy_to_image_buffer( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_pb, ++ wuffs_base__slice_u8 a_src) { ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_src = {0}; ++ uint64_t v_width_in_bytes = 0; ++ uint64_t v_n = 0; ++ uint64_t v_src_ri = 0; ++ wuffs_base__pixel_format v_pixfmt = {0}; ++ uint32_t v_bytes_per_pixel = 0; ++ uint32_t v_bits_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint32_t v_replicate_y0 = 0; ++ uint32_t v_replicate_y1 = 0; ++ wuffs_base__slice_u8 v_replicate_dst = {0}; ++ wuffs_base__slice_u8 v_replicate_src = {0}; + +- v_ratio = 0u; +- if (a_h > 0u) { +- v_ratio = ((uint32_t)((a_max_incl_h / a_h))); ++ v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb); ++ v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt); ++ if ((v_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } +- if (v_ratio == 1u) { +- return ((a_width + 7u) / 8u); +- } else if (v_ratio == 2u) { +- return ((a_width + 15u) / 16u); +- } else if (v_ratio == 3u) { +- return ((a_width + 23u) / 24u); ++ v_bytes_per_pixel = (v_bits_per_pixel >> 3u); ++ v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u); ++ while (v_src_ri < ((uint64_t)(a_src.len))) { ++ v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri); ++ if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) { ++ if (self->private_impl.f_quirks[3u]) { ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__too_much_data); ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u); ++ } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel))); ++ if (v_i < ((uint64_t)(v_dst.len))) { ++ v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel))); ++ if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) { ++ v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j); ++ } else { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); ++ } ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src); ++ wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u)); ++ } ++ if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ if (self->private_impl.f_interlace == 0u) { ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u); ++ continue; ++ } ++ if ((self->private_impl.f_num_decoded_frames_value == 0u) && ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) { ++ v_replicate_src = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u); ++ v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace]))); ++ v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1); ++ while (v_replicate_y0 < v_replicate_y1) { ++ v_replicate_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_replicate_y0); ++ wuffs_private_impl__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src); ++ v_replicate_y0 += 1u; ++ } ++ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1); ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); ++ while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); ++ } ++ continue; ++ } ++ if (((uint64_t)(a_src.len)) == v_src_ri) { ++ break; ++ } else if (((uint64_t)(a_src.len)) < v_src_ri) { ++ return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } ++ v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x))); ++ v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri)); ++ wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); ++ while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); ++ } ++ continue; ++ } ++ if (v_src_ri != ((uint64_t)(a_src.len))) { ++ return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } ++ break; + } +- return ((a_width + 31u) / 32u); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func jpeg.decoder.decode_frame_config ++// -------- func gif.decoder.lzw_init + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_init( ++ wuffs_gif__decoder* self) { ++ uint32_t v_i = 0; + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ self->private_impl.f_lzw_literal_width = 8u; ++ if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) { ++ self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u); + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width); ++ self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u); ++ self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code; ++ self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code; ++ self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u); ++ self->private_impl.f_lzw_bits = 0u; ++ self->private_impl.f_lzw_n_bits = 0u; ++ self->private_impl.f_lzw_output_ri = 0u; ++ self->private_impl.f_lzw_output_wi = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_lzw_clear_code) { ++ self->private_data.f_lzw_lm1s[v_i] = 0u; ++ self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i)); ++ v_i += 1u; + } +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func jpeg.decoder.do_decode_frame_config ++// -------- func gif.decoder.lzw_read_from + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_read_from( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ uint32_t v_clear_code = 0; ++ uint32_t v_end_code = 0; ++ uint32_t v_save_code = 0; ++ uint32_t v_prev_code = 0; ++ uint32_t v_width = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_output_wi = 0; ++ uint32_t v_code = 0; ++ uint32_t v_c = 0; ++ uint32_t v_o = 0; ++ uint32_t v_steps = 0; ++ uint8_t v_first_byte = 0; ++ uint16_t v_lm1_b = 0; ++ uint16_t v_lm1_a = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43434,83 +43552,370 @@ wuffs_jpeg__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_clear_code = self->private_impl.f_lzw_clear_code; ++ v_end_code = self->private_impl.f_lzw_end_code; ++ v_save_code = self->private_impl.f_lzw_save_code; ++ v_prev_code = self->private_impl.f_lzw_prev_code; ++ v_width = self->private_impl.f_lzw_width; ++ v_bits = self->private_impl.f_lzw_bits; ++ v_n_bits = self->private_impl.f_lzw_n_bits; ++ v_output_wi = self->private_impl.f_lzw_output_wi; ++ while (true) { ++ if (v_n_bits < v_width) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_lzw_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits >= v_width) { ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_lzw_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits < v_width) { ++ self->private_impl.f_lzw_read_from_return_value = 5u; ++ break; ++ } ++ } + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width)); ++ v_bits >>= v_width; ++ v_n_bits -= v_width; ++ if (v_code < v_clear_code) { ++ self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code)); ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (v_save_code <= 4095u) { ++ v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a; ++ if (((uint16_t)(v_lm1_a % 8u)) != 0u) { ++ self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); ++ self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code)); ++ } else { ++ self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; + } +- if (status.repr) { +- goto suspend; ++ } else if (v_code <= v_end_code) { ++ if (v_code == v_end_code) { ++ self->private_impl.f_lzw_read_from_return_value = 0u; ++ break; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ v_save_code = v_end_code; ++ v_prev_code = v_end_code; ++ v_width = (self->private_impl.f_lzw_literal_width + 1u); ++ } else if (v_code <= v_save_code) { ++ v_c = v_code; ++ if (v_code == v_save_code) { ++ v_c = v_prev_code; ++ } ++ v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u); ++ v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u); ++ v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u); ++ while (true) { ++ memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u); ++ if (v_steps <= 0u) { ++ break; ++ } ++ v_steps -= 1u; ++ v_o = (((uint32_t)(v_o - 8u)) & 8191u); ++ v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c])); ++ } ++ v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u]; ++ if (v_code == v_save_code) { ++ self->private_data.f_lzw_output[v_output_wi] = v_first_byte; ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ } ++ if (v_save_code <= 4095u) { ++ v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b; ++ if (((uint16_t)(v_lm1_b % 8u)) != 0u) { ++ self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); ++ self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte; ++ } else { ++ self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; + } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ self->private_impl.f_lzw_read_from_return_value = 4u; ++ break; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); ++ if (v_output_wi > 4095u) { ++ self->private_impl.f_lzw_read_from_return_value = 1u; ++ break; + } +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: ++ if (self->private_impl.f_lzw_read_from_return_value != 2u) { ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ self->private_impl.f_lzw_save_code = v_save_code; ++ self->private_impl.f_lzw_prev_code = v_prev_code; ++ self->private_impl.f_lzw_width = v_width; ++ self->private_impl.f_lzw_bits = v_bits; ++ self->private_impl.f_lzw_n_bits = v_n_bits; ++ self->private_impl.f_lzw_output_wi = v_output_wi; + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func jpeg.decoder.decode_frame ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum"; ++const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method"; ++const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags"; ++const char wuffs_gzip__error__bad_header[] = "#gzip: bad header"; ++const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++static wuffs_base__status ++wuffs_gzip__decoder__do_transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_gzip__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_gzip__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_gzip__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_gzip__decoder__initialize( ++ wuffs_gzip__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_deflate__decoder__initialize( ++ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_gzip__decoder* ++wuffs_gzip__decoder__alloc(void) { ++ wuffs_gzip__decoder* x = ++ (wuffs_gzip__decoder*)(calloc(1, sizeof(wuffs_gzip__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_gzip__decoder__initialize( ++ x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_gzip__decoder(void) { ++ return sizeof(wuffs_gzip__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func gzip.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gzip__decoder__get_quirk( ++ const wuffs_gzip__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func gzip.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gzip__decoder__set_quirk( ++ wuffs_gzip__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func gzip.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_gzip__decoder__dst_history_retain_length( ++ const wuffs_gzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func gzip.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_gzip__decoder__workbuf_len( ++ const wuffs_gzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func gzip.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gzip__decoder__transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -43525,65 +43930,41 @@ wuffs_jpeg__decoder__decode_frame( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL); +- wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL); +- uint32_t v_scan_count = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { +- v_scan_count = self->private_impl.f_scan_count; + { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_ddf_status = t_0; +- } +- if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; + } +- if (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count)) { +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf); +- } +- if (self->private_impl.f_num_components == 1u) { +- v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self, a_dst, a_workbuf); +- } else { +- v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self, a_dst, a_workbuf); +- } +- if (wuffs_base__status__is_error(&v_ddf_status)) { +- status = v_ddf_status; +- goto exit; +- } else if (wuffs_base__status__is_error(&v_swizzle_status)) { +- status = v_swizzle_status; +- goto exit; +- } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gzip__error__truncated_input); ++ goto exit; + } +- status = v_ddf_status; ++ status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -43593,24 +43974,40 @@ wuffs_jpeg__decoder__decode_frame( + return status; + } + +-// -------- func jpeg.decoder.do_decode_frame ++// -------- func gzip.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_gzip__decoder__do_transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_pixfmt = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_flags = 0; ++ uint16_t v_xlen = 0; ++ uint64_t v_mark = 0; ++ uint32_t v_checksum_have = 0; ++ uint32_t v_decoded_length_have = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint8_t v_c = 0; +- uint8_t v_marker = 0; ++ uint32_t v_checksum_want = 0; ++ uint32_t v_decoded_length_want = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43622,236 +44019,269 @@ wuffs_jpeg__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + if (coro_susp_point) { +- v_marker = self->private_data.s_do_decode_frame[0].v_marker; ++ v_flags = self->private_data.s_do_transform_io.v_flags; ++ v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have; ++ v_decoded_length_have = self->private_data.s_do_transform_io.v_decoded_length_have; ++ v_checksum_want = self->private_data.s_do_transform_io.v_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- if (status.repr) { ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 31u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- v_pixfmt = 536870920u; +- if (self->private_impl.f_num_components > 1u) { +- v_pixfmt = 2415954056u; ++ if (v_c8 != 139u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ goto exit; + } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(v_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- goto ok; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ if (v_c8 != 8u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method); + goto exit; +- } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) { +- wuffs_base__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u); + } +- if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_flags = t_3; + } +- while (true) { ++ self->private_data.s_do_transform_io.scratch = 6u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ if (((uint8_t)(v_flags & 4u)) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint16_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_xlen = t_4; ++ } ++ self->private_data.s_do_transform_io.scratch = ((uint32_t)(v_xlen)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } ++ if (((uint8_t)(v_flags & 8u)) != 0u) { + while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- if (v_c == 255u) { ++ if (v_c8 == 0u) { + break; + } + } ++ } ++ if (((uint8_t)(v_flags & 16u)) != 0u) { + while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- if (v_c != 255u) { +- v_marker = v_c; ++ if (v_c8 == 0u) { + break; + } + } +- if (v_marker == 0u) { +- continue; +- } else if ((208u <= v_marker) && (v_marker <= 217u)) { +- if (v_marker <= 215u) { +- continue; ++ } ++ if (((uint8_t)(v_flags & 2u)) != 0u) { ++ self->private_data.s_do_transform_io.scratch = 2u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } ++ if (((uint8_t)(v_flags & 224u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags); ++ goto exit; ++ } ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- self->private_impl.f_payload_length = t_2; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (self->private_impl.f_payload_length < 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; ++ wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); ++ v_status = t_7; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- self->private_impl.f_payload_length -= 2u; + } +- if (v_marker < 192u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else if (v_marker < 208u) { +- if (v_marker == 196u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_jpeg__decoder__decode_dht(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ v_decoded_length_have += ((uint32_t)(wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- continue; +- } else if (v_marker == 200u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } else if (v_marker < 224u) { +- if (v_marker < 217u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } else if (v_marker == 217u) { +- break; +- } else if (v_marker == 218u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_jpeg__decoder__decode_sos(self, a_src, a_workbuf); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 24) { ++ t_8 = ((uint32_t)(*scratch)); ++ break; + } +- if (status.repr) { ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_checksum_want = t_8; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- continue; +- } else if (v_marker == 219u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__decode_dqt(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_marker == 221u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__decode_dri(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; ++ if (num_bits_9 == 24) { ++ t_9 = ((uint32_t)(*scratch)); ++ break; + } +- continue; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- } else if (v_marker < 240u) { +- } else { +- if (v_marker == 254u) { +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)) << 56; + } + } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ v_decoded_length_want = t_9; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_have != v_checksum_want) || (v_decoded_length_have != v_decoded_length_want))) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum); ++ goto exit; + } +- self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_marker = v_marker; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_flags = v_flags; ++ self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have; ++ self->private_data.s_do_transform_io.v_decoded_length_have = v_decoded_length_have; ++ self->private_data.s_do_transform_io.v_checksum_want = v_checksum_want; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -43859,891 +44289,398 @@ wuffs_jpeg__decoder__do_decode_frame( + return status; + } + +-// -------- func jpeg.decoder.decode_dht ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dht( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) + +- uint8_t v_c = 0; +- uint8_t v_tc = 0; +- uint8_t v_th = 0; +- uint8_t v_tc4_th = 0; +- uint32_t v_working_total_count = 0; +- uint32_t v_total_count = 0; +- uint32_t v_i = 0; +- bool v_failed = false; ++// ---------------- Status Codes Implementations + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker"; ++const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker"; ++const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker"; ++const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker"; ++const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker"; ++const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header"; ++const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker"; ++const char wuffs_jpeg__error__bad_scan_count[] = "#jpeg: bad scan count"; ++const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table"; ++const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table"; ++const char wuffs_jpeg__error__rejected_progressive_jpeg[] = "#jpeg: rejected progressive JPEG"; ++const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input"; ++const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding"; ++const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model"; ++const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling"; ++const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding"; ++const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height"; ++const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding"; ++const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker"; ++const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)"; ++const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)"; ++const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision"; ++const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count"; ++const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state"; + +- uint32_t coro_susp_point = self->private_impl.p_decode_dht[0]; +- if (coro_susp_point) { +- v_tc4_th = self->private_data.s_decode_dht[0].v_tc4_th; +- v_total_count = self->private_data.s_decode_dht[0].v_total_count; +- v_i = self->private_data.s_decode_dht[0].v_i; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- Private Consts + +- if (self->private_impl.f_sof_marker == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- while (self->private_impl.f_payload_length > 0u) { +- if (self->private_impl.f_payload_length < 17u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 17u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (((v_c >> 4u) > 1u) || ((v_c & 15u) > 3u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_tc = (v_c >> 4u); +- v_th = (v_c & 15u); +- v_tc4_th = ((uint8_t)(((v_tc * 4u) | v_th))); +- if ((self->private_impl.f_sof_marker == 192u) && ((v_tc4_th & 3u) > 1u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_i = 0u; +- while (v_i < 16u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- self->private_data.f_dht_temp_counts[v_i] = t_1; +- } +- v_i += 1u; +- } +- v_working_total_count = 0u; +- v_i = 0u; +- while (v_i < 16u) { +- v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u); +- v_i += 1u; +- } +- if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_total_count = v_working_total_count; +- if (self->private_impl.f_payload_length < v_total_count) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= v_total_count; +- v_i = 0u; +- while (v_i < v_total_count) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2; +- } +- v_i += 1u; +- } +- while (v_i < 256u) { +- self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u; +- v_i += 1u; +- } +- if ((v_tc4_th & 4u) == 0u) { +- v_i = 0u; +- while (v_i < v_total_count) { +- if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_i += 1u; +- } +- } +- v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count); +- if (v_failed) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_seen_dht[v_tc4_th] = true; +- } ++static const uint8_t ++WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 1u, 8u, 16u, 9u, 2u, 3u, ++ 10u, 17u, 24u, 32u, 25u, 18u, 11u, 4u, ++ 5u, 12u, 19u, 26u, 33u, 40u, 48u, 41u, ++ 34u, 27u, 20u, 13u, 6u, 7u, 14u, 21u, ++ 28u, 35u, 42u, 49u, 56u, 57u, 50u, 43u, ++ 36u, 29u, 22u, 15u, 23u, 30u, 37u, 44u, ++ 51u, 58u, 59u, 52u, 45u, 38u, 31u, 39u, ++ 46u, 53u, 60u, 61u, 54u, 47u, 55u, 62u, ++ 63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u, ++ 63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u, ++}; + +- goto ok; +- ok: +- self->private_impl.p_decode_dht[0] = 0; +- goto exit; +- } ++static const uint8_t ++WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u, ++ 144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u, ++ 160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u, ++ 168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u, ++ 176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u, ++ 184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u, ++ 192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u, ++ 200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u, ++ 208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u, ++ 216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u, ++ 224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u, ++ 232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u, ++ 240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, ++ 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, ++ 16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u, ++ 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, ++ 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, ++ 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, ++ 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u, ++ 80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u, ++ 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u, ++ 112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u, ++}; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_dht[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_dht[0].v_tc4_th = v_tc4_th; +- self->private_data.s_decode_dht[0].v_total_count = v_total_count; +- self->private_data.s_decode_dht[0].v_i = v_i; ++static const uint16_t ++WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 65535u, 65533u, 65529u, 65521u, 65505u, 65473u, 65409u, ++ 65281u, 65025u, 64513u, 63489u, 61441u, 57345u, 49153u, 32769u, ++}; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 1u, 5u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u, ++ 7u, 8u, 9u, 10u, 11u, ++}; + +- return status; +-} ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 0u, 3u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u, ++ 7u, 8u, 9u, 10u, 11u, ++}; + +-// -------- func jpeg.decoder.calculate_huff_tables ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 16u, 0u, 2u, 1u, 3u, 3u, 2u, 4u, ++ 3u, 5u, 5u, 4u, 4u, 0u, 0u, 1u, ++ 125u, 1u, 2u, 3u, 0u, 4u, 17u, 5u, ++ 18u, 33u, 49u, 65u, 6u, 19u, 81u, 97u, ++ 7u, 34u, 113u, 20u, 50u, 129u, 145u, 161u, ++ 8u, 35u, 66u, 177u, 193u, 21u, 82u, 209u, ++ 240u, 36u, 51u, 98u, 114u, 130u, 9u, 10u, ++ 22u, 23u, 24u, 25u, 26u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 52u, 53u, 54u, 55u, 56u, ++ 57u, 58u, 67u, 68u, 69u, 70u, 71u, 72u, ++ 73u, 74u, 83u, 84u, 85u, 86u, 87u, 88u, ++ 89u, 90u, 99u, 100u, 101u, 102u, 103u, 104u, ++ 105u, 106u, 115u, 116u, 117u, 118u, 119u, 120u, ++ 121u, 122u, 131u, 132u, 133u, 134u, 135u, 136u, ++ 137u, 138u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 162u, 163u, 164u, 165u, 166u, ++ 167u, 168u, 169u, 170u, 178u, 179u, 180u, 181u, ++ 182u, 183u, 184u, 185u, 186u, 194u, 195u, 196u, ++ 197u, 198u, 199u, 200u, 201u, 202u, 210u, 211u, ++ 212u, 213u, 214u, 215u, 216u, 217u, 218u, 225u, ++ 226u, 227u, 228u, 229u, 230u, 231u, 232u, 233u, ++ 234u, 241u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, ++}; ++ ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 17u, 0u, 2u, 1u, 2u, 4u, 4u, 3u, ++ 4u, 7u, 5u, 4u, 4u, 0u, 1u, 2u, ++ 119u, 0u, 1u, 2u, 3u, 17u, 4u, 5u, ++ 33u, 49u, 6u, 18u, 65u, 81u, 7u, 97u, ++ 113u, 19u, 34u, 50u, 129u, 8u, 20u, 66u, ++ 145u, 161u, 177u, 193u, 9u, 35u, 51u, 82u, ++ 240u, 21u, 98u, 114u, 209u, 10u, 22u, 36u, ++ 52u, 225u, 37u, 241u, 23u, 24u, 25u, 26u, ++ 38u, 39u, 40u, 41u, 42u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 130u, 131u, 132u, 133u, 134u, ++ 135u, 136u, 137u, 138u, 146u, 147u, 148u, 149u, ++ 150u, 151u, 152u, 153u, 154u, 162u, 163u, 164u, ++ 165u, 166u, 167u, 168u, 169u, 170u, 178u, 179u, ++ 180u, 181u, 182u, 183u, 184u, 185u, 186u, 194u, ++ 195u, 196u, 197u, 198u, 199u, 200u, 201u, 202u, ++ 210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u, ++ 218u, 226u, 227u, 228u, 229u, 230u, 231u, 232u, ++ 233u, 234u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, ++}; ++ ++#define WUFFS_JPEG__QUIRKS_BASE 1220532224u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_huff_tables( ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct( + wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th, +- uint32_t a_total_count) { +- uint32_t v_i = 0; +- uint8_t v_j = 0; +- uint8_t v_k = 0; +- uint32_t v_bit_length_minus_one = 0; +- uint8_t v_bit_length = 0; +- uint32_t v_bit_string = 0; +- uint32_t v_slow = 0; +- uint8_t v_prefix = 0; +- uint16_t v_fast = 0; +- uint32_t v_reps = 0; ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); + +- v_i = 0u; +- v_k = 0u; +- v_bit_length_minus_one = 0u; +- while (v_i < a_total_count) { +- while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { +- v_k = 0u; +- v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_k += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u))); +- v_i += 1u; +- } +- v_bit_length = 0u; +- v_bit_string = 0u; +- v_i = 0u; +- while (v_i < a_total_count) { +- while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) { +- if (v_bit_length >= 16u) { +- return true; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_bit_length += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_bit_string <<= 1u; +- } +- self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string)); +- v_bit_string += 1u; +- if ((v_bit_string >> v_bit_length) > 0u) { +- return true; +- } +- v_i += 1u; +- } +- v_k = 0u; +- v_bit_length_minus_one = 0u; +- while (true) { +- if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) { +- self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u; +- } else { +- v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k]))))); +- v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one]; +- self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = (v_slow | ((((uint32_t)(self->private_data.f_dht_temp_bit_strings[((uint8_t)(v_k - 1u))])) + 1u) << 8u)); +- } +- v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); +- if (v_bit_length_minus_one == 0u) { +- break; +- } +- } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u; +- v_i += 1u; +- } +- v_j = 0u; +- v_bit_length_minus_one = 0u; +- while (v_bit_length_minus_one < 8u) { +- v_k = 0u; +- while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { +- v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one)))); +- v_fast = ((uint16_t)(((((uint32_t)((v_bit_length_minus_one + 1u))) << 8u) | ((uint32_t)(self->private_impl.f_huff_tables_symbols[a_tc4_th][v_j]))))); +- v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one)); +- while (v_reps > 0u) { +- self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast; +- v_prefix += 1u; +- v_reps -= 1u; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_k += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_j += 1u; +- } +- v_bit_length_minus_one += 1u; +- } +- return false; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); + +-// -------- func jpeg.decoder.decode_sos ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct_x86_avx2( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_sos( ++wuffs_jpeg__decoder__do_decode_image_config( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_my = 0; +- uint32_t v_mx = 0; +- uint32_t v_decode_mcu_result = 0; +- uint32_t v_bitstream_length = 0; +- +- uint32_t coro_susp_point = self->private_impl.p_decode_sos[0]; +- if (coro_susp_point) { +- v_my = self->private_data.s_decode_sos[0].v_my; +- v_mx = self->private_data.s_decode_sos[0].v_mx; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- if (self->private_impl.f_scan_count >= 64u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count); +- goto exit; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__prepare_scan(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_next_restart_marker = 0u; +- self->private_impl.f_mcu_previous_dc_values[0u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[1u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[2u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[3u] = 0u; +- self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; +- self->private_impl.f_eob_run = 0u; +- self->private_impl.f_bitstream_bits = 0u; +- self->private_impl.f_bitstream_n_bits = 0u; +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- self->private_impl.f_bitstream_padding = 12345u; +- wuffs_jpeg__decoder__fill_bitstream(self, a_src); +- v_my = 0u; +- while (v_my < self->private_impl.f_scan_height_in_mcus) { +- v_mx = 0u; +- while (v_mx < self->private_impl.f_scan_width_in_mcus) { +- self->private_impl.f_mcu_current_block = 0u; +- self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss)); +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf); +- } +- while (true) { +- v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self, a_workbuf, v_mx, v_my); +- if (v_decode_mcu_result == 0u) { +- break; +- } else if (v_decode_mcu_result != 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state); +- goto exit; +- } +- while (true) { +- v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri)); +- wuffs_jpeg__decoder__fill_bitstream(self, a_src); +- if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) { +- break; +- } else if (self->private_impl.f_bitstream_padding == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if ((a_src && a_src->meta.closed) && ! self->private_impl.f_bitstream_is_closed) { +- if (self->private_impl.f_bitstream_wi < 1024u) { +- wuffs_base__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u); +- self->private_impl.f_bitstream_wi += 264u; +- self->private_impl.f_bitstream_is_closed = true; +- } +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- } +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf); +- } +- if (self->private_impl.f_restarts_remaining > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_restarts_remaining -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- if (self->private_impl.f_restarts_remaining == 0u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_mcu_previous_dc_values[0u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[1u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[2u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[3u] = 0u; +- self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; +- self->private_impl.f_eob_run = 0u; +- self->private_impl.f_bitstream_bits = 0u; +- self->private_impl.f_bitstream_n_bits = 0u; +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- self->private_impl.f_bitstream_padding = 12345u; +- } +- } +- v_mx += 1u; +- } +- v_my += 1u; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dqt( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- ok: +- self->private_impl.p_decode_sos[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dri( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_sos[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_sos[0].v_my = v_my; +- self->private_data.s_decode_sos[0].v_mx = v_mx; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_appn( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint8_t a_marker); + +- goto exit; +- exit: +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sof( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +-// -------- func jpeg.decoder.prepare_scan ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__quantize_dimension( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_width, ++ uint8_t a_h, ++ uint8_t a_max_incl_h); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__prepare_scan( ++wuffs_jpeg__decoder__do_decode_frame_config( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_j_max_incl = 0; +- bool v_failed = false; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_prepare_scan[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_prepare_scan[0].v_i; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if ((v_c < 1u) || (v_c > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_num_components = ((uint32_t)(v_c)); +- if ((self->private_impl.f_scan_num_components > self->private_impl.f_num_components) || (self->private_impl.f_payload_length != (4u + (2u * self->private_impl.f_scan_num_components)))) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_j = 0u; +- while (true) { +- if (v_j >= self->private_impl.f_num_components) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- if (v_c == self->private_impl.f_components_c[v_j]) { +- if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table); +- goto exit; +- } +- self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j)); +- break; +- } +- v_j += 1u; +- } +- v_j = 0u; +- while (v_j < v_i) { +- if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- v_j += 1u; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; +- } +- if (((v_c >> 4u) > 3u) || ((v_c & 15u) > 3u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_comps_td[v_i] = (v_c >> 4u); +- self->private_impl.f_scan_comps_ta[v_i] = (v_c & 15u); +- if (self->private_impl.f_sof_marker == 192u) { +- if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } +- v_i += 1u; +- } +- if (self->private_impl.f_sof_marker < 194u) { +- self->private_data.s_prepare_scan[0].scratch = 3u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_prepare_scan[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_prepare_scan[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_prepare_scan[0].scratch; +- self->private_impl.f_scan_ss = 0u; +- self->private_impl.f_scan_se = 63u; +- self->private_impl.f_scan_ah = 0u; +- self->private_impl.f_scan_al = 0u; +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if (v_c > 63u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_ss = v_c; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if ((v_c > 63u) || (v_c < self->private_impl.f_scan_ss)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_se = v_c; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (((v_c >> 4u) > 14u) || ((v_c & 15u) > 13u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_ah = (v_c >> 4u); +- self->private_impl.f_scan_al = (v_c & 15u); +- if (self->private_impl.f_scan_ah > 0u) { +- if ((self->private_impl.f_scan_ah - 1u) != self->private_impl.f_scan_al) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } +- if (self->private_impl.f_scan_ss == 0u) { +- if (self->private_impl.f_scan_se != 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (self->private_impl.f_scan_ah == 0u) { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits); +- } else { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit); +- } +- } else { +- if (self->private_impl.f_scan_num_components != 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (self->private_impl.f_scan_ah == 0u) { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits); +- } else { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit); +- } +- } +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- if ((self->private_impl.f_scan_ss == 0u) && ! self->private_impl.f_seen_dht[(0u | self->private_impl.f_scan_comps_td[v_i])]) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__use_default_huffman_table(self, (0u | self->private_impl.f_scan_comps_td[v_i])); +- if (status.repr) { +- goto suspend; +- } +- } +- if ((self->private_impl.f_scan_se != 0u) && ! self->private_impl.f_seen_dht[(4u | self->private_impl.f_scan_comps_ta[v_i])]) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__use_default_huffman_table(self, (4u | self->private_impl.f_scan_comps_ta[v_i])); +- if (status.repr) { +- goto suspend; +- } +- } +- v_j = ((uint32_t)(self->private_impl.f_scan_ss)); +- v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u))); +- while (v_j <= v_j_max_incl) { +- self->private_impl.f_block_smoothing_lowest_scan_al[self->private_impl.f_scan_comps_cselector[v_i]][v_j] = self->private_impl.f_scan_al; +- v_j += 1u; +- } +- v_i += 1u; +- } +- if (self->private_impl.f_scan_num_components == 1u) { +- wuffs_jpeg__decoder__calculate_single_component_scan_fields(self); +- } else { +- v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self); +- if (v_failed) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- goto ok; +- ok: +- self->private_impl.p_prepare_scan[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- goto suspend; +- suspend: +- self->private_impl.p_prepare_scan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_prepare_scan[0].v_i = v_i; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dht( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_huff_tables( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th, ++ uint32_t a_total_count); + +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sos( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + +-// -------- func jpeg.decoder.use_default_huffman_table ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__prepare_scan( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__use_default_huffman_table( + wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__slice_u8 v_data = {0}; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- if (a_tc4_th == 0u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29); +- } else if (a_tc4_th == 1u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29); +- } else if (a_tc4_th == 4u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179); +- } else if (a_tc4_th == 5u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179); +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table); +- goto exit; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- v_data, +- 0u); +- self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u))); +- { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r); +- v_status = t_0; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- +- ok: +- goto exit; +- exit: +- return status; +-} +- +-// -------- func jpeg.decoder.calculate_single_component_scan_fields ++ uint8_t a_tc4_th); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__calculate_single_component_scan_fields( +- wuffs_jpeg__decoder* self) { +- uint8_t v_csel = 0; +- +- self->private_impl.f_scan_comps_bx_offset[0u] = 0u; +- self->private_impl.f_scan_comps_by_offset[0u] = 0u; +- self->private_impl.f_mcu_num_blocks = 1u; +- self->private_impl.f_mcu_blocks_sselector[0u] = 0u; +- v_csel = self->private_impl.f_scan_comps_cselector[0u]; +- self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel]; +- self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u; +- self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); +- self->private_impl.f_mcu_blocks_dc_hselector[0u] = (0u | self->private_impl.f_scan_comps_td[0u]); +- self->private_impl.f_mcu_blocks_ac_hselector[0u] = (4u | self->private_impl.f_scan_comps_ta[0u]); +- self->private_impl.f_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); +- self->private_impl.f_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.calculate_multiple_component_scan_fields ++ wuffs_jpeg__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + static bool + wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( +- wuffs_jpeg__decoder* self) { +- uint32_t v_i = 0; +- uint32_t v_h = 0; +- uint32_t v_v = 0; +- uint32_t v_hv = 0; +- uint32_t v_total_hv = 0; +- uint32_t v_b = 0; +- uint32_t v_bx_offset = 0; +- uint32_t v_by_offset = 0; +- uint8_t v_ssel = 0; +- uint8_t v_csel = 0; +- +- v_total_hv = 0u; +- v_i = 0u; +- v_b = 0u; +- v_bx_offset = 0u; +- v_by_offset = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])); +- v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]])); +- v_hv = (((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])) * ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]))); +- v_total_hv += v_hv; +- while (v_hv > 0u) { +- self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u))); +- self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u))); +- self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i)); +- v_b += 1u; +- v_bx_offset += 1u; +- if (v_bx_offset == v_h) { +- v_bx_offset = 0u; +- v_by_offset += 1u; +- if (v_by_offset == v_v) { +- v_by_offset = 0u; +- } +- } +- v_hv -= 1u; +- } +- v_i += 1u; +- } +- if (v_total_hv > 10u) { +- return true; +- } +- self->private_impl.f_mcu_num_blocks = v_total_hv; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b]; +- v_csel = self->private_impl.f_scan_comps_cselector[v_ssel]; +- self->private_impl.f_mcu_blocks_offset[v_b] = (self->private_impl.f_components_workbuf_offsets[v_csel] + (8u * ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (8u * ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])))); +- self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel]))); +- self->private_impl.f_mcu_blocks_my_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_v[v_csel])) * self->private_impl.f_components_workbuf_widths[v_csel]); +- self->private_impl.f_mcu_blocks_dc_hselector[v_b] = (0u | self->private_impl.f_scan_comps_td[v_ssel]); +- self->private_impl.f_mcu_blocks_ac_hselector[v_b] = (4u | self->private_impl.f_scan_comps_ta[v_ssel]); +- v_b += 1u; +- } +- self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus; +- self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus; +- return false; +-} +- +-// -------- func jpeg.decoder.fill_bitstream ++ wuffs_jpeg__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__fill_bitstream( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_wi = 0; +- uint8_t v_c = 0; +- uint32_t v_new_wi = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- if (self->private_impl.f_bitstream_ri <= 0u) { +- } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) { +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- } else { +- v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi)); +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = v_wi; +- } +- v_wi = self->private_impl.f_bitstream_wi; +- while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) { +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c < 255u) { +- self->private_data.f_bitstream_buffer[v_wi] = v_c; +- v_wi += 1u; +- iop_a_src += 1u; +- continue; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { +- break; +- } else if ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u) > 0u) { +- break; +- } else { +- self->private_data.f_bitstream_buffer[v_wi] = 255u; +- v_wi += 1u; +- iop_a_src += 2u; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) { +- if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255u) && ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u) > 0u)) { +- v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u); +- v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding)); +- if (v_wi < v_new_wi) { +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi)); +- wuffs_base__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u); +- v_wi = v_new_wi; +- } +- } +- } +- self->private_impl.f_bitstream_wi = v_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.load_mcu_blocks_for_single_component ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44752,9 +44689,7 @@ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel); +-} ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44763,19 +44698,7 @@ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.load_mcu_blocks ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44783,34 +44706,7 @@ wuffs_jpeg__decoder__load_mcu_blocks( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_b = 0; +- uint8_t v_csel = 0; +- uint64_t v_h = 0; +- uint64_t v_v = 0; +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_h = 1u; +- v_v = 1u; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; +- if (self->private_impl.f_scan_num_components > 1u) { +- v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); +- v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); +- } +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(v_csel | 4u)] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_b += 1u; +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.save_mcu_blocks ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44818,4983 +44714,17911 @@ wuffs_jpeg__decoder__save_mcu_blocks( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_b = 0; +- uint8_t v_csel = 0; +- uint64_t v_h = 0; +- uint64_t v_v = 0; +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_h = 1u; +- v_v = 1u; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; +- if (self->private_impl.f_scan_num_components > 1u) { +- v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); +- v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); +- } +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(v_csel | 4u)] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_save_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_b += 1u; +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.skip_past_the_next_restart_marker ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__skip_past_the_next_restart_marker( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) { +- iop_a_src += 1u; +- continue; +- } +- v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))); +- if (v_c < 192u) { +- iop_a_src += 2u; +- continue; +- } else if ((v_c < 208u) || (215u < v_c)) { +- break; +- } +- v_c &= 7u; +- if ((self->private_impl.f_next_restart_marker == ((v_c + 1u) & 7u)) || (self->private_impl.f_next_restart_marker == ((v_c + 2u) & 7u))) { +- break; +- } else if ((self->private_impl.f_next_restart_marker == ((v_c + 7u) & 7u)) || (self->private_impl.f_next_restart_marker == ((v_c + 6u) & 7u))) { +- iop_a_src += 2u; +- continue; +- } else { +- iop_a_src += 2u; +- break; +- } +- } +- self->private_impl.f_next_restart_marker = (((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u); +- +- ok: +- self->private_impl.p_skip_past_the_next_restart_marker[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_past_the_next_restart_marker[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func jpeg.decoder.apply_progressive_idct ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__apply_progressive_idct( + wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_csel = 0; +- bool v_block_smoothing_applicable = false; +- uint32_t v_scan_width_in_mcus = 0; +- uint32_t v_scan_height_in_mcus = 0; +- uint32_t v_mcu_blocks_mx_mul_0 = 0; +- uint32_t v_mcu_blocks_my_mul_0 = 0; +- uint32_t v_my = 0; +- uint32_t v_mx = 0; +- uint64_t v_stride = 0; +- uint64_t v_offset = 0; +- uint8_t v_stashed_mcu_blocks_0[128] = {0}; +- +- wuffs_base__bulk_save_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); +- v_block_smoothing_applicable = true; +- v_csel = 0u; +- while (v_csel < self->private_impl.f_num_components) { +- if ((self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][0u] >= 16u) || wuffs_jpeg__decoder__top_left_quants_has_zero(self, ((uint32_t)(self->private_impl.f_components_tq[v_csel])))) { +- v_block_smoothing_applicable = false; +- } +- v_csel += 1u; +- } +- v_csel = 0u; +- while (v_csel < self->private_impl.f_num_components) { +- v_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); +- v_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); +- v_mcu_blocks_mx_mul_0 = 8u; +- v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); +- if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) { +- self->private_impl.choosy_load_mcu_blocks_for_single_component = ( +- &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth); +- self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u); +- self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u); +- } else { +- self->private_impl.choosy_load_mcu_blocks_for_single_component = ( +- &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default); +- } +- v_my = 0u; +- while (v_my < v_scan_height_in_mcus) { +- v_mx = 0u; +- while (v_mx < v_scan_width_in_mcus) { +- wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self, +- v_mx, +- v_my, +- a_workbuf, +- v_csel); +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); +- v_offset = (self->private_impl.f_components_workbuf_offsets[v_csel] + (((uint64_t)(v_mcu_blocks_mx_mul_0)) * ((uint64_t)(v_mx))) + (((uint64_t)(v_mcu_blocks_my_mul_0)) * ((uint64_t)(v_my)))); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); +- } +- v_mx += 1u; +- } +- v_my += 1u; +- } +- v_csel += 1u; +- } +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.swizzle_gray ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__swizzle_gray( + wuffs_jpeg__decoder* self, + wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_length = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint32_t v_y = 0; +- uint64_t v_stride = 0; +- +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_length = ((uint64_t)((v_dst_bytes_per_pixel * self->private_impl.f_width))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_y = 0u; +- while (v_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (v_dst_length < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_length); +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), a_workbuf); +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])); +- if (v_stride <= ((uint64_t)(a_workbuf.len))) { +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, v_stride); +- } else { +- a_workbuf = wuffs_base__utility__empty_slice_u8(); +- } +- v_y += 1u; +- } +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func jpeg.decoder.swizzle_colorful ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1, ++ uint64_t a_stride); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__swizzle_colorful( + wuffs_jpeg__decoder* self, + wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__slice_u8 v_src0 = {0}; +- wuffs_base__slice_u8 v_src1 = {0}; +- wuffs_base__slice_u8 v_src2 = {0}; +- wuffs_base__slice_u8 v_src3 = {0}; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- if ((self->private_impl.f_components_workbuf_offsets[0u] <= self->private_impl.f_components_workbuf_offsets[1u]) && (self->private_impl.f_components_workbuf_offsets[1u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[0u], +- self->private_impl.f_components_workbuf_offsets[1u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[1u] <= self->private_impl.f_components_workbuf_offsets[2u]) && (self->private_impl.f_components_workbuf_offsets[2u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[1u], +- self->private_impl.f_components_workbuf_offsets[2u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[2u] <= self->private_impl.f_components_workbuf_offsets[3u]) && (self->private_impl.f_components_workbuf_offsets[3u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[2u], +- self->private_impl.f_components_workbuf_offsets[3u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[3u] <= self->private_impl.f_components_workbuf_offsets[4u]) && (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[3u], +- self->private_impl.f_components_workbuf_offsets[4u]); +- } +- v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler, +- a_dst, +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- self->private_impl.f_width, +- self->private_impl.f_height, +- v_src0, +- v_src1, +- v_src2, +- v_src3, +- self->private_impl.f_components_workbuf_widths[0u], +- self->private_impl.f_components_workbuf_widths[1u], +- self->private_impl.f_components_workbuf_widths[2u], +- self->private_impl.f_components_workbuf_widths[3u], +- self->private_impl.f_components_workbuf_heights[0u], +- self->private_impl.f_components_workbuf_heights[1u], +- self->private_impl.f_components_workbuf_heights[2u], +- self->private_impl.f_components_workbuf_heights[3u], +- self->private_impl.f_components_workbuf_widths[0u], +- self->private_impl.f_components_workbuf_widths[1u], +- self->private_impl.f_components_workbuf_widths[2u], +- self->private_impl.f_components_workbuf_widths[3u], +- self->private_impl.f_components_h[0u], +- self->private_impl.f_components_h[1u], +- self->private_impl.f_components_h[2u], +- self->private_impl.f_components_h[3u], +- self->private_impl.f_components_v[0u], +- self->private_impl.f_components_v[1u], +- self->private_impl.f_components_v[2u], +- self->private_impl.f_components_v[3u], +- self->private_impl.f_is_rgb_or_cmyk, +- true, +- wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048)); +- return wuffs_base__status__ensure_not_a_suspension(v_status); +-} +- +-// -------- func jpeg.decoder.frame_dirty_rect ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_jpeg__decoder__frame_dirty_rect( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func jpeg.decoder.num_animation_loops ++static bool ++wuffs_jpeg__decoder__top_left_quants_has_zero( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_q); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_jpeg__decoder__num_animation_loops( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func jpeg.decoder.num_decoded_frame_configs ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__num_decoded_frame_configs( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func jpeg.decoder.num_decoded_frames ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__num_decoded_frames( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func jpeg.decoder.restart_frame ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__restart_frame( ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( + wuffs_jpeg__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- uint32_t v_i = 0; +- uint32_t v_j = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_bitstream_is_closed = false; +- self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_scan_count = 0u; +- self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval; +- v_i = 0u; +- while (v_i < 4u) { +- self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i]; +- v_j = 0u; +- while (v_j < 64u) { +- self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j]; +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 4u) { +- v_j = 0u; +- while (v_j < 10u) { +- self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 8u) { +- self->private_impl.f_seen_dht[v_i] = false; +- v_i += 1u; +- } +- return wuffs_base__make_status(NULL); +-} ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +-// -------- func jpeg.decoder.set_report_metadata ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_jpeg__decoder__set_report_metadata( ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( + wuffs_jpeg__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +-// -------- func jpeg.decoder.tell_me_more ++// ---------------- VTables + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__tell_me_more( ++const wuffs_base__image_decoder__func_ptrs ++wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_jpeg__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_jpeg__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_jpeg__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_jpeg__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_jpeg__decoder__initialize( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default; ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default; ++ self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default; + +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func jpeg.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__history_retain_length( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; ++wuffs_jpeg__decoder* ++wuffs_jpeg__decoder__alloc(void) { ++ wuffs_jpeg__decoder* x = ++ (wuffs_jpeg__decoder*)(calloc(1, sizeof(wuffs_jpeg__decoder))); ++ if (!x) { ++ return NULL; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (wuffs_jpeg__decoder__initialize( ++ x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- return 0u; ++size_t ++sizeof__wuffs_jpeg__decoder(void) { ++ return sizeof(wuffs_jpeg__decoder); + } + +-// -------- func jpeg.decoder.workbuf_len ++// ---------------- Function Implementations ++ ++// -------- func jpeg.decoder.decode_idct + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_jpeg__decoder__workbuf_len( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]); +-} +- +-// -------- func jpeg.decoder.top_left_quants_has_zero +- +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__top_left_quants_has_zero( +- const wuffs_jpeg__decoder* self, ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, + uint32_t a_q) { +- return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][1u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][2u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][3u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][8u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][9u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][10u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][16u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][17u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][24u] == 0u)); ++ return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q); + } + +-// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++wuffs_jpeg__decoder__decode_idct__choosy_default( + wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- uint32_t v_dx = 0; +- uint32_t v_dy = 0; +- uint32_t v_mx = 0; +- uint32_t v_my = 0; +- uint8_t v_q = 0; +- uint32_t v_q_00 = 0; +- uint32_t v_q_xy = 0; +- uint8_t v_al = 0; +- uint32_t v_scratch = 0; +- uint32_t v_limit = 0; ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q) { ++ uint32_t v_bq0 = 0; ++ uint32_t v_bq2 = 0; ++ uint32_t v_bq4 = 0; ++ uint32_t v_bq6 = 0; ++ uint32_t v_ca = 0; ++ uint32_t v_cb2 = 0; ++ uint32_t v_cb6 = 0; ++ uint32_t v_ccp = 0; ++ uint32_t v_ccm = 0; ++ uint32_t v_cd0 = 0; ++ uint32_t v_cd1 = 0; ++ uint32_t v_cd2 = 0; ++ uint32_t v_cd3 = 0; ++ uint32_t v_bq1 = 0; ++ uint32_t v_bq3 = 0; ++ uint32_t v_bq5 = 0; ++ uint32_t v_bq7 = 0; ++ uint32_t v_ci51 = 0; ++ uint32_t v_ci53 = 0; ++ uint32_t v_ci71 = 0; ++ uint32_t v_ci73 = 0; ++ uint32_t v_cj = 0; ++ uint32_t v_ck1 = 0; ++ uint32_t v_ck3 = 0; ++ uint32_t v_ck5 = 0; ++ uint32_t v_ck7 = 0; ++ uint32_t v_cl51 = 0; ++ uint32_t v_cl73 = 0; ++ uint32_t v_in0 = 0; ++ uint32_t v_in2 = 0; ++ uint32_t v_in4 = 0; ++ uint32_t v_in6 = 0; ++ uint32_t v_ra = 0; ++ uint32_t v_rb2 = 0; ++ uint32_t v_rb6 = 0; ++ uint32_t v_rcp = 0; ++ uint32_t v_rcm = 0; ++ uint32_t v_rd0 = 0; ++ uint32_t v_rd1 = 0; ++ uint32_t v_rd2 = 0; ++ uint32_t v_rd3 = 0; ++ uint32_t v_in1 = 0; ++ uint32_t v_in3 = 0; ++ uint32_t v_in5 = 0; ++ uint32_t v_in7 = 0; ++ uint32_t v_ri51 = 0; ++ uint32_t v_ri53 = 0; ++ uint32_t v_ri71 = 0; ++ uint32_t v_ri73 = 0; ++ uint32_t v_rj = 0; ++ uint32_t v_rk1 = 0; ++ uint32_t v_rk3 = 0; ++ uint32_t v_rk5 = 0; ++ uint32_t v_rk7 = 0; ++ uint32_t v_rl51 = 0; ++ uint32_t v_rl73 = 0; ++ uint32_t v_intermediate[64] = {0}; + +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ if (8u > a_dst_stride) { ++ return wuffs_base__make_empty_struct(); + } +- v_dy = 0u; +- while (v_dy < 5u) { +- v_my = wuffs_base__u32__min(self->private_impl.f_block_smoothing_my_max_incl, wuffs_base__u32__sat_sub((a_my + v_dy), 2u)); +- v_dx = 0u; +- while (v_dx < 5u) { +- v_mx = wuffs_base__u32__min(self->private_impl.f_block_smoothing_mx_max_incl, wuffs_base__u32__sat_sub((a_mx + v_dx), 2u)); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_impl.f_block_smoothing_dc_values[v_dy][v_dx], 1u * (size_t)2u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_dx += 1u; +- } +- v_dy += 1u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][8u] | ++ self->private_data.f_mcu_blocks[0u][16u] | ++ self->private_data.f_mcu_blocks[0u][24u] | ++ self->private_data.f_mcu_blocks[0u][32u] | ++ self->private_data.f_mcu_blocks[0u][40u] | ++ self->private_data.f_mcu_blocks[0u][48u] | ++ self->private_data.f_mcu_blocks[0u][56u])) { ++ v_intermediate[0u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))) << 2u)); ++ v_intermediate[8u] = v_intermediate[0u]; ++ v_intermediate[16u] = v_intermediate[0u]; ++ v_intermediate[24u] = v_intermediate[0u]; ++ v_intermediate[32u] = v_intermediate[0u]; ++ v_intermediate[40u] = v_intermediate[0u]; ++ v_intermediate[48u] = v_intermediate[0u]; ++ v_intermediate[56u] = v_intermediate[0u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][16u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][16u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][48u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][48u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][32u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][32u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][8u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][8u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][24u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][24u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][40u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][40u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][56u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][56u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- v_q = self->private_impl.f_components_tq[a_csel]; +- v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u])); +- if (v_q_00 <= 0u) { +- return wuffs_base__make_empty_struct(); ++ if (0u == (self->private_data.f_mcu_blocks[0u][9u] | ++ self->private_data.f_mcu_blocks[0u][17u] | ++ self->private_data.f_mcu_blocks[0u][25u] | ++ self->private_data.f_mcu_blocks[0u][33u] | ++ self->private_data.f_mcu_blocks[0u][41u] | ++ self->private_data.f_mcu_blocks[0u][49u] | ++ self->private_data.f_mcu_blocks[0u][57u])) { ++ v_intermediate[1u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))) << 2u)); ++ v_intermediate[9u] = v_intermediate[1u]; ++ v_intermediate[17u] = v_intermediate[1u]; ++ v_intermediate[25u] = v_intermediate[1u]; ++ v_intermediate[33u] = v_intermediate[1u]; ++ v_intermediate[41u] = v_intermediate[1u]; ++ v_intermediate[49u] = v_intermediate[1u]; ++ v_intermediate[57u] = v_intermediate[1u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][17u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][17u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][49u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][49u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][33u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][33u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][9u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][9u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][25u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][25u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][41u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][41u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][57u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][57u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- if (0u != (16u & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u))); +- } +- self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch)); +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch)); +- } ++ if (0u == (self->private_data.f_mcu_blocks[0u][10u] | ++ self->private_data.f_mcu_blocks[0u][18u] | ++ self->private_data.f_mcu_blocks[0u][26u] | ++ self->private_data.f_mcu_blocks[0u][34u] | ++ self->private_data.f_mcu_blocks[0u][42u] | ++ self->private_data.f_mcu_blocks[0u][50u] | ++ self->private_data.f_mcu_blocks[0u][58u])) { ++ v_intermediate[2u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))) << 2u)); ++ v_intermediate[10u] = v_intermediate[2u]; ++ v_intermediate[18u] = v_intermediate[2u]; ++ v_intermediate[26u] = v_intermediate[2u]; ++ v_intermediate[34u] = v_intermediate[2u]; ++ v_intermediate[42u] = v_intermediate[2u]; ++ v_intermediate[50u] = v_intermediate[2u]; ++ v_intermediate[58u] = v_intermediate[2u]; + } else { +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); +- } ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][18u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][18u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][50u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][50u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][34u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][34u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][10u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][10u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][26u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][26u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][42u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][42u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][58u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][58u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.decode_mcu +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- return (*self->private_impl.choosy_decode_mcu)(self, a_workbuf, a_mx, a_my); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint8_t v_csel = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- uint8_t v_dc_h = 0; +- uint32_t v_dc_symbol = 0; +- uint32_t v_dc_ht_fast = 0; +- uint32_t v_dc_bl = 0; +- uint32_t v_dc_code = 0; +- uint32_t v_dc_blm1 = 0; +- uint32_t v_dc_ht_slow = 0; +- uint16_t v_dc_value = 0; +- uint16_t v_dc_extend = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint16_t v_ac_extend = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint32_t v_z = 0; +- uint32_t v_mcb = 0; +- uint64_t v_stride = 0; +- uint64_t v_offset = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][11u] | ++ self->private_data.f_mcu_blocks[0u][19u] | ++ self->private_data.f_mcu_blocks[0u][27u] | ++ self->private_data.f_mcu_blocks[0u][35u] | ++ self->private_data.f_mcu_blocks[0u][43u] | ++ self->private_data.f_mcu_blocks[0u][51u] | ++ self->private_data.f_mcu_blocks[0u][59u])) { ++ v_intermediate[3u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))) << 2u)); ++ v_intermediate[11u] = v_intermediate[3u]; ++ v_intermediate[19u] = v_intermediate[3u]; ++ v_intermediate[27u] = v_intermediate[3u]; ++ v_intermediate[35u] = v_intermediate[3u]; ++ v_intermediate[43u] = v_intermediate[3u]; ++ v_intermediate[51u] = v_intermediate[3u]; ++ v_intermediate[59u] = v_intermediate[3u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][19u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][19u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][51u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][51u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][35u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][35u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][11u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][11u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][27u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][27u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][43u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][43u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][59u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][59u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- while (self->private_impl.f_mcu_zig_index <= 0u) { +- wuffs_base__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; +- v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); +- v_dc_bl = (v_dc_ht_fast >> 8u); +- if (v_n_bits >= v_dc_bl) { +- v_dc_symbol = (15u & v_dc_ht_fast); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- v_bits <<= (v_dc_bl & 63u); +- v_n_bits -= v_dc_bl; +- } else { +- v_dc_code = ((uint32_t)((v_bits >> 55u))); +- v_dc_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; +- if (v_dc_code < (v_dc_ht_slow >> 8u)) { +- v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); +- if (v_dc_blm1 == 0u) { +- v_dc_symbol = 0u; +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- } +- } +- v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); +- v_dc_value += (v_dc_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_dc_symbol; +- v_n_bits -= v_dc_symbol; +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; +- self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; +- self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel]; +- self->private_impl.f_mcu_zig_index = 1u; +- break; +- } +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- if (v_n_bits < 16u) { +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- } +- v_z = 1u; +- self->private_impl.f_mcu_zig_index = 0u; +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (v_z < 64u) { +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_z += (v_ac_rrrr + 1u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; +- if (v_ac_ssss > 0u) { +- v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); +- v_ac_value += (v_ac_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_ac_ssss; +- v_n_bits -= v_ac_ssss; +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value; +- } else if (v_ac_rrrr < 15u) { +- break; +- } +- } +- v_mcb = self->private_impl.f_mcu_current_block; +- self->private_impl.f_mcu_current_block += 1u; +- if (self->private_impl.f_test_only_interrupt_decode_mcu) { +- goto label__goto_done__break; +- } +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); +- v_offset = (self->private_impl.f_mcu_blocks_offset[v_mcb] + (((uint64_t)(self->private_impl.f_mcu_blocks_mx_mul[v_mcb])) * ((uint64_t)(a_mx))) + (((uint64_t)(self->private_impl.f_mcu_blocks_my_mul[v_mcb])) * ((uint64_t)(a_my)))); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); +- } +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; ++ if (0u == (self->private_data.f_mcu_blocks[0u][12u] | ++ self->private_data.f_mcu_blocks[0u][20u] | ++ self->private_data.f_mcu_blocks[0u][28u] | ++ self->private_data.f_mcu_blocks[0u][36u] | ++ self->private_data.f_mcu_blocks[0u][44u] | ++ self->private_data.f_mcu_blocks[0u][52u] | ++ self->private_data.f_mcu_blocks[0u][60u])) { ++ v_intermediate[4u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))) << 2u)); ++ v_intermediate[12u] = v_intermediate[4u]; ++ v_intermediate[20u] = v_intermediate[4u]; ++ v_intermediate[28u] = v_intermediate[4u]; ++ v_intermediate[36u] = v_intermediate[4u]; ++ v_intermediate[44u] = v_intermediate[4u]; ++ v_intermediate[52u] = v_intermediate[4u]; ++ v_intermediate[60u] = v_intermediate[4u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][20u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][20u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][52u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][52u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][36u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][36u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][12u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][12u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][28u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][28u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][44u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][44u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][60u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][60u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint16_t v_ac_extend = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint32_t v_z = 0; +- +- if (self->private_impl.f_eob_run > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_eob_run -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- return 0u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][13u] | ++ self->private_data.f_mcu_blocks[0u][21u] | ++ self->private_data.f_mcu_blocks[0u][29u] | ++ self->private_data.f_mcu_blocks[0u][37u] | ++ self->private_data.f_mcu_blocks[0u][45u] | ++ self->private_data.f_mcu_blocks[0u][53u] | ++ self->private_data.f_mcu_blocks[0u][61u])) { ++ v_intermediate[5u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))) << 2u)); ++ v_intermediate[13u] = v_intermediate[5u]; ++ v_intermediate[21u] = v_intermediate[5u]; ++ v_intermediate[29u] = v_intermediate[5u]; ++ v_intermediate[37u] = v_intermediate[5u]; ++ v_intermediate[45u] = v_intermediate[5u]; ++ v_intermediate[53u] = v_intermediate[5u]; ++ v_intermediate[61u] = v_intermediate[5u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][21u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][21u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][53u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][53u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][37u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][37u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][13u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][13u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][29u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][29u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][45u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][45u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][61u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][61u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][14u] | ++ self->private_data.f_mcu_blocks[0u][22u] | ++ self->private_data.f_mcu_blocks[0u][30u] | ++ self->private_data.f_mcu_blocks[0u][38u] | ++ self->private_data.f_mcu_blocks[0u][46u] | ++ self->private_data.f_mcu_blocks[0u][54u] | ++ self->private_data.f_mcu_blocks[0u][62u])) { ++ v_intermediate[6u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))) << 2u)); ++ v_intermediate[14u] = v_intermediate[6u]; ++ v_intermediate[22u] = v_intermediate[6u]; ++ v_intermediate[30u] = v_intermediate[6u]; ++ v_intermediate[38u] = v_intermediate[6u]; ++ v_intermediate[46u] = v_intermediate[6u]; ++ v_intermediate[54u] = v_intermediate[6u]; ++ v_intermediate[62u] = v_intermediate[6u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][22u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][22u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][54u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][54u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][38u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][38u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][14u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][14u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][30u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][30u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][46u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][46u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][62u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][62u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- if (v_n_bits < 16u) { +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- } +- v_z = self->private_impl.f_mcu_zig_index; +- self->private_impl.f_mcu_zig_index = 0u; +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) { +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_z += (v_ac_rrrr + 1u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; +- if (v_ac_ssss > 0u) { +- v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); +- v_ac_value += (v_ac_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_ac_ssss; +- v_n_bits -= v_ac_ssss; +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = ((uint16_t)(((uint16_t)(v_ac_value << self->private_impl.f_scan_al)))); +- } else if (v_ac_rrrr < 15u) { +- self->private_impl.f_eob_run = ((uint16_t)(((((uint16_t)(1u)) << v_ac_rrrr) - 1u))); +- if (v_ac_rrrr > 0u) { +- self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); +- v_bits <<= v_ac_rrrr; +- v_n_bits -= v_ac_rrrr; +- } +- break; +- } +- } +- } while (0); +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; ++ if (0u == (self->private_data.f_mcu_blocks[0u][15u] | ++ self->private_data.f_mcu_blocks[0u][23u] | ++ self->private_data.f_mcu_blocks[0u][31u] | ++ self->private_data.f_mcu_blocks[0u][39u] | ++ self->private_data.f_mcu_blocks[0u][47u] | ++ self->private_data.f_mcu_blocks[0u][55u] | ++ self->private_data.f_mcu_blocks[0u][63u])) { ++ v_intermediate[7u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))) << 2u)); ++ v_intermediate[15u] = v_intermediate[7u]; ++ v_intermediate[23u] = v_intermediate[7u]; ++ v_intermediate[31u] = v_intermediate[7u]; ++ v_intermediate[39u] = v_intermediate[7u]; ++ v_intermediate[47u] = v_intermediate[7u]; ++ v_intermediate[55u] = v_intermediate[7u]; ++ v_intermediate[63u] = v_intermediate[7u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][23u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][23u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][55u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][55u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][39u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][39u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][15u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][15u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][31u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][31u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][47u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][47u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][63u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][63u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint16_t v_one_lshift_scan_al = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint8_t v_unzig = 0; +- bool v_bit = false; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- v_one_lshift_scan_al = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- while (true) { +- if (self->private_impl.f_eob_run > 0u) { +- break; +- } +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (true) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_value = 0u; +- if (v_ac_ssss > 0u) { +- v_ac_value = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if ((v_bits >> 63u) == 0u) { +- v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al)); +- } +- v_bits <<= 1u; +- v_n_bits -= 1u; +- } else if (v_ac_rrrr < 15u) { +- self->private_impl.f_eob_run = (((uint16_t)(1u)) << v_ac_rrrr); +- if (v_ac_rrrr > 0u) { +- self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); +- v_bits <<= v_ac_rrrr; +- v_n_bits -= v_ac_rrrr; +- } +- goto label__goto_do_eob__break; +- } +- while (true) { +- v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; +- if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { +- if (v_n_bits == 0u) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- } +- v_bit = ((v_bits >> 63u) > 0u); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- if (v_bit) { +- if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- } else if (v_ac_rrrr <= 0u) { +- break; +- } else { +- v_ac_rrrr -= 1u; +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +- if (v_ac_value != 0u) { +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value; +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +- goto label__block__break; +- } +- label__goto_do_eob__break:; +- if (self->private_impl.f_eob_run <= 0u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- while (true) { +- v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; +- if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { +- if (v_n_bits == 0u) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- } +- v_bit = ((v_bits >> 63u) > 0u); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- if (v_bit) { +- if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_eob_run -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } while (0); +- label__block__break:; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ if (0u == (v_intermediate[1u] | ++ v_intermediate[2u] | ++ v_intermediate[3u] | ++ v_intermediate[4u] | ++ v_intermediate[5u] | ++ v_intermediate[6u] | ++ v_intermediate[7u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint8_t v_csel = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- uint8_t v_dc_h = 0; +- uint32_t v_dc_symbol = 0; +- uint32_t v_dc_ht_fast = 0; +- uint32_t v_dc_bl = 0; +- uint32_t v_dc_code = 0; +- uint32_t v_dc_blm1 = 0; +- uint32_t v_dc_ht_slow = 0; +- uint16_t v_dc_value = 0; +- uint16_t v_dc_extend = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; +- v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); +- v_dc_bl = (v_dc_ht_fast >> 8u); +- if (v_n_bits >= v_dc_bl) { +- v_dc_symbol = (15u & v_dc_ht_fast); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- v_bits <<= (v_dc_bl & 63u); +- v_n_bits -= v_dc_bl; +- } else { +- v_dc_code = ((uint32_t)((v_bits >> 55u))); +- v_dc_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; +- if (v_dc_code < (v_dc_ht_slow >> 8u)) { +- v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); +- if (v_dc_blm1 == 0u) { +- v_dc_symbol = 0u; +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- } +- } +- v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); +- v_dc_value += (v_dc_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_dc_symbol; +- v_n_bits -= v_dc_symbol; +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; +- self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; +- self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] = ((uint16_t)(self->private_impl.f_mcu_previous_dc_values[v_csel] << self->private_impl.f_scan_al)); +- } while (0); +- self->private_impl.f_mcu_current_block += 1u; +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[2u]; ++ v_in6 = v_intermediate[6u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[0u]; ++ v_in4 = v_intermediate[4u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[1u]; ++ v_in3 = v_intermediate[3u]; ++ v_in5 = v_intermediate[5u]; ++ v_in7 = v_intermediate[7u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint16_t v_one_lshift_scan_al = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- v_one_lshift_scan_al = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- if ((v_bits >> 63u) != 0u) { +- self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al; +- } +- v_bits <<= 1u; +- v_n_bits -= 1u; +- } while (0); +- self->private_impl.f_mcu_current_block += 1u; +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ if (0u == (v_intermediate[9u] | ++ v_intermediate[10u] | ++ v_intermediate[11u] | ++ v_intermediate[12u] | ++ v_intermediate[13u] | ++ v_intermediate[14u] | ++ v_intermediate[15u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code"; +-const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8"; +-const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape"; +-const char wuffs_json__error__bad_input[] = "#json: bad input"; +-const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string"; +-const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination"; +-const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length"; +-const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth"; +-const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O"; +- +-// ---------------- Private Consts +- +-#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99 +- +-static const uint8_t +-WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 3, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 162, 0, 0, 0, 0, 5, +- 0, 0, 0, 0, 0, 0, 0, 175, +- 7, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 4, +- 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, 220, 0, 0, 0, +- 0, 1, 136, 0, 0, 2, 140, 0, +- 0, 0, 0, 0, 0, 0, 138, 0, +- 0, 0, 141, 0, 137, 0, 6, 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, 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, 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, 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, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 3, 4, 5, 6, 7, 10, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 7, 27, 10, 63, 39, 11, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 138, 139, 140, 141, 142, 143, +- 144, 145, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 155, 156, 157, 158, 159, +- 0, 0, 1, 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, 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, 2, 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, 0, 0, 0, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 32, 32, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 5, 5, 5, 5, 5, 32, 32, 32, +- 32, 32, 32, 32, 32, 32, 32, 32, +-}; +- +-#define WUFFS_JSON__CLASS_WHITESPACE 0 +- +-#define WUFFS_JSON__CLASS_STRING 1 +- +-#define WUFFS_JSON__CLASS_COMMA 2 +- +-#define WUFFS_JSON__CLASS_COLON 3 +- +-#define WUFFS_JSON__CLASS_NUMBER 4 +- +-#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5 +- +-#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6 +- +-#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7 +- +-#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8 +- +-#define WUFFS_JSON__CLASS_FALSE 9 +- +-#define WUFFS_JSON__CLASS_TRUE 10 +- +-#define WUFFS_JSON__CLASS_NULL_NAN_INF 11 +- +-#define WUFFS_JSON__CLASS_COMMENT 12 +- +-#define WUFFS_JSON__EXPECT_VALUE 7858 +- +-#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856 +- +-#define WUFFS_JSON__EXPECT_STRING 4098 +- +-#define WUFFS_JSON__EXPECT_COMMA 4100 +- +-#define WUFFS_JSON__EXPECT_COLON 4104 +- +-#define WUFFS_JSON__EXPECT_NUMBER 4112 +- +-#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160 +- +-#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352 +- +-static const uint8_t +-WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 0, 0, 15, 15, 0, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 0, 15, 1, 15, 15, 15, 15, 15, +- 15, 15, 15, 11, 2, 4, 15, 12, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 3, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 11, 15, 15, 15, 15, 11, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 7, 15, 8, 15, 15, +- 15, 15, 15, 15, 15, 15, 9, 15, +- 15, 11, 15, 15, 15, 15, 11, 15, +- 15, 15, 15, 15, 10, 15, 15, 15, +- 15, 15, 15, 5, 15, 6, 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, 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, 15, 15, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 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, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 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, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 0, 0, 0, 0, 0, 0, +- 0, 138, 139, 140, 141, 142, 143, 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, 138, 139, 140, 141, 142, 143, 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, 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, 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, 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, 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, +-}; +- +-#define WUFFS_JSON__QUIRKS_BASE 1225364480 +- +-#define WUFFS_JSON__QUIRKS_COUNT 21 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_number( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_digits( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src, +- uint32_t a_n); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_leading( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_comment( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_inf_nan( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_trailer( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__token_decoder__func_ptrs +-wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__token_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_json__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_json__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_json__decoder__set_quirk), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_json__decoder__initialize( +- wuffs_json__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[10u]; ++ v_in6 = v_intermediate[14u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[8u]; ++ v_in4 = v_intermediate[12u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[9u]; ++ v_in3 = v_intermediate[11u]; ++ v_in5 = v_intermediate[13u]; ++ v_in7 = v_intermediate[15u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (0u == (v_intermediate[17u] | ++ v_intermediate[18u] | ++ v_intermediate[19u] | ++ v_intermediate[20u] | ++ v_intermediate[21u] | ++ v_intermediate[22u] | ++ v_intermediate[23u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_in2 = v_intermediate[18u]; ++ v_in6 = v_intermediate[22u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[16u]; ++ v_in4 = v_intermediate[20u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[17u]; ++ v_in3 = v_intermediate[19u]; ++ v_in5 = v_intermediate[21u]; ++ v_in7 = v_intermediate[23u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = +- wuffs_base__token_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = +- (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_json__decoder* +-wuffs_json__decoder__alloc(void) { +- wuffs_json__decoder* x = +- (wuffs_json__decoder*)(calloc(sizeof(wuffs_json__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_json__decoder__initialize( +- x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_json__decoder(void) { +- return sizeof(wuffs_json__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func json.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__get_quirk( +- const wuffs_json__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- uint32_t v_key = 0; +- +- if (a_key >= 1225364480u) { +- v_key = (a_key - 1225364480u); +- if (v_key < 21u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; +- } ++ if (0u == (v_intermediate[25u] | ++ v_intermediate[26u] | ++ v_intermediate[27u] | ++ v_intermediate[28u] | ++ v_intermediate[29u] | ++ v_intermediate[30u] | ++ v_intermediate[31u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- } +- return 0u; +-} +- +-// -------- func json.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_json__decoder__set_quirk( +- wuffs_json__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (a_key >= 1225364480u) { +- a_key -= 1225364480u; +- if (a_key < 21u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[26u]; ++ v_in6 = v_intermediate[30u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[24u]; ++ v_in4 = v_intermediate[28u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[25u]; ++ v_in3 = v_intermediate[27u]; ++ v_in5 = v_intermediate[29u]; ++ v_in7 = v_intermediate[31u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func json.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__history_retain_length( +- const wuffs_json__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (0u == (v_intermediate[33u] | ++ v_intermediate[34u] | ++ v_intermediate[35u] | ++ v_intermediate[36u] | ++ v_intermediate[37u] | ++ v_intermediate[38u] | ++ v_intermediate[39u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[34u]; ++ v_in6 = v_intermediate[38u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[32u]; ++ v_in4 = v_intermediate[36u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[33u]; ++ v_in3 = v_intermediate[35u]; ++ v_in5 = v_intermediate[37u]; ++ v_in7 = v_intermediate[39u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- return 0u; +-} +- +-// -------- func json.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_json__decoder__workbuf_len( +- const wuffs_json__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[41u] | ++ v_intermediate[42u] | ++ v_intermediate[43u] | ++ v_intermediate[44u] | ++ v_intermediate[45u] | ++ v_intermediate[46u] | ++ v_intermediate[47u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[42u]; ++ v_in6 = v_intermediate[46u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[40u]; ++ v_in4 = v_intermediate[44u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[41u]; ++ v_in3 = v_intermediate[43u]; ++ v_in5 = v_intermediate[45u]; ++ v_in7 = v_intermediate[47u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[49u] | ++ v_intermediate[50u] | ++ v_intermediate[51u] | ++ v_intermediate[52u] | ++ v_intermediate[53u] | ++ v_intermediate[54u] | ++ v_intermediate[55u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[50u]; ++ v_in6 = v_intermediate[54u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[48u]; ++ v_in4 = v_intermediate[52u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[49u]; ++ v_in3 = v_intermediate[51u]; ++ v_in5 = v_intermediate[53u]; ++ v_in7 = v_intermediate[55u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[57u] | ++ v_intermediate[58u] | ++ v_intermediate[59u] | ++ v_intermediate[60u] | ++ v_intermediate[61u] | ++ v_intermediate[62u] | ++ v_intermediate[63u])) { ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ } else { ++ v_in2 = v_intermediate[58u]; ++ v_in6 = v_intermediate[62u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[56u]; ++ v_in4 = v_intermediate[60u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[57u]; ++ v_in3 = v_intermediate[59u]; ++ v_in5 = v_intermediate[61u]; ++ v_in7 = v_intermediate[63u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_tokens ++// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 ++// -------- func jpeg.decoder.decode_idct_x86_avx2 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_json__decoder__decode_tokens( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_vminor = 0; +- uint32_t v_number_length = 0; +- uint32_t v_number_status = 0; +- uint32_t v_string_length = 0; +- uint32_t v_whitespace_length = 0; +- uint32_t v_depth = 0; +- uint32_t v_stack_byte = 0; +- uint32_t v_stack_bit = 0; +- uint32_t v_match = 0; +- uint32_t v_c4 = 0; +- uint8_t v_c = 0; +- uint8_t v_backslash = 0; +- uint8_t v_char = 0; +- uint8_t v_class = 0; +- uint32_t v_multi_byte_utf8 = 0; +- uint8_t v_backslash_x_ok = 0; +- uint8_t v_backslash_x_value = 0; +- uint32_t v_backslash_x_string = 0; +- uint8_t v_uni4_ok = 0; +- uint64_t v_uni4_string = 0; +- uint32_t v_uni4_value = 0; +- uint32_t v_uni4_high_surrogate = 0; +- uint8_t v_uni8_ok = 0; +- uint64_t v_uni8_string = 0; +- uint32_t v_uni8_value = 0; +- uint32_t v_expect = 0; +- uint32_t v_expect_after_value = 0; +- +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct_x86_avx2( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q) { ++ __m256i v_k_0000 = {0}; ++ __m256i v_k_8080 = {0}; ++ __m256i v_k_0000_0002 = {0}; ++ __m256i v_k_0001_FFFF = {0}; ++ __m256i v_k_0400_0000 = {0}; ++ __m256i v_k_29CF_1151_D630_1151 = {0}; ++ __m256i v_k_E333_133E_ADFD_1051 = {0}; ++ __m256i v_k_E6DC_25A1_1925_25A1 = {0}; ++ __m256i v_k_ECC1_E333_EFB0_ADFD = {0}; ++ __m128i v_az_coeffs = {0}; ++ __m256i v_az_ah00 = {0}; ++ __m256i v_az_ad00 = {0}; ++ __m256i v_az_eh00 = {0}; ++ __m256i v_az_adeh = {0}; ++ __m256i v_rows01 = {0}; ++ __m256i v_rows23 = {0}; ++ __m256i v_rows45 = {0}; ++ __m256i v_rows67 = {0}; ++ __m256i v_quants01 = {0}; ++ __m256i v_quants23 = {0}; ++ __m256i v_quants45 = {0}; ++ __m256i v_quants67 = {0}; ++ __m256i v_rows04 = {0}; ++ __m256i v_rows31 = {0}; ++ __m256i v_rows26 = {0}; ++ __m256i v_rows75 = {0}; ++ __m256i v_fp_rows62 = {0}; ++ __m256i v_fp_bq2662ad = {0}; ++ __m256i v_fp_bq2662eh = {0}; ++ __m256i v_fp_cb26ad = {0}; ++ __m256i v_fp_cb26eh = {0}; ++ __m256i v_fp_rows40pos = {0}; ++ __m256i v_fp_rows04neg = {0}; ++ __m256i v_fp_rows0pm4 = {0}; ++ __m256i v_fp_ccpmad = {0}; ++ __m256i v_fp_ccpmeh = {0}; ++ __m256i v_fp_cd01ad = {0}; ++ __m256i v_fp_cd01eh = {0}; ++ __m256i v_fp_cd32ad = {0}; ++ __m256i v_fp_cd32eh = {0}; ++ __m256i v_fp_sums7351 = {0}; ++ __m256i v_fp_sums5173 = {0}; ++ __m256i v_fp_ci73515173ad = {0}; ++ __m256i v_fp_ci73515173eh = {0}; ++ __m256i v_fp_cl7351ad = {0}; ++ __m256i v_fp_cl7351eh = {0}; ++ __m256i v_fp_rows13 = {0}; ++ __m256i v_fp_bq7153ad = {0}; ++ __m256i v_fp_bq7153eh = {0}; ++ __m256i v_fp_ck75ad = {0}; ++ __m256i v_fp_ck75eh = {0}; ++ __m256i v_fp_cl5173ad = {0}; ++ __m256i v_fp_cl5173eh = {0}; ++ __m256i v_fp_ck13ad = {0}; ++ __m256i v_fp_ck13eh = {0}; ++ __m256i v_intermediate01ad = {0}; ++ __m256i v_intermediate01eh = {0}; ++ __m256i v_intermediate01 = {0}; ++ __m256i v_intermediate32ad = {0}; ++ __m256i v_intermediate32eh = {0}; ++ __m256i v_intermediate32 = {0}; ++ __m256i v_intermediate45ad = {0}; ++ __m256i v_intermediate45eh = {0}; ++ __m256i v_intermediate45 = {0}; ++ __m256i v_intermediate76ad = {0}; ++ __m256i v_intermediate76eh = {0}; ++ __m256i v_intermediate76 = {0}; ++ __m256i v_ita0a1e0e1 = {0}; ++ __m256i v_ita2a3e2e3 = {0}; ++ __m256i v_ita4a5e4e5 = {0}; ++ __m256i v_ita6a7e6e7 = {0}; ++ __m256i v_ita0c0e0g0 = {0}; ++ __m256i v_ita1c1e1g1 = {0}; ++ __m256i v_ita4c4e4g4 = {0}; ++ __m256i v_ita5c5e5g5 = {0}; ++ __m256i v_ita0b0e0f0 = {0}; ++ __m256i v_ita4b4e4f4 = {0}; ++ __m256i v_itc0d0g0h0 = {0}; ++ __m256i v_itc4d4g4h4 = {0}; ++ __m256i v_intermediateae = {0}; ++ __m256i v_intermediatebf = {0}; ++ __m256i v_intermediatecg = {0}; ++ __m256i v_intermediatedh = {0}; ++ __m256i v_intermediatedb = {0}; ++ __m256i v_intermediatehf = {0}; ++ __m256i v_sp_cols62 = {0}; ++ __m256i v_sp_bq2662ad = {0}; ++ __m256i v_sp_bq2662eh = {0}; ++ __m256i v_sp_rb26ad = {0}; ++ __m256i v_sp_rb26eh = {0}; ++ __m256i v_sp_cols40pos = {0}; ++ __m256i v_sp_cols04neg = {0}; ++ __m256i v_sp_cols0pm4 = {0}; ++ __m256i v_sp_rcpmad = {0}; ++ __m256i v_sp_rcpmeh = {0}; ++ __m256i v_sp_rd01ad = {0}; ++ __m256i v_sp_rd01eh = {0}; ++ __m256i v_sp_rd32ad = {0}; ++ __m256i v_sp_rd32eh = {0}; ++ __m256i v_sp_sums7351 = {0}; ++ __m256i v_sp_sums5173 = {0}; ++ __m256i v_sp_ri73515173ad = {0}; ++ __m256i v_sp_ri73515173eh = {0}; ++ __m256i v_sp_rl7351ad = {0}; ++ __m256i v_sp_rl7351eh = {0}; ++ __m256i v_sp_cols13 = {0}; ++ __m256i v_sp_bq7153ad = {0}; ++ __m256i v_sp_bq7153eh = {0}; ++ __m256i v_sp_rk75ad = {0}; ++ __m256i v_sp_rk75eh = {0}; ++ __m256i v_sp_rl5173ad = {0}; ++ __m256i v_sp_rl5173eh = {0}; ++ __m256i v_sp_rk13ad = {0}; ++ __m256i v_sp_rk13eh = {0}; ++ __m256i v_final01ad = {0}; ++ __m256i v_final01eh = {0}; ++ __m256i v_final01 = {0}; ++ __m256i v_final32ad = {0}; ++ __m256i v_final32eh = {0}; ++ __m256i v_final32 = {0}; ++ __m256i v_final45ad = {0}; ++ __m256i v_final45eh = {0}; ++ __m256i v_final45 = {0}; ++ __m256i v_final76ad = {0}; ++ __m256i v_final76eh = {0}; ++ __m256i v_final76 = {0}; ++ __m256i v_fta0a1e0e1 = {0}; ++ __m256i v_fta2a3e2e3 = {0}; ++ __m256i v_fta4a5e4e5 = {0}; ++ __m256i v_fta6a7e6e7 = {0}; ++ __m256i v_fta0c0e0g0 = {0}; ++ __m256i v_fta1c1e1g1 = {0}; ++ __m256i v_fta4c4e4g4 = {0}; ++ __m256i v_fta5c5e5g5 = {0}; ++ __m256i v_fta0b0e0f0 = {0}; ++ __m256i v_ftc0d0g0h0 = {0}; ++ __m256i v_fta4b4e4f4 = {0}; ++ __m256i v_ftc4d4g4h4 = {0}; ++ __m256i v_finalae = {0}; ++ __m256i v_finalbf = {0}; ++ __m256i v_finalcg = {0}; ++ __m256i v_finaldh = {0}; ++ __m256i v_final0145 = {0}; ++ __m256i v_final2367 = {0}; ++ uint64_t v_final0 = 0; ++ uint64_t v_final1 = 0; ++ uint64_t v_final2 = 0; ++ uint64_t v_final3 = 0; ++ uint64_t v_final4 = 0; ++ uint64_t v_final5 = 0; ++ uint64_t v_final6 = 0; ++ uint64_t v_final7 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; + +- uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; +- if (coro_susp_point) { +- v_depth = self->private_data.s_decode_tokens[0].v_depth; +- v_expect = self->private_data.s_decode_tokens[0].v_expect; +- v_expect_after_value = self->private_data.s_decode_tokens[0].v_expect_after_value; ++ if (8u > a_dst_stride) { ++ return wuffs_base__make_empty_struct(); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_end_of_data) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_quirks[18u]) { +- if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) { +- status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination); +- goto exit; ++ v_k_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u)); ++ v_k_8080 = _mm256_set_epi16((int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u)); ++ v_k_0000_0002 = _mm256_set_epi16((int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u)); ++ v_k_0001_FFFF = _mm256_set_epi16((int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u)); ++ v_k_0400_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u)); ++ v_k_29CF_1151_D630_1151 = _mm256_set_epi16((int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u)); ++ v_k_E333_133E_ADFD_1051 = _mm256_set_epi16((int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u)); ++ v_k_E6DC_25A1_1925_25A1 = _mm256_set_epi16((int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u)); ++ v_k_ECC1_E333_EFB0_ADFD = _mm256_set_epi16((int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u)); ++ do { ++ if (0u == (wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)) | wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)))) { ++ v_az_coeffs = _mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 24u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 40u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 56u))); ++ if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) { ++ v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); ++ v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); ++ v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); ++ v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u)); ++ v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00); ++ v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00); ++ v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u)); ++ v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u)); ++ v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u)); ++ v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u)); ++ v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u)); ++ break; + } + } +- if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_json__decoder__decode_leading(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } ++ v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); ++ v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)); ++ v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u)); ++ v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u)); ++ v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); ++ v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u)); ++ v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u)); ++ v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u)); ++ v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); ++ v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23); ++ v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45); ++ v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67); ++ v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u)); ++ v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u)); ++ v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u)); ++ v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u)); ++ v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u)); ++ v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62); ++ v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62); ++ v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151); ++ v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151); ++ v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u)); ++ v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF); ++ v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg); ++ v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); ++ v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); ++ v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad); ++ v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh); ++ v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad); ++ v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh); ++ v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31); ++ v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u)); ++ v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173); ++ v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173); ++ v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1); ++ v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1); ++ v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u)); ++ v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13); ++ v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13); ++ v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad); ++ v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh); ++ v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u)); ++ v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u)); ++ v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051)); ++ v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051)); ++ v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh); ++ v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh); ++ v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh); ++ v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh); ++ v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u)); ++ v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u)); ++ v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u)); ++ v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u)); ++ v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3); ++ v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3); ++ v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7); ++ v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7); ++ v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1); ++ v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1); ++ v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5); ++ v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5); ++ v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4); ++ v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4); ++ v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4); ++ v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4); ++ } while (0); ++ v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u)); ++ v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u)); ++ v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u)); ++ v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62); ++ v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62); ++ v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151); ++ v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151); ++ v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u)); ++ v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF); ++ v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg); ++ v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); ++ v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); ++ v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad); ++ v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh); ++ v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad); ++ v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh); ++ v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb); ++ v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u)); ++ v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173); ++ v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173); ++ v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1); ++ v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1); ++ v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u)); ++ v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13); ++ v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13); ++ v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad); ++ v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh); ++ v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u)); ++ v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u)); ++ v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051)); ++ v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051)); ++ v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh); ++ v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh); ++ v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh); ++ v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh); ++ v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u)); ++ v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u)); ++ v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u)); ++ v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u)); ++ v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3); ++ v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3); ++ v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7); ++ v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7); ++ v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1); ++ v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1); ++ v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5); ++ v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5); ++ v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4); ++ v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4); ++ v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); ++ v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); ++ v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080); ++ v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080); ++ v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u)))); ++ v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u)))); ++ v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u)))); ++ v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u)))); ++ v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u)))); ++ v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u)))); ++ v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u)))); ++ v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u)))); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6); ++ a_dst_buffer = v_remaining; ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 ++ ++// -------- func jpeg.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__get_quirk( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 2u) { ++ if (self->private_impl.f_use_lower_quality) { ++ return 18446744073709551615u; ++ } ++ } else if (a_key == 1220532224u) { ++ if (self->private_impl.f_reject_progressive_jpegs) { ++ return 1u; ++ } ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__set_quirk( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 2u) { ++ self->private_impl.f_use_lower_quality = (a_value >= 9223372036854775808u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key == 1220532224u) { ++ self->private_impl.f_reject_progressive_jpegs = (a_value != 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func jpeg.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_image_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_image_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_marker = 0; ++ uint32_t v_pixfmt = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_marker = self->private_data.s_do_decode_image_config.v_marker; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 255u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 216u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); ++ goto exit; + } +- v_expect = 7858u; +- label__outer__continue:; + while (true) { + while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- goto label__outer__continue; +- } +- v_whitespace_length = 0u; +- v_c = 0u; +- v_class = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__outer__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- v_class = WUFFS_JSON__LUT_CLASSES[v_c]; +- if (v_class != 0u) { +- break; +- } +- iop_a_src += 1u; +- if (v_whitespace_length >= 65534u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- goto label__outer__continue; ++ goto suspend; + } +- v_whitespace_length += 1u; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__outer__continue; ++ if (v_c8 == 255u) { ++ break; ++ } ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; ++ if (v_c8 != 255u) { ++ v_marker = v_c8; ++ break; + } +- if (v_class == 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- label__string_loop_outer__continue:; +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_string_length = 0u; ++ } ++ if (v_marker == 0u) { ++ continue; ++ } else if ((208u <= v_marker) && (v_marker <= 217u)) { ++ if (v_marker <= 215u) { ++ continue; ++ } ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__string_loop_outer__continue; ++ goto suspend; + } +- while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) { +- v_c4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 0u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 8u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 16u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 24u))])) { +- break; +- } +- iop_a_src += 4u; +- if (v_string_length > 65527u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 4u; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch >> 48)); ++ break; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- v_char = WUFFS_JSON__LUT_CHARS[v_c]; +- if (v_char == 0u) { +- iop_a_src += 1u; +- if (v_string_length >= 65531u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 1u; +- continue; +- } else if (v_char == 1u) { +- if (v_string_length != 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- } +- goto label__string_loop_outer__break; +- } else if (v_char == 2u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- goto label__string_loop_outer__continue; +- } +- v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))); +- v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c]; +- if ((v_backslash & 128u) != 0u) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)((v_backslash & 127u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (v_backslash != 0u) { +- if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[(v_backslash & 7u)]]) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[(v_backslash & 7u)]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if (v_c == 117u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__string_loop_outer__continue; +- } +- v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u); +- v_uni4_value = 0u; +- v_uni4_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 0u); +- if (v_uni4_ok == 0u) { +- } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) { +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (v_uni4_value >= 56320u) { +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) { +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__string_loop_outer__continue; +- } +- v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u); +- if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) { +- v_uni4_high_surrogate = 0u; +- v_uni4_value = 0u; +- v_uni4_ok = 0u; +- } else { +- v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u)); +- v_uni4_value = 0u; +- v_uni4_ok = 128u; +- v_uni4_string >>= 16u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 0u); +- } +- if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) { +- v_uni4_value -= 56320u; +- iop_a_src += 12u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } +- if (self->private_impl.f_quirks[20u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if ((v_c == 85u) && self->private_impl.f_quirks[2u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__string_loop_outer__continue; +- } +- v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u); +- v_uni8_value = 0u; +- v_uni8_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 28u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 24u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 20u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 16u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 0u); +- if (v_uni8_ok == 0u) { +- } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) { +- iop_a_src += 10u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (self->private_impl.f_quirks[20u]) { +- iop_a_src += 10u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if ((v_c == 120u) && self->private_impl.f_quirks[9u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__string_loop_outer__continue; +- } +- v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- v_backslash_x_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))]; +- v_backslash_x_ok &= v_c; +- v_backslash_x_value = ((uint8_t)(((v_c & 15u) << 4u))); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))]; +- v_backslash_x_ok &= v_c; +- v_backslash_x_value = ((uint8_t)((v_backslash_x_value | (v_c & 15u)))); +- if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- iop_a_src += 4u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } else if (v_char == 3u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- if ((v_multi_byte_utf8 & 49152u) == 32768u) { +- v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u))); +- iop_a_src += 2u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 2u; +- continue; +- } +- } else if (v_char == 4u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if ((v_multi_byte_utf8 & 12632064u) == 8421376u) { +- v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u))); +- if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) { +- iop_a_src += 3u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 3u; +- continue; +- } +- } +- } else if (v_char == 5u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) { +- v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) | +- (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) | +- (4032u & (v_multi_byte_utf8 >> 10u)) | +- (63u & (v_multi_byte_utf8 >> 24u))); +- if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) { +- iop_a_src += 4u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 4u; +- continue; +- } +- } +- } +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if ((v_char & 128u) != 0u) { +- if (self->private_impl.f_quirks[0u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)((v_char & 127u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- if (v_char == 138u) { +- status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code); +- goto exit; +- } +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); + } + } +- label__string_loop_outer__break:; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14); +- continue; +- } +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15); +- continue; +- } +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- break; ++ self->private_impl.f_payload_length = t_4; ++ } ++ if (self->private_impl.f_payload_length < 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 2u; ++ } ++ if (v_marker < 192u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else if (v_marker < 208u) { ++ if (v_marker <= 194u) { ++ if ((v_marker == 194u) && self->private_impl.f_reject_progressive_jpegs) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__rejected_progressive_jpeg); ++ goto exit; ++ } else if (self->private_impl.f_sof_marker != 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; + } +- if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) { +- v_expect = 4104u; +- goto label__outer__continue; ++ self->private_impl.f_sof_marker = v_marker; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_jpeg__decoder__decode_sof(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } + break; +- } else if (v_class == 2u) { +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) { +- if (self->private_impl.f_quirks[13u]) { +- v_expect = 4162u; +- } else { +- v_expect = 4098u; +- } +- } else { +- if (self->private_impl.f_quirks[13u]) { +- v_expect = 8114u; +- } else { +- v_expect = 7858u; +- } ++ } else if (v_marker == 195u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding); ++ goto exit; ++ } else if (v_marker == 196u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } else if ((197u <= v_marker) && (v_marker <= 199u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding); ++ goto exit; ++ } else if (v_marker == 200u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding); ++ goto exit; ++ } ++ } else if (v_marker < 224u) { ++ if (v_marker < 218u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } else if (v_marker == 218u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (v_marker == 219u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- goto label__outer__continue; +- } else if (v_class == 3u) { +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 7858u; +- goto label__outer__continue; +- } else if (v_class == 4u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__decode_dqt(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 221u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__decode_dri(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } else if (v_marker < 240u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ if (v_marker == 254u) { ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_image_config.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ self->private_impl.f_payload_length = 0u; ++ } ++ self->private_impl.choosy_decode_idct = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 : ++#endif ++ self->private_impl.choosy_decode_idct); ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ v_pixfmt = 536870920u; ++ if (self->private_impl.f_num_components > 1u) { ++ v_pixfmt = 2415954056u; ++ } ++ wuffs_base__image_config__set( ++ a_dst, ++ v_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ true); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_marker = v_marker; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dqt ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dqt( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_q = 0; ++ uint32_t v_i = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dqt; ++ if (coro_susp_point) { ++ v_q = self->private_data.s_decode_dqt.v_q; ++ v_i = self->private_data.s_decode_dqt.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (self->private_impl.f_payload_length > 0u) { ++ self->private_impl.f_payload_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (((uint8_t)(v_c8 & 15u)) > 3u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); ++ goto exit; ++ } ++ v_q = ((uint8_t)(v_c8 & 15u)); ++ if (((uint8_t)(v_c8 >> 4u)) == 1u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); ++ goto exit; ++ } else if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (self->private_impl.f_payload_length < 64u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 64u; ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_i += 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint16_t t_1 = *iop_a_src++; ++ self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1; ++ } ++ } ++ self->private_impl.f_seen_dqt[v_q] = true; ++ if (self->private_impl.f_sof_marker == 0u) { ++ v_i = 0u; ++ while (v_i < 64u) { ++ self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i]; ++ v_i += 1u; ++ } ++ self->private_impl.f_saved_seen_dqt[v_q] = true; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dqt = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dqt = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_dqt.v_q = v_q; ++ self->private_data.s_decode_dqt.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dri ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dri( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dri; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_payload_length != 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint16_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_dri.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_dri.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint16_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ self->private_impl.f_restart_interval = t_0; ++ } ++ if (self->private_impl.f_sof_marker == 0u) { ++ self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dri = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dri = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_appn ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_appn( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint8_t a_marker) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_appn; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ do { ++ if (a_marker == 224u) { ++ if (self->private_impl.f_payload_length >= 5u) { ++ self->private_impl.f_payload_length -= 5u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1179207242u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_is_jfif = (v_c8 == 0u); ++ } ++ } else if (a_marker == 238u) { ++ if (self->private_impl.f_payload_length >= 12u) { ++ self->private_impl.f_payload_length -= 12u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_c32 = t_2; ++ } ++ if (v_c32 != 1651467329u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_c32 = t_3; ++ } ++ if ((255u & v_c32) != 101u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_c32 = t_4; ++ } ++ if ((v_c32 >> 24u) == 0u) { ++ self->private_impl.f_is_adobe = 1u; ++ } else { ++ self->private_impl.f_is_adobe = 2u; ++ } ++ } ++ } ++ } while (0); ++ self->private_data.s_decode_appn.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_decode_appn.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_appn.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_appn.scratch; ++ self->private_impl.f_payload_length = 0u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_appn = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_appn = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_sof ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sof( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_comp_h = 0; ++ uint8_t v_comp_v = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ bool v_has_h24 = false; ++ bool v_has_h3 = false; ++ bool v_has_v24 = false; ++ bool v_has_v3 = false; ++ uint32_t v_upper_bound = 0; ++ uint64_t v_wh0 = 0; ++ uint64_t v_wh1 = 0; ++ uint64_t v_wh2 = 0; ++ uint64_t v_wh3 = 0; ++ uint64_t v_progressive = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_sof; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_decode_sof.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_payload_length < 6u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 6u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 == 8u) { ++ } else if (v_c8 == 12u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits); ++ goto exit; ++ } else if (v_c8 == 16u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_sof.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_sof.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ self->private_impl.f_height = t_1; ++ } ++ if (self->private_impl.f_height == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_sof.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_sof.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ self->private_impl.f_width = t_2; ++ } ++ if (self->private_impl.f_width == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 == 0u) || (v_c8 > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } else if (v_c8 == 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model); ++ goto exit; ++ } ++ self->private_impl.f_num_components = ((uint32_t)(v_c8)); ++ if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_components) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ self->private_impl.f_components_c[v_i] = t_4; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ v_comp_h = ((uint8_t)(v_c8 >> 4u)); ++ v_comp_v = ((uint8_t)(v_c8 & 15u)); ++ if ((v_comp_h == 0u) || ++ (v_comp_h > 4u) || ++ (v_comp_v == 0u) || ++ (v_comp_v > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_components_h[v_i] = v_comp_h; ++ if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) { ++ self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i]; ++ } ++ self->private_impl.f_components_v[v_i] = v_comp_v; ++ if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) { ++ self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i]; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 >= 4u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_components_tq[v_i] = v_c8; ++ v_j = 0u; ++ while (v_j < v_i) { ++ if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_num_components == 1u) { ++ self->private_impl.f_max_incl_components_h = 1u; ++ self->private_impl.f_max_incl_components_v = 1u; ++ self->private_impl.f_components_h[0u] = 1u; ++ self->private_impl.f_components_v[0u] = 1u; ++ } else { ++ v_has_h24 = false; ++ v_has_h3 = false; ++ v_has_v24 = false; ++ v_has_v3 = false; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_components) { ++ v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u)); ++ v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u)); ++ v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u)); ++ v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u)); ++ v_i += 1u; ++ } ++ if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling); ++ goto exit; ++ } ++ if (self->private_impl.f_num_components == 4u) { ++ self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u); ++ } else { ++ if (self->private_impl.f_is_jfif) { ++ self->private_impl.f_is_rgb_or_cmyk = false; ++ } else if (self->private_impl.f_is_adobe > 0u) { ++ self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u); ++ } else { ++ self->private_impl.f_is_rgb_or_cmyk = ((self->private_impl.f_components_c[0u] == 82u) && (self->private_impl.f_components_c[1u] == 71u) && (self->private_impl.f_components_c[2u] == 66u)); ++ } ++ } ++ } ++ self->private_impl.f_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, 1u, self->private_impl.f_max_incl_components_h); ++ self->private_impl.f_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, 1u, self->private_impl.f_max_incl_components_v); ++ v_upper_bound = 65544u; ++ self->private_impl.f_components_workbuf_widths[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[0u])))); ++ self->private_impl.f_components_workbuf_widths[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[1u])))); ++ self->private_impl.f_components_workbuf_widths[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[2u])))); ++ self->private_impl.f_components_workbuf_widths[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[3u])))); ++ self->private_impl.f_components_workbuf_heights[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[0u])))); ++ self->private_impl.f_components_workbuf_heights[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[1u])))); ++ self->private_impl.f_components_workbuf_heights[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[2u])))); ++ self->private_impl.f_components_workbuf_heights[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[3u])))); ++ v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u]))); ++ v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u]))); ++ v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u]))); ++ v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u]))); ++ v_progressive = 0u; ++ if (self->private_impl.f_sof_marker >= 194u) { ++ v_progressive = 2u; ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 10u) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ } ++ self->private_impl.f_components_workbuf_offsets[0u] = 0u; ++ self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0); ++ self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1); ++ self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2); ++ self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3); ++ self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive)); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_sof = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_sof = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_sof.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.quantize_dimension ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__quantize_dimension( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_width, ++ uint8_t a_h, ++ uint8_t a_max_incl_h) { ++ uint32_t v_ratio = 0; ++ ++ v_ratio = 0u; ++ if (a_h > 0u) { ++ v_ratio = ((uint32_t)(((uint8_t)(a_max_incl_h / a_h)))); ++ } ++ if (v_ratio == 1u) { ++ return ((a_width + 7u) / 8u); ++ } else if (v_ratio == 2u) { ++ return ((a_width + 15u) / 16u); ++ } else if (v_ratio == 3u) { ++ return ((a_width + 23u) / 24u); ++ } ++ return ((a_width + 31u) / 32u); ++} ++ ++// -------- func jpeg.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_frame_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL); ++ wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL); ++ uint32_t v_scan_count = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ v_scan_count = self->private_impl.f_scan_count; ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_ddf_status = t_0; ++ } ++ if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ } ++ if ( ! self->private_impl.f_swizzle_immediately && (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count))) { ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf); ++ } ++ if (self->private_impl.f_num_components == 1u) { ++ v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self, ++ a_dst, ++ a_workbuf, ++ 0u, ++ 4294967295u, ++ 0u, ++ 4294967295u, ++ ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u]))); ++ } else { ++ v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self, ++ a_dst, ++ a_workbuf, ++ 0u, ++ 4294967295u, ++ 0u, ++ 4294967295u); ++ } ++ if (wuffs_base__status__is_error(&v_ddf_status)) { ++ status = v_ddf_status; ++ goto exit; ++ } else if (wuffs_base__status__is_error(&v_swizzle_status)) { ++ status = v_swizzle_status; ++ goto exit; ++ } ++ } ++ status = v_ddf_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_pixfmt = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint8_t v_marker = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_marker = self->private_data.s_do_decode_frame.v_marker; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_pixfmt = 536870920u; ++ if (self->private_impl.f_num_components > 1u) { ++ v_pixfmt = 2415954056u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(v_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_swizzle_immediately = false; ++ if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) { ++ if (self->private_impl.f_sof_marker >= 194u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ self->private_impl.f_swizzle_immediately = self->private_impl.f_use_lower_quality; ++ self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL); ++ } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) { ++ wuffs_private_impl__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u); ++ } ++ if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u); ++ } ++ while (true) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 == 255u) { ++ break; ++ } ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 255u) { ++ v_marker = v_c8; ++ break; ++ } ++ } ++ if (v_marker == 0u) { ++ continue; ++ } else if ((208u <= v_marker) && (v_marker <= 217u)) { ++ if (v_marker <= 215u) { ++ continue; ++ } ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ self->private_impl.f_payload_length = t_2; ++ } ++ if (self->private_impl.f_payload_length < 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 2u; ++ } ++ if (v_marker < 192u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else if (v_marker < 208u) { ++ if (v_marker == 196u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_jpeg__decoder__decode_dht(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 200u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } else if (v_marker < 224u) { ++ if (v_marker < 217u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } else if (v_marker == 217u) { ++ break; ++ } else if (v_marker == 218u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_jpeg__decoder__decode_sos(self, a_dst, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 219u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__decode_dqt(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 221u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__decode_dri(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } else if (v_marker < 240u) { ++ } else { ++ if (v_marker == 254u) { ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_payload_length = 0u; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_marker = v_marker; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dht ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dht( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_tc = 0; ++ uint8_t v_th = 0; ++ uint8_t v_tc4_th = 0; ++ uint32_t v_working_total_count = 0; ++ uint32_t v_total_count = 0; ++ uint32_t v_i = 0; ++ bool v_failed = false; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dht; ++ if (coro_susp_point) { ++ v_tc4_th = self->private_data.s_decode_dht.v_tc4_th; ++ v_total_count = self->private_data.s_decode_dht.v_total_count; ++ v_i = self->private_data.s_decode_dht.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_sof_marker == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ while (self->private_impl.f_payload_length > 0u) { ++ if (self->private_impl.f_payload_length < 17u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 17u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (((uint8_t)(v_c8 & 15u)) > 3u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_tc = ((uint8_t)(v_c8 >> 4u)); ++ v_th = ((uint8_t)(v_c8 & 15u)); ++ v_tc4_th = ((uint8_t)(((uint8_t)(((uint8_t)(v_tc * 4u)) | v_th)))); ++ if ((self->private_impl.f_sof_marker == 192u) && (((uint8_t)(v_tc4_th & 3u)) > 1u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_data.f_dht_temp_counts[v_i] = t_1; ++ } ++ v_i += 1u; ++ } ++ v_working_total_count = 0u; ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u); ++ v_i += 1u; ++ } ++ if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_total_count = v_working_total_count; ++ if (self->private_impl.f_payload_length < v_total_count) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= v_total_count; ++ v_i = 0u; ++ while (v_i < v_total_count) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2; ++ } ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u; ++ v_i += 1u; ++ } ++ if (((uint8_t)(v_tc4_th & 4u)) == 0u) { ++ v_i = 0u; ++ while (v_i < v_total_count) { ++ if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_i += 1u; ++ } ++ } ++ v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count); ++ if (v_failed) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_seen_dht[v_tc4_th] = true; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dht = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dht = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_dht.v_tc4_th = v_tc4_th; ++ self->private_data.s_decode_dht.v_total_count = v_total_count; ++ self->private_data.s_decode_dht.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.calculate_huff_tables ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_huff_tables( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th, ++ uint32_t a_total_count) { ++ uint32_t v_i = 0; ++ uint8_t v_j = 0; ++ uint8_t v_k = 0; ++ uint32_t v_bit_length_minus_one = 0; ++ uint8_t v_bit_length = 0; ++ uint32_t v_bit_string = 0; ++ uint32_t v_slow = 0; ++ uint8_t v_prefix = 0; ++ uint16_t v_fast = 0; ++ uint32_t v_reps = 0; ++ ++ v_i = 0u; ++ v_k = 0u; ++ v_bit_length_minus_one = 0u; ++ while (v_i < a_total_count) { ++ while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { ++ v_k = 0u; ++ v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u))); ++ v_i += 1u; ++ } ++ v_bit_length = 0u; ++ v_bit_string = 0u; ++ v_i = 0u; ++ while (v_i < a_total_count) { ++ while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) { ++ if (v_bit_length >= 16u) { ++ return true; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_bit_length += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bit_string <<= 1u; ++ } ++ self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string)); ++ v_bit_string += 1u; ++ if ((v_bit_string >> v_bit_length) > 0u) { ++ return true; ++ } ++ v_i += 1u; ++ } ++ v_k = 0u; ++ v_bit_length_minus_one = 0u; ++ while (true) { ++ if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) { ++ self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u; ++ } else { ++ v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k]))))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = (v_slow | ((((uint32_t)(self->private_data.f_dht_temp_bit_strings[((uint8_t)(v_k - 1u))])) + 1u) << 8u)); ++ } ++ v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); ++ if (v_bit_length_minus_one == 0u) { ++ break; ++ } ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u; ++ v_i += 1u; ++ } ++ v_j = 0u; ++ v_bit_length_minus_one = 0u; ++ while (v_bit_length_minus_one < 8u) { ++ v_k = 0u; ++ while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { ++ v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one)))); ++ v_fast = ((uint16_t)(((((uint32_t)((v_bit_length_minus_one + 1u))) << 8u) | ((uint32_t)(self->private_impl.f_huff_tables_symbols[a_tc4_th][v_j]))))); ++ v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one)); ++ while (v_reps > 0u) { ++ self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prefix += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_reps -= 1u; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += 1u; ++ v_j += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_bit_length_minus_one += 1u; ++ } ++ return false; ++} ++ ++// -------- func jpeg.decoder.decode_sos ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sos( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_my = 0; ++ uint32_t v_mx = 0; ++ uint32_t v_decode_mcu_result = 0; ++ uint32_t v_bitstream_length = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_sos; ++ if (coro_susp_point) { ++ v_my = self->private_data.s_decode_sos.v_my; ++ v_mx = self->private_data.s_decode_sos.v_mx; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_scan_count >= 32u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count); ++ goto exit; ++ } else if ((self->private_impl.f_scan_count > 0u) && ! self->private_impl.f_expect_multiple_scans) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_scan_count); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__prepare_scan(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_next_restart_marker = 0u; ++ self->private_impl.f_mcu_previous_dc_values[0u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[1u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[2u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[3u] = 0u; ++ self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; ++ self->private_impl.f_eob_run = 0u; ++ self->private_impl.f_bitstream_bits = 0u; ++ self->private_impl.f_bitstream_n_bits = 0u; ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ self->private_impl.f_bitstream_padding = 12345u; ++ wuffs_jpeg__decoder__fill_bitstream(self, a_src); ++ v_my = 0u; ++ while (v_my < self->private_impl.f_scan_height_in_mcus) { ++ v_mx = 0u; ++ while (v_mx < self->private_impl.f_scan_width_in_mcus) { ++ self->private_impl.f_mcu_current_block = 0u; ++ self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss)); ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf); ++ } ++ while (true) { ++ v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self, ++ a_dst, ++ a_workbuf, ++ v_mx, ++ v_my); ++ if (v_decode_mcu_result == 0u) { ++ break; ++ } else if (v_decode_mcu_result == 1u) { ++ } else if (v_decode_mcu_result == 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state); ++ goto exit; ++ } else { ++ status = self->private_impl.f_swizzle_immediately_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri)); ++ wuffs_jpeg__decoder__fill_bitstream(self, a_src); ++ if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) { ++ break; ++ } else if (self->private_impl.f_bitstream_padding == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if ((a_src && a_src->meta.closed) && ! self->private_impl.f_bitstream_is_closed) { ++ if (self->private_impl.f_bitstream_wi < 1024u) { ++ wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u); ++ self->private_impl.f_bitstream_wi += 264u; ++ self->private_impl.f_bitstream_is_closed = true; ++ } ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ } ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf); ++ } ++ if (self->private_impl.f_restarts_remaining > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_restarts_remaining -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ if (self->private_impl.f_restarts_remaining == 0u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_mcu_previous_dc_values[0u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[1u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[2u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[3u] = 0u; ++ self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; ++ self->private_impl.f_eob_run = 0u; ++ self->private_impl.f_bitstream_bits = 0u; ++ self->private_impl.f_bitstream_n_bits = 0u; ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ self->private_impl.f_bitstream_padding = 12345u; ++ } ++ } ++ v_mx += 1u; ++ } ++ v_my += 1u; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u); ++ ++ ok: ++ self->private_impl.p_decode_sos = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_sos = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_sos.v_my = v_my; ++ self->private_data.s_decode_sos.v_mx = v_mx; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func jpeg.decoder.prepare_scan ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__prepare_scan( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_j_max_incl = 0; ++ bool v_failed = false; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_prepare_scan; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_prepare_scan.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if ((v_c8 < 1u) || (v_c8 > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_num_components = ((uint32_t)(v_c8)); ++ if ((self->private_impl.f_scan_num_components > self->private_impl.f_num_components) || (self->private_impl.f_payload_length != (4u + (2u * self->private_impl.f_scan_num_components)))) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_j = 0u; ++ while (true) { ++ if (v_j >= self->private_impl.f_num_components) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ if (v_c8 == self->private_impl.f_components_c[v_j]) { ++ if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table); ++ goto exit; ++ } ++ self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j)); ++ break; ++ } ++ v_j += 1u; ++ } ++ v_j = 0u; ++ while (v_j < v_i) { ++ if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ v_j += 1u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 3u) || (((uint8_t)(v_c8 & 15u)) > 3u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_comps_td[v_i] = ((uint8_t)(v_c8 >> 4u)); ++ self->private_impl.f_scan_comps_ta[v_i] = ((uint8_t)(v_c8 & 15u)); ++ if (self->private_impl.f_sof_marker == 192u) { ++ if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_scan_count == 0u) { ++ self->private_impl.f_expect_multiple_scans = ((self->private_impl.f_sof_marker >= 194u) || (self->private_impl.f_scan_num_components < self->private_impl.f_num_components)); ++ } ++ if (self->private_impl.f_sof_marker < 194u) { ++ self->private_data.s_prepare_scan.scratch = 3u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_prepare_scan.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_prepare_scan.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_prepare_scan.scratch; ++ self->private_impl.f_scan_ss = 0u; ++ self->private_impl.f_scan_se = 63u; ++ self->private_impl.f_scan_ah = 0u; ++ self->private_impl.f_scan_al = 0u; ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_c8 > 63u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_ss = v_c8; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if ((v_c8 > 63u) || (v_c8 < self->private_impl.f_scan_ss)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_se = v_c8; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 14u) || (((uint8_t)(v_c8 & 15u)) > 13u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_ah = ((uint8_t)(v_c8 >> 4u)); ++ self->private_impl.f_scan_al = ((uint8_t)(v_c8 & 15u)); ++ if (self->private_impl.f_scan_ah > 0u) { ++ if (((uint8_t)(self->private_impl.f_scan_ah - 1u)) != self->private_impl.f_scan_al) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ if (self->private_impl.f_scan_ss == 0u) { ++ if (self->private_impl.f_scan_se != 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (self->private_impl.f_scan_ah == 0u) { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits); ++ } else { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit); ++ } ++ } else { ++ if (self->private_impl.f_scan_num_components != 1u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (self->private_impl.f_scan_ah == 0u) { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits); ++ } else { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit); ++ } ++ } ++ } ++ v_i = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ if ((self->private_impl.f_scan_ss == 0u) && ! self->private_impl.f_seen_dht[((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i]))]) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i]))); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ if ((self->private_impl.f_scan_se != 0u) && ! self->private_impl.f_seen_dht[((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i]))]) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i]))); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_j = ((uint32_t)(self->private_impl.f_scan_ss)); ++ v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u))); ++ while (v_j <= v_j_max_incl) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[self->private_impl.f_scan_comps_cselector[v_i]][v_j] = self->private_impl.f_scan_al; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_scan_num_components == 1u) { ++ wuffs_jpeg__decoder__calculate_single_component_scan_fields(self); ++ } else { ++ v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self); ++ if (v_failed) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_prepare_scan = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_prepare_scan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_prepare_scan.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.use_default_huffman_table ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__use_default_huffman_table( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__slice_u8 v_data = {0}; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ if (a_tc4_th == 0u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29); ++ } else if (a_tc4_th == 1u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29); ++ } else if (a_tc4_th == 4u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179); ++ } else if (a_tc4_th == 5u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179); ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table); ++ goto exit; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ v_data, ++ 0u); ++ self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u))); ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r); ++ v_status = t_0; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func jpeg.decoder.calculate_single_component_scan_fields ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__calculate_single_component_scan_fields( ++ wuffs_jpeg__decoder* self) { ++ uint8_t v_csel = 0; ++ ++ self->private_impl.f_scan_comps_bx_offset[0u] = 0u; ++ self->private_impl.f_scan_comps_by_offset[0u] = 0u; ++ self->private_impl.f_mcu_num_blocks = 1u; ++ self->private_impl.f_mcu_blocks_sselector[0u] = 0u; ++ v_csel = self->private_impl.f_scan_comps_cselector[0u]; ++ self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel]; ++ self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u; ++ self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); ++ self->private_impl.f_mcu_blocks_dc_hselector[0u] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[0u])); ++ self->private_impl.f_mcu_blocks_ac_hselector[0u] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[0u])); ++ self->private_impl.f_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); ++ self->private_impl.f_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.calculate_multiple_component_scan_fields ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( ++ wuffs_jpeg__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_h = 0; ++ uint32_t v_v = 0; ++ uint32_t v_hv = 0; ++ uint32_t v_total_hv = 0; ++ uint32_t v_b = 0; ++ uint32_t v_bx_offset = 0; ++ uint32_t v_by_offset = 0; ++ uint32_t v_sibo = 0; ++ uint8_t v_ssel = 0; ++ uint8_t v_csel = 0; ++ ++ v_total_hv = 0u; ++ v_i = 0u; ++ v_b = 0u; ++ v_bx_offset = 0u; ++ v_by_offset = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])); ++ v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]])); ++ v_hv = (((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])) * ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]))); ++ self->private_impl.f_swizzle_immediately_c_offsets[v_i] = ((uint32_t)(64u * v_total_hv)); ++ v_total_hv += v_hv; ++ while (v_hv > 0u) { ++ self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u))); ++ self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u))); ++ self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i)); ++ v_b += 1u; ++ v_bx_offset += 1u; ++ if (v_bx_offset == v_h) { ++ v_bx_offset = 0u; ++ v_by_offset += 1u; ++ if (v_by_offset == v_v) { ++ v_by_offset = 0u; ++ } ++ } ++ v_hv -= 1u; ++ } ++ v_i += 1u; ++ } ++ if (v_total_hv > 10u) { ++ return true; ++ } ++ self->private_impl.f_mcu_num_blocks = v_total_hv; ++ self->private_impl.f_swizzle_immediately_c_offsets[self->private_impl.f_scan_num_components] = ((uint32_t)(64u * v_total_hv)); ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b]; ++ v_csel = self->private_impl.f_scan_comps_cselector[v_ssel]; ++ self->private_impl.f_mcu_blocks_offset[v_b] = (self->private_impl.f_components_workbuf_offsets[v_csel] + (8u * ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (8u * ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])))); ++ self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel]))); ++ self->private_impl.f_mcu_blocks_my_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_v[v_csel])) * self->private_impl.f_components_workbuf_widths[v_csel]); ++ self->private_impl.f_mcu_blocks_dc_hselector[v_b] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_ssel])); ++ self->private_impl.f_mcu_blocks_ac_hselector[v_b] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_ssel])); ++ v_sibo = ((uint32_t)(self->private_impl.f_swizzle_immediately_c_offsets[v_csel] + ((8u * ((uint32_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (64u * ((uint32_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint32_t)(self->private_impl.f_components_h[v_csel])))))); ++ self->private_impl.f_swizzle_immediately_b_offsets[v_b] = wuffs_base__u32__min(v_sibo, 576u); ++ v_b += 1u; ++ } ++ self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus; ++ self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus; ++ return false; ++} ++ ++// -------- func jpeg.decoder.fill_bitstream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__fill_bitstream( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint32_t v_wi = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_new_wi = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ if (self->private_impl.f_bitstream_ri <= 0u) { ++ } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) { ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ } else { ++ v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi)); ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = v_wi; ++ } ++ v_wi = self->private_impl.f_bitstream_wi; ++ while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 < 255u) { ++ self->private_data.f_bitstream_buffer[v_wi] = v_c8; ++ v_wi += 1u; ++ iop_a_src += 1u; ++ continue; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { ++ break; ++ } else if (((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)) > 0u) { ++ break; ++ } else { ++ self->private_data.f_bitstream_buffer[v_wi] = 255u; ++ v_wi += 1u; ++ iop_a_src += 2u; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) { ++ if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255u) && (((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)) > 0u)) { ++ v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u); ++ v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding)); ++ if (v_wi < v_new_wi) { ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi)); ++ wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u); ++ v_wi = v_new_wi; ++ } ++ } ++ } ++ self->private_impl.f_bitstream_wi = v_wi; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks_for_single_component ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_b = 0; ++ uint8_t v_csel = 0; ++ uint64_t v_h = 0; ++ uint64_t v_v = 0; ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_h = 1u; ++ v_v = 1u; ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; ++ if (self->private_impl.f_scan_num_components > 1u) { ++ v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); ++ v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); ++ } ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_b += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.save_mcu_blocks ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__save_mcu_blocks( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_b = 0; ++ uint8_t v_csel = 0; ++ uint64_t v_h = 0; ++ uint64_t v_v = 0; ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_h = 1u; ++ v_v = 1u; ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; ++ if (self->private_impl.f_scan_num_components > 1u) { ++ v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); ++ v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); ++ } ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_b += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.skip_past_the_next_restart_marker ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__skip_past_the_next_restart_marker( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) { ++ iop_a_src += 1u; ++ continue; ++ } ++ v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)))); ++ if (v_c8 < 192u) { ++ iop_a_src += 2u; ++ continue; ++ } else if ((v_c8 < 208u) || (215u < v_c8)) { ++ break; ++ } ++ v_c8 &= 7u; ++ if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 1u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 2u)) & 7u)))) { ++ break; ++ } else if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 7u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 6u)) & 7u)))) { ++ iop_a_src += 2u; ++ continue; ++ } else { ++ iop_a_src += 2u; ++ break; ++ } ++ } ++ self->private_impl.f_next_restart_marker = ((uint8_t)(((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u)); ++ ++ ok: ++ self->private_impl.p_skip_past_the_next_restart_marker = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_past_the_next_restart_marker = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.apply_progressive_idct ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__apply_progressive_idct( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_csel = 0; ++ bool v_block_smoothing_applicable = false; ++ uint32_t v_scan_width_in_mcus = 0; ++ uint32_t v_scan_height_in_mcus = 0; ++ uint32_t v_mcu_blocks_mx_mul_0 = 0; ++ uint32_t v_mcu_blocks_my_mul_0 = 0; ++ uint32_t v_my = 0; ++ uint32_t v_mx = 0; ++ uint64_t v_stride = 0; ++ uint64_t v_offset = 0; ++ uint8_t v_stashed_mcu_blocks_0[128] = {0}; ++ ++ wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); ++ v_block_smoothing_applicable = true; ++ v_csel = 0u; ++ while (v_csel < self->private_impl.f_num_components) { ++ if ((self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][0u] >= 16u) || wuffs_jpeg__decoder__top_left_quants_has_zero(self, ((uint32_t)(self->private_impl.f_components_tq[v_csel])))) { ++ v_block_smoothing_applicable = false; ++ } ++ v_csel += 1u; ++ } ++ v_csel = 0u; ++ while (v_csel < self->private_impl.f_num_components) { ++ v_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); ++ v_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); ++ v_mcu_blocks_mx_mul_0 = 8u; ++ v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); ++ if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) { ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = ( ++ &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth); ++ self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u); ++ self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u); ++ } else { ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = ( ++ &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default); ++ } ++ v_my = 0u; ++ while (v_my < v_scan_height_in_mcus) { ++ v_mx = 0u; ++ while (v_mx < v_scan_width_in_mcus) { ++ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self, ++ v_mx, ++ v_my, ++ a_workbuf, ++ v_csel); ++ v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[v_csel] + (((uint64_t)(v_mcu_blocks_mx_mul_0)) * ((uint64_t)(v_mx))) + (((uint64_t)(v_mcu_blocks_my_mul_0)) * ((uint64_t)(v_my)))); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ } ++ v_mx += 1u; ++ } ++ v_my += 1u; ++ } ++ v_csel += 1u; ++ } ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.swizzle_gray ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__swizzle_gray( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1, ++ uint64_t a_stride) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_x0 = 0; ++ uint64_t v_x1 = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_y = 0; ++ uint32_t v_y1 = 0; ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_x0 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x0, self->private_impl.f_width)))); ++ v_x1 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x1, self->private_impl.f_width)))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_y = a_y0; ++ v_y1 = wuffs_base__u32__min(a_y1, self->private_impl.f_height); ++ while (v_y < v_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_x1 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_x1); ++ } ++ if (v_x0 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_x0); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), a_workbuf); ++ if (a_stride <= ((uint64_t)(a_workbuf.len))) { ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, a_stride); ++ } else { ++ a_workbuf = wuffs_base__utility__empty_slice_u8(); ++ } ++ v_y += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func jpeg.decoder.swizzle_colorful ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__swizzle_colorful( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1) { ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ wuffs_base__slice_u8 v_src0 = {0}; ++ wuffs_base__slice_u8 v_src1 = {0}; ++ wuffs_base__slice_u8 v_src2 = {0}; ++ wuffs_base__slice_u8 v_src3 = {0}; ++ uint32_t v_width0 = 0; ++ uint32_t v_width1 = 0; ++ uint32_t v_width2 = 0; ++ uint32_t v_width3 = 0; ++ uint32_t v_height0 = 0; ++ uint32_t v_height1 = 0; ++ uint32_t v_height2 = 0; ++ uint32_t v_height3 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ if (self->private_impl.f_swizzle_immediately) { ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[0u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src0 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width0 = (8u * ((uint32_t)(self->private_impl.f_components_h[0u]))); ++ v_height0 = (8u * ((uint32_t)(self->private_impl.f_components_v[0u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src1 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width1 = (8u * ((uint32_t)(self->private_impl.f_components_h[1u]))); ++ v_height1 = (8u * ((uint32_t)(self->private_impl.f_components_v[1u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src2 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width2 = (8u * ((uint32_t)(self->private_impl.f_components_h[2u]))); ++ v_height2 = (8u * ((uint32_t)(self->private_impl.f_components_v[2u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[4u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src3 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width3 = (8u * ((uint32_t)(self->private_impl.f_components_h[3u]))); ++ v_height3 = (8u * ((uint32_t)(self->private_impl.f_components_v[3u]))); ++ } ++ } else { ++ if ((self->private_impl.f_components_workbuf_offsets[0u] <= self->private_impl.f_components_workbuf_offsets[1u]) && (self->private_impl.f_components_workbuf_offsets[1u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[0u], ++ self->private_impl.f_components_workbuf_offsets[1u]); ++ v_width0 = self->private_impl.f_components_workbuf_widths[0u]; ++ v_height0 = self->private_impl.f_components_workbuf_heights[0u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[1u] <= self->private_impl.f_components_workbuf_offsets[2u]) && (self->private_impl.f_components_workbuf_offsets[2u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[1u], ++ self->private_impl.f_components_workbuf_offsets[2u]); ++ v_width1 = self->private_impl.f_components_workbuf_widths[1u]; ++ v_height1 = self->private_impl.f_components_workbuf_heights[1u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[2u] <= self->private_impl.f_components_workbuf_offsets[3u]) && (self->private_impl.f_components_workbuf_offsets[3u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[2u], ++ self->private_impl.f_components_workbuf_offsets[3u]); ++ v_width2 = self->private_impl.f_components_workbuf_widths[2u]; ++ v_height2 = self->private_impl.f_components_workbuf_heights[2u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[3u] <= self->private_impl.f_components_workbuf_offsets[4u]) && (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[3u], ++ self->private_impl.f_components_workbuf_offsets[4u]); ++ v_width3 = self->private_impl.f_components_workbuf_widths[3u]; ++ v_height3 = self->private_impl.f_components_workbuf_heights[3u]; ++ } ++ } ++ v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler, ++ a_dst, ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ (a_x0 & 65535u), ++ wuffs_base__u32__min(a_x1, self->private_impl.f_width), ++ (a_y0 & 65535u), ++ wuffs_base__u32__min(a_y1, self->private_impl.f_height), ++ v_src0, ++ v_src1, ++ v_src2, ++ v_src3, ++ v_width0, ++ v_width1, ++ v_width2, ++ v_width3, ++ v_height0, ++ v_height1, ++ v_height2, ++ v_height3, ++ v_width0, ++ v_width1, ++ v_width2, ++ v_width3, ++ self->private_impl.f_components_h[0u], ++ self->private_impl.f_components_h[1u], ++ self->private_impl.f_components_h[2u], ++ self->private_impl.f_components_h[3u], ++ self->private_impl.f_components_v[0u], ++ self->private_impl.f_components_v[1u], ++ self->private_impl.f_components_v[2u], ++ self->private_impl.f_components_v[3u], ++ self->private_impl.f_is_rgb_or_cmyk, ++ ! self->private_impl.f_use_lower_quality, ++ wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048)); ++ return wuffs_private_impl__status__ensure_not_a_suspension(v_status); ++} ++ ++// -------- func jpeg.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_jpeg__decoder__frame_dirty_rect( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func jpeg.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_jpeg__decoder__num_animation_loops( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__num_decoded_frame_configs( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__num_decoded_frames( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__restart_frame( ++ wuffs_jpeg__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_bitstream_is_closed = false; ++ self->private_impl.f_expect_multiple_scans = false; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_scan_count = 0u; ++ self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval; ++ v_i = 0u; ++ while (v_i < 4u) { ++ self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i]; ++ v_j = 0u; ++ while (v_j < 64u) { ++ self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j]; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 10u) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 8u) { ++ self->private_impl.f_seen_dht[v_i] = false; ++ v_i += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func jpeg.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_jpeg__decoder__set_report_metadata( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__tell_me_more( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_jpeg__decoder__workbuf_len( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) { ++ return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]); ++ } ++ return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]); ++} ++ ++// -------- func jpeg.decoder.top_left_quants_has_zero ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__top_left_quants_has_zero( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_q) { ++ return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][1u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][2u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][3u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][8u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][9u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][10u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][16u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][17u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][24u] == 0u)); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ uint32_t v_dx = 0; ++ uint32_t v_dy = 0; ++ uint32_t v_mx = 0; ++ uint32_t v_my = 0; ++ uint8_t v_q = 0; ++ uint32_t v_q_00 = 0; ++ uint32_t v_q_xy = 0; ++ uint8_t v_al = 0; ++ uint32_t v_scratch = 0; ++ uint32_t v_limit = 0; ++ ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_dy = 0u; ++ while (v_dy < 5u) { ++ v_my = wuffs_base__u32__min(self->private_impl.f_block_smoothing_my_max_incl, wuffs_base__u32__sat_sub((a_my + v_dy), 2u)); ++ v_dx = 0u; ++ while (v_dx < 5u) { ++ v_mx = wuffs_base__u32__min(self->private_impl.f_block_smoothing_mx_max_incl, wuffs_base__u32__sat_sub((a_mx + v_dx), 2u)); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_impl.f_block_smoothing_dc_values[v_dy][v_dx], 1u * (size_t)2u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_dx += 1u; ++ } ++ v_dy += 1u; ++ } ++ v_q = self->private_impl.f_components_tq[a_csel]; ++ v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u])); ++ if (v_q_00 <= 0u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (0u != (16u & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u))); ++ } ++ self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch)); ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch)); ++ } ++ } else { ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); ++ } ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.decode_mcu ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ return (*self->private_impl.choosy_decode_mcu)(self, a_dst, a_workbuf, a_mx, a_my); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint8_t v_csel = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ uint8_t v_dc_h = 0; ++ uint32_t v_dc_symbol = 0; ++ uint32_t v_dc_ht_fast = 0; ++ uint32_t v_dc_bl = 0; ++ uint32_t v_dc_code = 0; ++ uint32_t v_dc_blm1 = 0; ++ uint32_t v_dc_ht_slow = 0; ++ uint16_t v_dc_value = 0; ++ uint16_t v_dc_extend = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint16_t v_ac_extend = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint32_t v_z = 0; ++ uint32_t v_mcb = 0; ++ uint64_t v_stride = 0; ++ uint64_t v_offset = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ while (self->private_impl.f_mcu_zig_index <= 0u) { ++ wuffs_private_impl__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; ++ v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); ++ v_dc_bl = (v_dc_ht_fast >> 8u); ++ if (v_n_bits >= v_dc_bl) { ++ v_dc_symbol = (15u & v_dc_ht_fast); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ v_bits <<= (v_dc_bl & 63u); ++ v_n_bits -= v_dc_bl; ++ } else { ++ v_dc_code = ((uint32_t)((v_bits >> 55u))); ++ v_dc_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; ++ if (v_dc_code < (v_dc_ht_slow >> 8u)) { ++ v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); ++ if (v_dc_blm1 == 0u) { ++ v_dc_symbol = 0u; ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ } ++ } ++ v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_dc_symbol; ++ v_n_bits -= v_dc_symbol; ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel]; ++ self->private_impl.f_mcu_zig_index = 1u; ++ break; ++ } ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ if (v_n_bits < 16u) { ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ } ++ v_z = 1u; ++ self->private_impl.f_mcu_zig_index = 0u; ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (v_z < 64u) { ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_z += (v_ac_rrrr + 1u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_ssss; ++ v_n_bits -= v_ac_ssss; ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value; ++ } else if (v_ac_rrrr < 15u) { ++ break; ++ } ++ } ++ v_mcb = self->private_impl.f_mcu_current_block; ++ self->private_impl.f_mcu_current_block += 1u; ++ if (self->private_impl.f_test_only_interrupt_decode_mcu) { ++ goto label__goto_done__break; ++ } ++ if ( ! self->private_impl.f_swizzle_immediately) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; ++ v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); ++ v_offset = (self->private_impl.f_mcu_blocks_offset[v_mcb] + (((uint64_t)(self->private_impl.f_mcu_blocks_mx_mul[v_mcb])) * ((uint64_t)(a_mx))) + (((uint64_t)(self->private_impl.f_mcu_blocks_my_mul[v_mcb])) * ((uint64_t)(a_my)))); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ } ++ } else if (self->private_impl.f_num_components == 1u) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64), 8u, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_gray(self, ++ a_dst, ++ wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64), ++ ((a_mx + 0u) * 8u), ++ ((a_mx + 1u) * 8u), ++ ((a_my + 0u) * 8u), ++ ((a_my + 1u) * 8u), ++ 8u); ++ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) { ++ v_ret = 3u; ++ goto label__goto_done__break; ++ } ++ break; ++ } else { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; ++ v_stride = (8u * ((uint64_t)(self->private_impl.f_components_h[v_csel]))); ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, self->private_impl.f_swizzle_immediately_b_offsets[v_mcb], 640), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ if (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ continue; ++ } ++ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_colorful(self, ++ a_dst, ++ wuffs_base__utility__empty_slice_u8(), ++ ((a_mx + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))), ++ ((a_mx + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))), ++ ((a_my + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))), ++ ((a_my + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v)))); ++ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) { ++ v_ret = 3u; ++ goto label__goto_done__break; ++ } ++ break; ++ } ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint16_t v_ac_extend = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint32_t v_z = 0; ++ ++ if (self->private_impl.f_eob_run > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ return 0u; ++ } ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ if (v_n_bits < 16u) { ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ } ++ v_z = self->private_impl.f_mcu_zig_index; ++ self->private_impl.f_mcu_zig_index = 0u; ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) { ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_z += (v_ac_rrrr + 1u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_ssss; ++ v_n_bits -= v_ac_ssss; ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = ((uint16_t)(((uint16_t)(v_ac_value << self->private_impl.f_scan_al)))); ++ } else if (v_ac_rrrr < 15u) { ++ self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)) - 1u)))); ++ if (v_ac_rrrr > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_rrrr; ++ v_n_bits -= v_ac_rrrr; ++ } ++ break; ++ } ++ } ++ } while (0); ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint16_t v_one_lshift_scan_al = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint8_t v_unzig = 0; ++ bool v_bit = false; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ while (true) { ++ if (self->private_impl.f_eob_run > 0u) { ++ break; ++ } ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (true) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_value = 0u; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if ((v_bits >> 63u) == 0u) { ++ v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al)); ++ } ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ } else if (v_ac_rrrr < 15u) { ++ self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)); ++ if (v_ac_rrrr > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_rrrr; ++ v_n_bits -= v_ac_rrrr; ++ } ++ goto label__goto_do_eob__break; ++ } ++ while (true) { ++ v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { ++ if (v_n_bits == 0u) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ } ++ v_bit = ((v_bits >> 63u) > 0u); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ if (v_bit) { ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } ++ } else if (v_ac_rrrr <= 0u) { ++ break; ++ } else { ++ v_ac_rrrr -= 1u; ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++ if (v_ac_value != 0u) { ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value; ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++ goto label__block__break; ++ } ++ label__goto_do_eob__break:; ++ if (self->private_impl.f_eob_run <= 0u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ while (true) { ++ v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { ++ if (v_n_bits == 0u) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ } ++ v_bit = ((v_bits >> 63u) > 0u); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ if (v_bit) { ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } while (0); ++ label__block__break:; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint8_t v_csel = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ uint8_t v_dc_h = 0; ++ uint32_t v_dc_symbol = 0; ++ uint32_t v_dc_ht_fast = 0; ++ uint32_t v_dc_bl = 0; ++ uint32_t v_dc_code = 0; ++ uint32_t v_dc_blm1 = 0; ++ uint32_t v_dc_ht_slow = 0; ++ uint16_t v_dc_value = 0; ++ uint16_t v_dc_extend = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; ++ v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); ++ v_dc_bl = (v_dc_ht_fast >> 8u); ++ if (v_n_bits >= v_dc_bl) { ++ v_dc_symbol = (15u & v_dc_ht_fast); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ v_bits <<= (v_dc_bl & 63u); ++ v_n_bits -= v_dc_bl; ++ } else { ++ v_dc_code = ((uint32_t)((v_bits >> 55u))); ++ v_dc_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; ++ if (v_dc_code < (v_dc_ht_slow >> 8u)) { ++ v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); ++ if (v_dc_blm1 == 0u) { ++ v_dc_symbol = 0u; ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ } ++ } ++ v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_dc_symbol; ++ v_n_bits -= v_dc_symbol; ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] = ((uint16_t)(self->private_impl.f_mcu_previous_dc_values[v_csel] << self->private_impl.f_scan_al)); ++ } while (0); ++ self->private_impl.f_mcu_current_block += 1u; ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint16_t v_one_lshift_scan_al = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ if ((v_bits >> 63u) != 0u) { ++ self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al; ++ } ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ } while (0); ++ self->private_impl.f_mcu_current_block += 1u; ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code"; ++const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8"; ++const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape"; ++const char wuffs_json__error__bad_input[] = "#json: bad input"; ++const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string"; ++const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination"; ++const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length"; ++const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth"; ++const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99u ++ ++static const uint8_t ++WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 3u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 162u, 0u, 0u, 0u, 0u, 5u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 175u, ++ 7u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 220u, 0u, 0u, 0u, ++ 0u, 1u, 136u, 0u, 0u, 2u, 140u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 138u, 0u, ++ 0u, 0u, 141u, 0u, 137u, 0u, 6u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 3u, 4u, 5u, 6u, 7u, 10u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 7u, 27u, 10u, 63u, 39u, 11u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u, ++ 144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u, ++ 0u, 0u, 1u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 2u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 32u, 32u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 5u, 5u, 5u, 5u, 5u, 32u, 32u, 32u, ++ 32u, 32u, 32u, 32u, 32u, 32u, 32u, 32u, ++}; ++ ++#define WUFFS_JSON__CLASS_WHITESPACE 0u ++ ++#define WUFFS_JSON__CLASS_STRING 1u ++ ++#define WUFFS_JSON__CLASS_COMMA 2u ++ ++#define WUFFS_JSON__CLASS_COLON 3u ++ ++#define WUFFS_JSON__CLASS_NUMBER 4u ++ ++#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5u ++ ++#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6u ++ ++#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7u ++ ++#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8u ++ ++#define WUFFS_JSON__CLASS_FALSE 9u ++ ++#define WUFFS_JSON__CLASS_TRUE 10u ++ ++#define WUFFS_JSON__CLASS_NULL_NAN_INF 11u ++ ++#define WUFFS_JSON__CLASS_COMMENT 12u ++ ++#define WUFFS_JSON__EXPECT_VALUE 7858u ++ ++#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856u ++ ++#define WUFFS_JSON__EXPECT_STRING 4098u ++ ++#define WUFFS_JSON__EXPECT_COMMA 4100u ++ ++#define WUFFS_JSON__EXPECT_COLON 4104u ++ ++#define WUFFS_JSON__EXPECT_NUMBER 4112u ++ ++#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160u ++ ++#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352u ++ ++static const uint8_t ++WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 0u, 0u, 15u, 15u, 0u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 0u, 15u, 1u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 11u, 2u, 4u, 15u, 12u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 4u, 4u, 3u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 7u, 15u, 8u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 9u, 15u, ++ 15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u, ++ 15u, 15u, 15u, 15u, 10u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 5u, 15u, 6u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++#define WUFFS_JSON__QUIRKS_BASE 1225364480u ++ ++#define WUFFS_JSON__QUIRKS_COUNT 21u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_number( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_digits( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_leading( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_comment( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_inf_nan( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_trailer( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__token_decoder__func_ptrs ++wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__token_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_json__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_json__decoder__set_quirk), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_json__decoder__initialize( ++ wuffs_json__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = ++ wuffs_base__token_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = ++ (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_json__decoder* ++wuffs_json__decoder__alloc(void) { ++ wuffs_json__decoder* x = ++ (wuffs_json__decoder*)(calloc(1, sizeof(wuffs_json__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_json__decoder__initialize( ++ x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_json__decoder(void) { ++ return sizeof(wuffs_json__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func json.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_json__decoder__get_quirk( ++ const wuffs_json__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_key = 0; ++ ++ if (a_key >= 1225364480u) { ++ v_key = (a_key - 1225364480u); ++ if (v_key < 21u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; ++} ++ ++// -------- func json.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_json__decoder__set_quirk( ++ wuffs_json__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key >= 1225364480u) { ++ a_key -= 1225364480u; ++ if (a_key < 21u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func json.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_json__decoder__workbuf_len( ++ const wuffs_json__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__empty_range_ii_u64(); ++} ++ ++// -------- func json.decoder.decode_tokens ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_json__decoder__decode_tokens( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_vminor = 0; ++ uint32_t v_number_length = 0; ++ uint32_t v_number_status = 0; ++ uint32_t v_string_length = 0; ++ uint32_t v_whitespace_length = 0; ++ uint32_t v_depth = 0; ++ uint32_t v_stack_byte = 0; ++ uint32_t v_stack_bit = 0; ++ uint32_t v_match = 0; ++ uint32_t v_c32 = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_backslash = 0; ++ uint8_t v_char = 0; ++ uint8_t v_class = 0; ++ uint32_t v_multi_byte_utf8 = 0; ++ uint8_t v_backslash_x_ok = 0; ++ uint8_t v_backslash_x_value = 0; ++ uint32_t v_backslash_x_string = 0; ++ uint8_t v_uni4_ok = 0; ++ uint64_t v_uni4_string = 0; ++ uint32_t v_uni4_value = 0; ++ uint32_t v_uni4_high_surrogate = 0; ++ uint8_t v_uni8_ok = 0; ++ uint64_t v_uni8_string = 0; ++ uint32_t v_uni8_value = 0; ++ uint32_t v_expect = 0; ++ uint32_t v_expect_after_value = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_tokens; ++ if (coro_susp_point) { ++ v_depth = self->private_data.s_decode_tokens.v_depth; ++ v_expect = self->private_data.s_decode_tokens.v_expect; ++ v_expect_after_value = self->private_data.s_decode_tokens.v_expect_after_value; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_end_of_data) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_quirks[18u]) { ++ if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination); ++ goto exit; ++ } ++ } ++ if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_json__decoder__decode_leading(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_expect = 7858u; ++ label__outer__continue:; ++ while (true) { ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; ++ } ++ v_whitespace_length = 0u; ++ v_c8 = 0u; ++ v_class = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__outer__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ v_class = WUFFS_JSON__LUT_CLASSES[v_c8]; ++ if (v_class != 0u) { ++ break; ++ } ++ iop_a_src += 1u; ++ if (v_whitespace_length >= 65534u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ goto label__outer__continue; ++ } ++ v_whitespace_length += 1u; ++ } ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__outer__continue; ++ } ++ } ++ if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (v_class == 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ label__string_loop_outer__continue:; ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_string_length = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__string_loop_outer__continue; ++ } ++ while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) { ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 0u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 8u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 16u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 24u))])) { ++ break; ++ } ++ iop_a_src += 4u; ++ if (v_string_length > 65527u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 4u; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ v_char = WUFFS_JSON__LUT_CHARS[v_c8]; ++ if (v_char == 0u) { ++ iop_a_src += 1u; ++ if (v_string_length >= 65531u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 1u; ++ continue; ++ } else if (v_char == 1u) { ++ if (v_string_length != 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ } ++ goto label__string_loop_outer__break; ++ } else if (v_char == 2u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ goto label__string_loop_outer__continue; ++ } ++ v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)))); ++ v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c8]; ++ if (((uint8_t)(v_backslash & 128u)) != 0u) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_backslash & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (v_backslash != 0u) { ++ if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[((uint8_t)(v_backslash & 7u))]]) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[((uint8_t)(v_backslash & 7u))]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if (v_c8 == 117u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u); ++ v_uni4_value = 0u; ++ v_uni4_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ if (v_uni4_ok == 0u) { ++ } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) { ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (v_uni4_value >= 56320u) { ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) { ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u); ++ if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) { ++ v_uni4_high_surrogate = 0u; ++ v_uni4_value = 0u; ++ v_uni4_ok = 0u; ++ } else { ++ v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u)); ++ v_uni4_value = 0u; ++ v_uni4_ok = 128u; ++ v_uni4_string >>= 16u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ } ++ if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) { ++ v_uni4_value -= 56320u; ++ iop_a_src += 12u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (self->private_impl.f_quirks[20u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if ((v_c8 == 85u) && self->private_impl.f_quirks[2u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u); ++ v_uni8_value = 0u; ++ v_uni8_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 28u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 24u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 20u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 16u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ if (v_uni8_ok == 0u) { ++ } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) { ++ iop_a_src += 10u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (self->private_impl.f_quirks[20u]) { ++ iop_a_src += 10u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if ((v_c8 == 120u) && self->private_impl.f_quirks[9u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__string_loop_outer__continue; ++ } ++ v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ v_backslash_x_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))]; ++ v_backslash_x_ok &= v_c8; ++ v_backslash_x_value = ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 & 15u)) << 4u)))); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))]; ++ v_backslash_x_ok &= v_c8; ++ v_backslash_x_value = ((uint8_t)(((uint8_t)(v_backslash_x_value | ((uint8_t)(v_c8 & 15u)))))); ++ if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } else if (v_char == 3u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ if ((v_multi_byte_utf8 & 49152u) == 32768u) { ++ v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u))); ++ iop_a_src += 2u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 2u; ++ continue; ++ } ++ } else if (v_char == 4u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if ((v_multi_byte_utf8 & 12632064u) == 8421376u) { ++ v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u))); ++ if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) { ++ iop_a_src += 3u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 3u; ++ continue; ++ } ++ } ++ } else if (v_char == 5u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) { ++ v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) | ++ (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) | ++ (4032u & (v_multi_byte_utf8 >> 10u)) | ++ (63u & (v_multi_byte_utf8 >> 24u))); ++ if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) { ++ iop_a_src += 4u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 4u; ++ continue; ++ } ++ } ++ } ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (((uint8_t)(v_char & 128u)) != 0u) { ++ if (self->private_impl.f_quirks[0u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_char & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ if (v_char == 138u) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code); ++ goto exit; ++ } ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ } ++ label__string_loop_outer__break:; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14); ++ continue; ++ } ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15); ++ continue; ++ } ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ break; ++ } ++ if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) { ++ v_expect = 4104u; ++ goto label__outer__continue; ++ } ++ break; ++ } else if (v_class == 2u) { ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) { ++ if (self->private_impl.f_quirks[13u]) { ++ v_expect = 4162u; ++ } else { ++ v_expect = 4098u; ++ } ++ } else { ++ if (self->private_impl.f_quirks[13u]) { ++ v_expect = 8114u; ++ } else { ++ v_expect = 7858u; ++ } ++ } ++ goto label__outer__continue; ++ } else if (v_class == 3u) { ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 7858u; ++ goto label__outer__continue; ++ } else if (v_class == 4u) { ++ while (true) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_number_length = wuffs_json__decoder__decode_number(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ v_number_status = (v_number_length >> 8u); ++ v_vminor = 10486787u; ++ if ((v_number_length & 128u) != 0u) { ++ v_vminor = 10486785u; ++ } ++ v_number_length = (v_number_length & 127u); ++ if (v_number_status == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ break; ++ } ++ while (v_number_length > 0u) { ++ v_number_length -= 1u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ } ++ if (v_number_status == 1u) { ++ if (self->private_impl.f_quirks[14u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } else if (v_number_status == 2u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18); ++ } ++ } ++ } ++ break; ++ } else if (v_class == 5u) { ++ v_vminor = 2113553u; ++ if (v_depth == 0u) { ++ } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { ++ v_vminor = 2113601u; ++ } else { ++ v_vminor = 2113569u; ++ } ++ if (v_depth >= 1024u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_stack_byte = (v_depth / 32u); ++ v_stack_bit = (v_depth & 31u); ++ self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit); ++ v_depth += 1u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4162u; ++ v_expect_after_value = 4164u; ++ goto label__outer__continue; ++ } else if (v_class == 6u) { ++ iop_a_src += 1u; ++ if (v_depth <= 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__break; ++ } ++ v_depth -= 1u; ++ v_stack_byte = ((v_depth - 1u) / 32u); ++ v_stack_bit = ((v_depth - 1u) & 31u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4356u; ++ v_expect_after_value = 4356u; ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4164u; ++ v_expect_after_value = 4164u; ++ } ++ goto label__outer__continue; ++ } else if (v_class == 7u) { ++ v_vminor = 2105361u; ++ if (v_depth == 0u) { ++ } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { ++ v_vminor = 2105409u; ++ } else { ++ v_vminor = 2105377u; ++ } ++ if (v_depth >= 1024u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_stack_byte = (v_depth / 32u); ++ v_stack_bit = (v_depth & 31u); ++ self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit)); ++ v_depth += 1u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 8114u; ++ v_expect_after_value = 4356u; ++ goto label__outer__continue; ++ } else if (v_class == 8u) { ++ iop_a_src += 1u; ++ if (v_depth <= 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__break; ++ } ++ v_depth -= 1u; ++ v_stack_byte = ((v_depth - 1u) / 32u); ++ v_stack_bit = ((v_depth - 1u) & 31u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4356u; ++ v_expect_after_value = 4356u; ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4164u; ++ v_expect_after_value = 4164u; ++ } ++ goto label__outer__continue; ++ } else if (v_class == 9u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 5u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19); ++ goto label__outer__continue; ++ } ++ } else if (v_class == 10u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20); ++ goto label__outer__continue; ++ } ++ } else if (v_class == 11u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); ++ goto label__outer__continue; ++ } ++ if (self->private_impl.f_quirks[14u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } ++ } else if (v_class == 12u) { ++ if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_comment_type > 0u) { ++ goto label__outer__continue; ++ } ++ } ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (v_depth == 0u) { ++ break; ++ } ++ v_expect = v_expect_after_value; ++ } ++ label__outer__break:; ++ if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_end_of_data = true; ++ ++ ok: ++ self->private_impl.p_decode_tokens = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_data.s_decode_tokens.v_depth = v_depth; ++ self->private_data.s_decode_tokens.v_expect = v_expect; ++ self->private_data.s_decode_tokens.v_expect_after_value = v_expect_after_value; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func json.decoder.decode_number ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_number( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ uint32_t v_floating_point = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ do { ++ v_n = 0u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 != 45u) { ++ } else { ++ v_n += 1u; ++ iop_a_src += 1u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ v_n |= 256u; ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ } ++ if (v_c8 == 48u) { ++ v_n += 1u; ++ iop_a_src += 1u; ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (v_n > 99u) { ++ break; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 != 46u) { ++ } else { ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ v_floating_point = 128u; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (v_n > 99u) { ++ break; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ } ++ if ((v_c8 != 69u) && (v_c8 != 101u)) { ++ break; ++ } ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ v_floating_point = 128u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ v_n |= 256u; ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_c8 != 43u) && (v_c8 != 45u)) { ++ } else { ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } while (0); ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ return (v_n | v_floating_point); ++} ++ ++// -------- func json.decoder.decode_digits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_digits( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n) { ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_n = a_n; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c8]) { ++ break; ++ } ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ } ++ if (v_n == a_n) { ++ v_n |= 256u; ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ return v_n; ++} ++ ++// -------- func json.decoder.decode_leading ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_leading( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_u = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_leading; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u]; ++ self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u]; ++ while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_c8 == 30u) && self->private_impl.f_allow_leading_ars) { ++ self->private_impl.f_allow_leading_ars = false; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ continue; ++ } else if ((v_c8 == 239u) && self->private_impl.f_allow_leading_ubom) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ if (a_src && a_src->meta.closed) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ continue; ++ } ++ v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if (v_u == 12565487u) { ++ self->private_impl.f_allow_leading_ubom = false; ++ iop_a_src += 3u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ continue; ++ } ++ } ++ break; ++ } ++ ++ ok: ++ self->private_impl.p_decode_leading = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_leading = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_comment ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_comment( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint16_t v_c16 = 0; ++ uint32_t v_length = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_comment; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_comment_type = 0u; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ if ((v_c16 == 10799u) && self->private_impl.f_quirks[11u]) { ++ iop_a_src += 2u; ++ v_length = 2u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { ++ if (v_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ if (v_c16 == 12074u) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 1u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if (v_length >= 65533u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_length += 1u; ++ } ++ } else if ((v_c16 == 12079u) && self->private_impl.f_quirks[12u]) { ++ iop_a_src += 2u; ++ v_length = 2u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 2u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if (v_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 == 10u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 2u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if (v_length >= 65533u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_length += 1u; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_decode_comment = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_comment = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_inf_nan ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_inf_nan( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint32_t v_neg = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if ((v_c32 | 2105376u) == 6712937u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) { ++ if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 8u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ } else if ( ! (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ continue; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 3u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 | 2105376u) == 7233902u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 3u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 & 255u) == 43u) { ++ v_neg = 0u; ++ } else if ((v_c32 & 255u) == 45u) { ++ v_neg = 1u; ++ } else { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_c32 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u); ++ if ((v_c32 | 2105376u) == 6712937u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) { ++ if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 9u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ } else if ( ! (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 4u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 | 2105376u) == 7233902u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 4u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ ++ ok: ++ self->private_impl.p_decode_inf_nan = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_inf_nan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_trailer ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_trailer( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_whitespace_length = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_trailer; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_quirks[18u]) { ++ self->private_impl.f_trailer_stop = 10u; ++ } else { ++ self->private_impl.f_trailer_stop = 0u; ++ } ++ label__outer__continue:; ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ v_whitespace_length = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (a_src && a_src->meta.closed) { ++ goto label__outer__break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (WUFFS_JSON__LUT_CLASSES[v_c8] != 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (self->private_impl.f_trailer_stop > 0u) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_comment_type > 0u) { ++ goto label__outer__continue; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if ((v_whitespace_length >= 65534u) || (v_c8 == self->private_impl.f_trailer_stop)) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c8 == self->private_impl.f_trailer_stop) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ goto label__outer__continue; ++ } ++ v_whitespace_length += 1u; ++ } ++ } ++ label__outer__break:; ++ ++ ok: ++ self->private_impl.p_decode_trailer = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_trailer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzma__error__bad_lzma2_header[] = "#lzma: bad LZMA2 header"; ++const char wuffs_lzma__error__bad_bitstream_trailer[] = "#lzma: bad bitstream trailer"; ++const char wuffs_lzma__error__bad_code[] = "#lzma: bad code"; ++const char wuffs_lzma__error__bad_decoded_length[] = "#lzma: bad decoded length"; ++const char wuffs_lzma__error__bad_distance[] = "#lzma: bad distance"; ++const char wuffs_lzma__error__bad_header[] = "#lzma: bad header"; ++const char wuffs_lzma__error__truncated_input[] = "#lzma: truncated input"; ++const char wuffs_lzma__error__unsupported_decoded_length[] = "#lzma: unsupported decoded length"; ++const char wuffs_lzma__error__unsupported_properties[] = "#lzma: unsupported properties"; ++const char wuffs_lzma__error__internal_error_inconsistent_i_o[] = "#lzma: internal error: inconsistent I/O"; ++const char wuffs_lzma__error__internal_error_inconsistent_dictionary_state[] = "#lzma: internal error: inconsistent dictionary state"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_LITERAL[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 1u, 2u, 3u, 4u, ++ 5u, 6u, 4u, 5u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_MATCH[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 7u, 7u, 7u, 7u, 7u, 7u, 7u, 10u, ++ 10u, 10u, 10u, 10u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_LONGREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 8u, 8u, 8u, 8u, 8u, 8u, 8u, 11u, ++ 11u, 11u, 11u, 11u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_SHORTREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 9u, 9u, 9u, 9u, 9u, 9u, 9u, 11u, ++ 11u, 11u, 11u, 11u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 3u, 3u, 3u, 3u, 3u, ++}; ++ ++#define WUFFS_LZMA__QUIRKS_BASE 1348001792u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_fast( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_slow( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__add_history( ++ wuffs_lzma__decoder* self, ++ wuffs_base__slice_u8 a_hist, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__do_transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__update_stashed_bytes( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_optional_end_of_stream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_dict( ++ wuffs_lzma__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_probs( ++ wuffs_lzma__decoder* self); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzma__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzma__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzma__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzma__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzma__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzma__decoder__initialize( ++ wuffs_lzma__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzma__decoder* ++wuffs_lzma__decoder__alloc(void) { ++ wuffs_lzma__decoder* x = ++ (wuffs_lzma__decoder*)(calloc(1, sizeof(wuffs_lzma__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzma__decoder__initialize( ++ x, sizeof(wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzma__decoder(void) { ++ return sizeof(wuffs_lzma__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzma.decoder.decode_bitstream_fast ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_fast( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_range = 0; ++ uint32_t v_state = 0; ++ uint32_t v_rep0 = 0; ++ uint32_t v_rep1 = 0; ++ uint32_t v_rep2 = 0; ++ uint32_t v_rep3 = 0; ++ uint32_t v_reptmp = 0; ++ uint32_t v_rep = 0; ++ uint64_t v_pos = 0; ++ uint64_t v_pos_end = 0; ++ uint32_t v_lc = 0; ++ uint64_t v_lp_mask = 0; ++ uint64_t v_pb_mask = 0; ++ uint32_t v_prob = 0; ++ uint32_t v_threshold = 0; ++ uint32_t v_tree_node = 0; ++ uint8_t v_prev_byte = 0; ++ uint32_t v_match_byte = 0; ++ uint32_t v_match_cusp = 0; ++ uint32_t v_len_state = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_len = 0; ++ uint32_t v_lanl_offset = 0; ++ uint32_t v_lanl_old_offset = 0; ++ uint32_t v_lanl_index = 0; ++ uint32_t v_num_extra_bits = 0; ++ uint32_t v_dist_extra_bits = 0; ++ uint32_t v_high_bit_was_on = 0; ++ uint32_t v_i = 0; ++ uint32_t v_index_ao00 = 0; ++ uint32_t v_index_ao41 = 0; ++ uint32_t v_index_lit = 0; ++ uint32_t v_index_len = 0; ++ uint32_t v_index_small_dist_base = 0; ++ uint32_t v_index_small_dist_extra = 0; ++ uint32_t v_index_small_dist = 0; ++ uint32_t v_index_large_dist = 0; ++ uint32_t v_dist = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_prev_byte = self->private_impl.f_stashed_bytes[0u]; ++ v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u])); ++ v_bits = self->private_impl.f_stashed_bits; ++ v_range = self->private_impl.f_stashed_range; ++ v_state = self->private_impl.f_stashed_state; ++ v_rep0 = self->private_impl.f_stashed_rep0; ++ v_rep1 = self->private_impl.f_stashed_rep1; ++ v_rep2 = self->private_impl.f_stashed_rep2; ++ v_rep3 = self->private_impl.f_stashed_rep3; ++ v_pos = self->private_impl.f_stashed_pos; ++ v_pos_end = self->private_impl.f_stashed_pos_end; ++ v_lc = self->private_impl.f_lc; ++ v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u); ++ v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u); ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 282u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 48u)) { ++ if (v_pos >= v_pos_end) { ++ self->private_impl.f_end_of_chunk = true; ++ break; ++ } ++ v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc)))); ++ v_lanl_offset = 0u; ++ if (v_state >= 7u) { ++ v_lanl_offset = 256u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_match_byte <<= 1u; ++ v_lanl_old_offset = v_lanl_offset; ++ v_lanl_offset &= v_match_byte; ++ v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node); ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u); ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_prev_byte = ((uint8_t)(v_tree_node)); ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_prev_byte), iop_a_dst += 1); ++ v_pos += 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state])); ++ continue; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)])); ++ v_len = ((v_tree_node & 7u) + 2u); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_len_state = 3u; ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_len_state = 3u; ++ } while (0); ++ v_slot = 1u; ++ while (v_slot < 64u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = (v_slot << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = ((v_slot << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_slot &= 63u; ++ v_rep = v_slot; ++ if (v_slot < 4u) { ++ } else if (v_slot < 14u) { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_index_small_dist_base = ((uint32_t)(v_rep - v_slot)); ++ v_index_small_dist_extra = 1u; ++ v_dist_extra_bits = 0u; ++ v_i = 0u; ++ while (v_i < v_num_extra_bits) { ++ v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u); ++ v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u)); ++ v_i += 1u; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << v_i); ++ v_i += 1u; ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } else { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_dist_extra_bits = 0u; ++ while (true) { ++ v_range >>= 1u; ++ v_bits -= v_range; ++ v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u))); ++ v_bits += (v_range & v_high_bit_was_on); ++ v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 4u) { ++ break; ++ } ++ } ++ v_dist_extra_bits <<= 4u; ++ v_index_large_dist = 1u; ++ while (true) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u))); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u)); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits)); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 0u) { ++ break; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } ++ if (v_rep >= 4294967295u) { ++ self->private_impl.f_end_of_chunk = true; ++ goto label__outer__break; ++ } ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_rep; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_len = 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep3; ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } ++ } ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 2u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ } while (0); ++ } while (0); ++ v_dist = (v_rep0 + 1u); ++ if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_pos += ((uint64_t)(v_len)); ++ if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_adj_dist > self->private_impl.f_dict_seen) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ if (v_len < v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } else if (v_len == v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ v_len -= v_adj_dist; ++ if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_len + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ } ++ if (v_dist >= 8u) { ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } else { ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } ++ } ++ label__outer__break:; ++ self->private_impl.f_stashed_bytes[0u] = v_prev_byte; ++ self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte)); ++ self->private_impl.f_stashed_bits = v_bits; ++ self->private_impl.f_stashed_range = v_range; ++ self->private_impl.f_stashed_state = v_state; ++ self->private_impl.f_stashed_rep0 = v_rep0; ++ self->private_impl.f_stashed_rep1 = v_rep1; ++ self->private_impl.f_stashed_rep2 = v_rep2; ++ self->private_impl.f_stashed_rep3 = v_rep3; ++ self->private_impl.f_stashed_pos = v_pos; ++ self->private_impl.f_stashed_pos_end = v_pos_end; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_bitstream_slow ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_slow( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_range = 0; ++ uint32_t v_state = 0; ++ uint32_t v_rep0 = 0; ++ uint32_t v_rep1 = 0; ++ uint32_t v_rep2 = 0; ++ uint32_t v_rep3 = 0; ++ uint32_t v_reptmp = 0; ++ uint32_t v_rep = 0; ++ uint64_t v_pos = 0; ++ uint64_t v_pos_end = 0; ++ uint32_t v_lc = 0; ++ uint64_t v_lp_mask = 0; ++ uint64_t v_pb_mask = 0; ++ uint32_t v_prob = 0; ++ uint32_t v_threshold = 0; ++ uint32_t v_tree_node = 0; ++ uint8_t v_prev_byte = 0; ++ uint32_t v_match_byte = 0; ++ uint32_t v_match_cusp = 0; ++ uint32_t v_len_state = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_len = 0; ++ uint32_t v_lanl_offset = 0; ++ uint32_t v_lanl_old_offset = 0; ++ uint32_t v_lanl_index = 0; ++ uint32_t v_num_extra_bits = 0; ++ uint32_t v_dist_extra_bits = 0; ++ uint32_t v_high_bit_was_on = 0; ++ uint32_t v_i = 0; ++ uint32_t v_index_ao00 = 0; ++ uint32_t v_index_ao41 = 0; ++ uint32_t v_index_lit = 0; ++ uint32_t v_index_len = 0; ++ uint32_t v_index_small_dist_base = 0; ++ uint32_t v_index_small_dist_extra = 0; ++ uint32_t v_index_small_dist = 0; ++ uint32_t v_index_large_dist = 0; ++ uint32_t v_dist = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_bitstream_slow; ++ if (coro_susp_point) { ++ v_bits = self->private_data.s_decode_bitstream_slow.v_bits; ++ v_range = self->private_data.s_decode_bitstream_slow.v_range; ++ v_state = self->private_data.s_decode_bitstream_slow.v_state; ++ v_rep0 = self->private_data.s_decode_bitstream_slow.v_rep0; ++ v_rep1 = self->private_data.s_decode_bitstream_slow.v_rep1; ++ v_rep2 = self->private_data.s_decode_bitstream_slow.v_rep2; ++ v_rep3 = self->private_data.s_decode_bitstream_slow.v_rep3; ++ v_rep = self->private_data.s_decode_bitstream_slow.v_rep; ++ v_pos = self->private_data.s_decode_bitstream_slow.v_pos; ++ v_pos_end = self->private_data.s_decode_bitstream_slow.v_pos_end; ++ v_lc = self->private_data.s_decode_bitstream_slow.v_lc; ++ v_lp_mask = self->private_data.s_decode_bitstream_slow.v_lp_mask; ++ v_pb_mask = self->private_data.s_decode_bitstream_slow.v_pb_mask; ++ v_tree_node = self->private_data.s_decode_bitstream_slow.v_tree_node; ++ v_prev_byte = self->private_data.s_decode_bitstream_slow.v_prev_byte; ++ v_match_byte = self->private_data.s_decode_bitstream_slow.v_match_byte; ++ v_len_state = self->private_data.s_decode_bitstream_slow.v_len_state; ++ v_slot = self->private_data.s_decode_bitstream_slow.v_slot; ++ v_len = self->private_data.s_decode_bitstream_slow.v_len; ++ v_lanl_offset = self->private_data.s_decode_bitstream_slow.v_lanl_offset; ++ v_num_extra_bits = self->private_data.s_decode_bitstream_slow.v_num_extra_bits; ++ v_dist_extra_bits = self->private_data.s_decode_bitstream_slow.v_dist_extra_bits; ++ v_i = self->private_data.s_decode_bitstream_slow.v_i; ++ v_index_lit = self->private_data.s_decode_bitstream_slow.v_index_lit; ++ v_index_len = self->private_data.s_decode_bitstream_slow.v_index_len; ++ v_index_small_dist_base = self->private_data.s_decode_bitstream_slow.v_index_small_dist_base; ++ v_index_small_dist_extra = self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra; ++ v_index_large_dist = self->private_data.s_decode_bitstream_slow.v_index_large_dist; ++ v_dist = self->private_data.s_decode_bitstream_slow.v_dist; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_prev_byte = self->private_impl.f_stashed_bytes[0u]; ++ v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u])); ++ v_bits = self->private_impl.f_stashed_bits; ++ v_range = self->private_impl.f_stashed_range; ++ v_state = self->private_impl.f_stashed_state; ++ v_rep0 = self->private_impl.f_stashed_rep0; ++ v_rep1 = self->private_impl.f_stashed_rep1; ++ v_rep2 = self->private_impl.f_stashed_rep2; ++ v_rep3 = self->private_impl.f_stashed_rep3; ++ v_pos = self->private_impl.f_stashed_pos; ++ v_pos_end = self->private_impl.f_stashed_pos_end; ++ v_lc = self->private_impl.f_lc; ++ v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u); ++ v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u); ++ while ( ! (self->private_impl.p_decode_bitstream_slow != 0)) { ++ if (v_pos >= v_pos_end) { ++ self->private_impl.f_end_of_chunk = true; ++ break; ++ } ++ v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc)))); ++ if (v_state >= 7u) { ++ v_lanl_offset = 256u; ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_match_byte <<= 1u; ++ v_lanl_old_offset = v_lanl_offset; ++ v_lanl_offset &= v_match_byte; ++ v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node); ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u); ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ } else { ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ } ++ v_prev_byte = ((uint8_t)(v_tree_node)); ++ self->private_data.s_decode_bitstream_slow.scratch = v_prev_byte; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_bitstream_slow.scratch)); ++ v_pos += 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state])); ++ continue; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)])); ++ v_len = ((v_tree_node & 7u) + 2u); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_len_state = 3u; ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_11 = *iop_a_src++; ++ v_c8 = t_11; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_len_state = 3u; ++ } while (0); ++ v_slot = 1u; ++ while (v_slot < 64u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = (v_slot << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = ((v_slot << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_12 = *iop_a_src++; ++ v_c8 = t_12; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_slot &= 63u; ++ v_rep = v_slot; ++ if (v_slot < 4u) { ++ } else if (v_slot < 14u) { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_index_small_dist_base = ((uint32_t)(v_rep - v_slot)); ++ v_index_small_dist_extra = 1u; ++ v_dist_extra_bits = 0u; ++ v_i = 0u; ++ while (v_i < v_num_extra_bits) { ++ v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u); ++ v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u)); ++ v_i += 1u; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << v_i); ++ v_i += 1u; ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_13 = *iop_a_src++; ++ v_c8 = t_13; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } else { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_dist_extra_bits = 0u; ++ while (true) { ++ v_range >>= 1u; ++ v_bits -= v_range; ++ v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u))); ++ v_bits += (v_range & v_high_bit_was_on); ++ v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_14 = *iop_a_src++; ++ v_c8 = t_14; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 4u) { ++ break; ++ } ++ } ++ v_dist_extra_bits <<= 4u; ++ v_index_large_dist = 1u; ++ while (true) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u))); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u)); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits)); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_15 = *iop_a_src++; ++ v_c8 = t_15; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 0u) { ++ break; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } ++ if (v_rep >= 4294967295u) { ++ self->private_impl.f_end_of_chunk = true; ++ goto label__outer__break; ++ } ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_rep; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_16 = *iop_a_src++; ++ v_c8 = t_16; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_17 = *iop_a_src++; ++ v_c8 = t_17; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_18 = *iop_a_src++; ++ v_c8 = t_18; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_len = 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_19 = *iop_a_src++; ++ v_c8 = t_19; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_20 = *iop_a_src++; ++ v_c8 = t_20; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_21 = *iop_a_src++; ++ v_c8 = t_21; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_22 = *iop_a_src++; ++ v_c8 = t_22; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_23 = *iop_a_src++; ++ v_c8 = t_23; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_24 = *iop_a_src++; ++ v_c8 = t_24; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep3; ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } ++ } ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_25 = *iop_a_src++; ++ v_c8 = t_25; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_26 = *iop_a_src++; ++ v_c8 = t_26; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 2u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_27 = *iop_a_src++; ++ v_c8 = t_27; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_28 = *iop_a_src++; ++ v_c8 = t_28; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_29 = *iop_a_src++; ++ v_c8 = t_29; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_30 = *iop_a_src++; ++ v_c8 = t_30; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_31 = *iop_a_src++; ++ v_c8 = t_31; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ } while (0); ++ } while (0); ++ v_dist = (v_rep0 + 1u); ++ if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_pos += ((uint64_t)(v_len)); ++ while (274u > ((uint64_t)(io2_a_dst - iop_a_dst))) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34); ++ } ++ if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_adj_dist > self->private_impl.f_dict_seen) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ if (v_len < v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } else if (v_len == v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ v_len -= v_adj_dist; ++ if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ } ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } ++ label__outer__break:; ++ self->private_impl.f_stashed_bytes[0u] = v_prev_byte; ++ self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte)); ++ self->private_impl.f_stashed_bits = v_bits; ++ self->private_impl.f_stashed_range = v_range; ++ self->private_impl.f_stashed_state = v_state; ++ self->private_impl.f_stashed_rep0 = v_rep0; ++ self->private_impl.f_stashed_rep1 = v_rep1; ++ self->private_impl.f_stashed_rep2 = v_rep2; ++ self->private_impl.f_stashed_rep3 = v_rep3; ++ self->private_impl.f_stashed_pos = v_pos; ++ self->private_impl.f_stashed_pos_end = v_pos_end; ++ ++ ok: ++ self->private_impl.p_decode_bitstream_slow = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_bitstream_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_bitstream_slow.v_bits = v_bits; ++ self->private_data.s_decode_bitstream_slow.v_range = v_range; ++ self->private_data.s_decode_bitstream_slow.v_state = v_state; ++ self->private_data.s_decode_bitstream_slow.v_rep0 = v_rep0; ++ self->private_data.s_decode_bitstream_slow.v_rep1 = v_rep1; ++ self->private_data.s_decode_bitstream_slow.v_rep2 = v_rep2; ++ self->private_data.s_decode_bitstream_slow.v_rep3 = v_rep3; ++ self->private_data.s_decode_bitstream_slow.v_rep = v_rep; ++ self->private_data.s_decode_bitstream_slow.v_pos = v_pos; ++ self->private_data.s_decode_bitstream_slow.v_pos_end = v_pos_end; ++ self->private_data.s_decode_bitstream_slow.v_lc = v_lc; ++ self->private_data.s_decode_bitstream_slow.v_lp_mask = v_lp_mask; ++ self->private_data.s_decode_bitstream_slow.v_pb_mask = v_pb_mask; ++ self->private_data.s_decode_bitstream_slow.v_tree_node = v_tree_node; ++ self->private_data.s_decode_bitstream_slow.v_prev_byte = v_prev_byte; ++ self->private_data.s_decode_bitstream_slow.v_match_byte = v_match_byte; ++ self->private_data.s_decode_bitstream_slow.v_len_state = v_len_state; ++ self->private_data.s_decode_bitstream_slow.v_slot = v_slot; ++ self->private_data.s_decode_bitstream_slow.v_len = v_len; ++ self->private_data.s_decode_bitstream_slow.v_lanl_offset = v_lanl_offset; ++ self->private_data.s_decode_bitstream_slow.v_num_extra_bits = v_num_extra_bits; ++ self->private_data.s_decode_bitstream_slow.v_dist_extra_bits = v_dist_extra_bits; ++ self->private_data.s_decode_bitstream_slow.v_i = v_i; ++ self->private_data.s_decode_bitstream_slow.v_index_lit = v_index_lit; ++ self->private_data.s_decode_bitstream_slow.v_index_len = v_index_len; ++ self->private_data.s_decode_bitstream_slow.v_index_small_dist_base = v_index_small_dist_base; ++ self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra = v_index_small_dist_extra; ++ self->private_data.s_decode_bitstream_slow.v_index_large_dist = v_index_large_dist; ++ self->private_data.s_decode_bitstream_slow.v_dist = v_dist; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.add_history ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__add_history( ++ wuffs_lzma__decoder* self, ++ wuffs_base__slice_u8 a_hist, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint64_t v_dict_workbuf_index = 0; ++ uint64_t v_dict_size = 0; ++ uint64_t v_hist_length = 0; ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n_copied = 0; ++ uint64_t v_n = 0; ++ ++ v_dict_workbuf_index = ((uint64_t)(self->private_impl.f_dict_workbuf_index)); ++ v_dict_size = ((uint64_t)(self->private_impl.f_dict_size)); ++ if (((uint64_t)(a_hist.len)) == 0u) { ++ return wuffs_base__make_status(NULL); ++ } ++ if (((uint64_t)(a_workbuf.len)) < (v_dict_size + 273u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ } ++ v_hist_length = ((uint64_t)(a_hist.len)); ++ if (v_hist_length > 4294967295u) { ++ self->private_impl.f_dict_seen = 4294967295u; ++ } else { ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dict_seen, ((uint32_t)(v_hist_length))); ++ } ++ v_s = a_hist; ++ if (((uint64_t)(v_s.len)) >= v_dict_size) { ++ v_s = wuffs_private_impl__slice_u8__suffix(v_s, v_dict_size); ++ wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, v_s); ++ self->private_impl.f_dict_workbuf_index = 0u; ++ } else if (v_dict_workbuf_index > v_dict_size) { ++ return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ } else { ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_ij(a_workbuf, v_dict_workbuf_index, v_dict_size), v_s); ++ if (v_n_copied < ((uint64_t)(v_s.len))) { ++ v_n = wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, wuffs_base__slice_u8__subslice_i(v_s, v_n_copied)); ++ self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n)); ++ } else { ++ v_n = ((uint64_t)(v_dict_workbuf_index + v_n_copied)); ++ if (v_n < v_dict_size) { ++ self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n)); ++ } else { ++ self->private_impl.f_dict_workbuf_index = 0u; ++ } ++ } ++ } ++ if ((273u > v_dict_size) || (v_dict_size > ((uint64_t)(a_workbuf.len)))) { ++ return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ } ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_i(a_workbuf, v_dict_size), wuffs_base__slice_u8__subslice_j(a_workbuf, 273u)); ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func lzma.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzma__decoder__get_quirk( ++ const wuffs_lzma__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 1348001792u) { ++ if (self->private_impl.f_allow_non_zero_initial_byte) { ++ return 1u; ++ } ++ } else if (a_key == 1348001793u) { ++ return ((uint64_t)(self->private_impl.f_format_extension)); ++ } ++ return 0u; ++} ++ ++// -------- func lzma.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzma__decoder__set_quirk( ++ wuffs_lzma__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ uint32_t v_v = 0; ++ uint32_t v_n = 0; ++ ++ if (a_key == 1348001792u) { ++ self->private_impl.f_allow_non_zero_initial_byte = (a_value > 0u); ++ } else if (a_key == 1348001793u) { ++ if (a_value == 0u) { ++ self->private_impl.f_format_extension = 0u; ++ return wuffs_base__make_status(NULL); ++ } else if ((a_value & 255u) == 1u) { ++ if ((a_value >> 8u) <= 255u) { ++ self->private_impl.f_format_extension = ((uint32_t)(a_value)); ++ v_v = (self->private_impl.f_format_extension >> 8u); ++ v_n = (((uint32_t)(1u)) << (v_v & 31u)); ++ wuffs_private_impl__u32__sat_sub_indirect(&v_n, ((v_n >> 4u) * ((v_v >> 5u) & 7u))); ++ if ((v_n < 4096u) || (536870912u < v_n)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_dict_size = v_n; ++ return wuffs_base__make_status(NULL); ++ } ++ } else if ((a_value & 255u) == 2u) { ++ if ((a_value >> 8u) <= 40u) { ++ self->private_impl.f_format_extension = ((uint32_t)(a_value)); ++ v_v = (self->private_impl.f_format_extension >> 8u); ++ if (v_v < 40u) { ++ self->private_impl.f_dict_size = ((2u | (v_v & 1u)) << ((v_v >> 1u) + 11u)); ++ } else { ++ self->private_impl.f_dict_size = 4294967295u; ++ } ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzma.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzma__decoder__dst_history_retain_length( ++ const wuffs_lzma__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func lzma.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzma__decoder__workbuf_len( ++ const wuffs_lzma__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ uint64_t v_m = 0; ++ ++ if (self->private_impl.f_dict_size == 0u) { ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ } ++ v_m = (((uint64_t)(self->private_impl.f_dict_size)) + 273u); ++ return wuffs_base__utility__make_range_ii_u64(v_m, v_m); ++} ++ ++// -------- func lzma.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzma__decoder__transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_mark = 0; ++ wuffs_base__status v_dti_status = wuffs_base__make_status(NULL); ++ wuffs_base__status v_ah_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_lzma__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_dti_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ } ++ if ( ! wuffs_base__status__is_suspension(&v_dti_status)) { ++ status = v_dti_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_dti_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__truncated_input); ++ goto exit; ++ } ++ v_ah_status = wuffs_lzma__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst), a_workbuf); ++ if (wuffs_base__status__is_error(&v_ah_status)) { ++ status = v_ah_status; ++ goto exit; ++ } ++ status = v_dti_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzma.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__do_transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_header_byte = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint8_t v_prop_byte = 0; ++ uint32_t v_lc = 0; ++ uint32_t v_lp = 0; ++ uint32_t v_pb = 0; ++ uint32_t v_length = 0; ++ uint32_t v_n_copied = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_header_byte = self->private_data.s_do_transform_io.v_header_byte; ++ v_length = self->private_data.s_do_transform_io.v_length; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_lzma2_need_prob_reset = true; ++ self->private_impl.f_lzma2_need_properties = true; ++ self->private_impl.f_lzma2_need_dict_reset = true; ++ while (true) { ++ if ((self->private_impl.f_format_extension & 255u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_prop_byte = t_0; ++ } ++ if (v_prop_byte >= 225u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_header); ++ goto exit; ++ } ++ v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prop_byte /= 9u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u)))); ++ v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u)))); ++ if ((v_lc + v_lp) > 4u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_properties); ++ goto exit; ++ } ++ self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u); ++ self->private_impl.f_lp = v_lp; ++ self->private_impl.f_pb = v_pb; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; ++ } ++ self->private_impl.f_dict_size = wuffs_base__u32__max(v_c32, 4096u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint64_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_2 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 56) { ++ t_2 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_decoded_length = t_2; ++ } ++ if ((self->private_impl.f_decoded_length >= 9223372036854775808u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length); ++ goto exit; ++ } ++ wuffs_lzma__decoder__initialize_probs(self); ++ } else if ((self->private_impl.f_format_extension & 255u) == 1u) { ++ self->private_impl.f_lc = 3u; ++ self->private_impl.f_lp = 0u; ++ self->private_impl.f_pb = 2u; ++ self->private_impl.f_decoded_length = 18446744073709551615u; ++ wuffs_lzma__decoder__initialize_probs(self); ++ } else { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) { ++ iop_a_src += 1u; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_header_byte = t_3; ++ } ++ if (v_header_byte < 128u) { ++ if (v_header_byte < 2u) { ++ self->private_impl.f_lzma2_need_prob_reset = true; ++ self->private_impl.f_lzma2_need_properties = true; ++ self->private_impl.f_lzma2_need_dict_reset = false; ++ wuffs_lzma__decoder__initialize_dict(self); ++ } else if ((v_header_byte > 2u) || self->private_impl.f_lzma2_need_dict_reset) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ self->private_impl.f_prev_lzma2_chunk_was_uncompressed = true; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_c32 = t_4; ++ } ++ v_length = (1u + v_c32); ++ while (true) { ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_stashed_pos, ((uint64_t)(v_n_copied))); ++ if (v_length <= v_n_copied) { ++ break; ++ } ++ v_length -= v_n_copied; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ } ++ continue; ++ } ++ self->private_impl.f_decoded_length = ((uint64_t)(v_header_byte)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_c32 = t_5; ++ } ++ self->private_impl.f_decoded_length = (((self->private_impl.f_decoded_length & 31u) << 16u) + ((uint64_t)((1u + v_c32)))); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); ++ } ++ } ++ v_c32 = t_6; ++ } ++ self->private_impl.f_lzma2_encoded_length_want = ((uint64_t)((1u + v_c32))); ++ if (v_header_byte >= 160u) { ++ wuffs_lzma__decoder__initialize_probs(self); ++ self->private_impl.f_lzma2_need_prob_reset = false; ++ } ++ if (v_header_byte >= 192u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_prop_byte = t_7; ++ } ++ if (v_prop_byte >= 225u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prop_byte /= 9u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u)))); ++ v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u)))); ++ if ((v_lc + v_lp) > 4u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u); ++ self->private_impl.f_lp = v_lp; ++ self->private_impl.f_pb = v_pb; ++ self->private_impl.f_lzma2_need_properties = false; ++ } ++ if (v_header_byte >= 224u) { ++ self->private_impl.f_lzma2_need_dict_reset = false; ++ wuffs_lzma__decoder__initialize_dict(self); ++ } else if (self->private_impl.f_prev_lzma2_chunk_was_uncompressed) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ status = wuffs_lzma__decoder__update_stashed_bytes(self, a_dst, a_workbuf); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_prev_lzma2_chunk_was_uncompressed = false; ++ if (self->private_impl.f_lzma2_need_prob_reset || self->private_impl.f_lzma2_need_properties || self->private_impl.f_lzma2_need_dict_reset) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ if ((v_c8 != 0u) && ! self->private_impl.f_allow_non_zero_initial_byte) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_code); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_9 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9); ++ if (num_bits_9 == 24) { ++ t_9 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)); ++ } ++ } ++ self->private_impl.f_stashed_bits = t_9; ++ } ++ if (self->private_impl.f_stashed_bits == 4294967295u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_code); ++ goto exit; ++ } ++ self->private_impl.f_stashed_range = 4294967295u; ++ self->private_impl.f_stashed_pos_end = wuffs_base__u64__sat_add(self->private_impl.f_stashed_pos, self->private_impl.f_decoded_length); ++ if ((self->private_impl.f_stashed_pos_end == 18446744073709551615u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length); ++ goto exit; ++ } ++ self->private_impl.f_lzma2_encoded_length_have = 5u; ++ while (((uint64_t)(a_workbuf.len)) < (((uint64_t)(self->private_impl.f_dict_size)) + 273u)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_workbuf); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_10 = wuffs_lzma__decoder__decode_bitstream(self, a_dst, a_src, a_workbuf); ++ v_status = t_10; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_lzma2_encoded_length_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(22); ++ } ++ if (self->private_impl.f_decoded_length == 18446744073709551615u) { ++ if (self->private_impl.f_stashed_bits != 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ } else if (self->private_impl.f_stashed_pos != self->private_impl.f_stashed_pos_end) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_decoded_length); ++ goto exit; ++ } else if (self->private_impl.f_stashed_bits != 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ status = wuffs_lzma__decoder__decode_optional_end_of_stream(self, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_stashed_bits != 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ } ++ if ((self->private_impl.f_format_extension & 255u) < 2u) { ++ break; ++ } else if (self->private_impl.f_lzma2_encoded_length_have != self->private_impl.f_lzma2_encoded_length_want) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_header_byte = v_header_byte; ++ self->private_data.s_do_transform_io.v_length = v_length; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_bitstream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_bitstream; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_end_of_chunk = false; ++ while (true) { ++ v_status = wuffs_lzma__decoder__decode_bitstream_fast(self, a_dst, a_src, a_workbuf); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ if (self->private_impl.f_end_of_chunk) { ++ break; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_lzma__decoder__decode_bitstream_slow(self, a_dst, a_src, a_workbuf); ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_end_of_chunk) { ++ break; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_bitstream = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_bitstream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func lzma.decoder.update_stashed_bytes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__update_stashed_bytes( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_dist = 0; ++ uint32_t v_which = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_update_stashed_bytes; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ v_dist = 1u; ++ v_which = 0u; ++ while (v_which < 2u) { ++ if (((uint64_t)(v_dist)) <= ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ self->private_impl.f_stashed_bytes[v_which] = iop_a_dst[-1]; ++ iop_a_dst--; ++ } else { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ self->private_impl.f_stashed_bytes[v_which] = a_workbuf.ptr[v_wb_index]; ++ } ++ v_dist = (1u + self->private_impl.f_stashed_rep0); ++ v_which += 1u; ++ } ++ ++ ok: ++ self->private_impl.p_update_stashed_bytes = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_update_stashed_bytes = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_optional_end_of_stream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_optional_end_of_stream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_optional_end_of_stream; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_stashed_pos_end = 18446744073709551615u; ++ while (true) { ++ { ++ wuffs_base__io_buffer* o_0_v_w = v_w; ++ uint8_t* o_0_iop_v_w = iop_v_w; ++ uint8_t* o_0_io0_v_w = io0_v_w; ++ uint8_t* o_0_io1_v_w = io1_v_w; ++ uint8_t* o_0_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ { ++ wuffs_base__status t_0 = wuffs_lzma__decoder__decode_bitstream_slow(self, v_w, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ v_w = o_0_v_w; ++ iop_v_w = o_0_iop_v_w; ++ io0_v_w = o_0_io0_v_w; ++ io1_v_w = o_0_io1_v_w; ++ io2_v_w = o_0_io2_v_w; ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr == wuffs_base__suspension__short_write) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ self->private_impl.f_stashed_pos_end = self->private_impl.f_stashed_pos; ++ ++ ok: ++ self->private_impl.p_decode_optional_end_of_stream = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_optional_end_of_stream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func lzma.decoder.initialize_dict ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_dict( ++ wuffs_lzma__decoder* self) { ++ self->private_impl.f_dict_workbuf_index = 0u; ++ self->private_impl.f_dict_seen = 0u; ++ self->private_impl.f_stashed_bytes[0u] = 0u; ++ self->private_impl.f_stashed_bytes[1u] = 0u; ++ self->private_impl.f_stashed_pos = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func lzma.decoder.initialize_probs ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_probs( ++ wuffs_lzma__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ ++ v_i = 0u; ++ while (v_i < 192u) { ++ self->private_data.f_probs_ao00[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao20[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao40[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 192u) { ++ self->private_data.f_probs_ao41[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao60[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao63[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_match_len_low[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_match_len_mid[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_probs_match_len_high[0u][v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_longrep_len_low[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_longrep_len_mid[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_probs_longrep_len_high[0u][v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 64u) { ++ self->private_data.f_probs_slot[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 128u) { ++ self->private_data.f_probs_small_dist[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ self->private_data.f_probs_large_dist[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 768u) { ++ self->private_data.f_probs_lit[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ self->private_impl.f_stashed_state = 0u; ++ self->private_impl.f_stashed_rep0 = 0u; ++ self->private_impl.f_stashed_rep1 = 0u; ++ self->private_impl.f_stashed_rep2 = 0u; ++ self->private_impl.f_stashed_rep3 = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzip__error__bad_checksum[] = "#lzip: bad checksum"; ++const char wuffs_lzip__error__bad_footer[] = "#lzip: bad footer"; ++const char wuffs_lzip__error__bad_header[] = "#lzip: bad header"; ++const char wuffs_lzip__error__truncated_input[] = "#lzip: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzip__decoder__do_transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzip__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzip__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzip__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzip__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzip__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzip__decoder__initialize( ++ wuffs_lzip__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_lzma__decoder__initialize( ++ &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzip__decoder* ++wuffs_lzip__decoder__alloc(void) { ++ wuffs_lzip__decoder* x = ++ (wuffs_lzip__decoder*)(calloc(1, sizeof(wuffs_lzip__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzip__decoder__initialize( ++ x, sizeof(wuffs_lzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzip__decoder(void) { ++ return sizeof(wuffs_lzip__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzip.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzip__decoder__get_quirk( ++ const wuffs_lzip__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func lzip.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzip__decoder__set_quirk( ++ wuffs_lzip__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzip.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzip__decoder__dst_history_retain_length( ++ const wuffs_lzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma); ++} ++ ++// -------- func lzip.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzip__decoder__workbuf_len( ++ const wuffs_lzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma); ++} ++ ++// -------- func lzip.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzip__decoder__transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_lzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzip.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzip__decoder__do_transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint64_t v_c64 = 0; ++ uint64_t v_dmark = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_want = 0; ++ uint32_t v_checksum_have = 0; ++ uint64_t v_size_want = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 5)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u40le__no_bounds_check(iop_a_src))); ++ iop_a_src += 5; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 32) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c64 = t_0; ++ } ++ if (v_c64 != 5641951820u) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001793u, (1u | (((uint64_t)(v_c8)) << 8u))); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ if (v_status.repr == wuffs_base__error__bad_argument) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_header); ++ goto exit; ++ } ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_ssize_have = 0u; ++ self->private_impl.f_dsize_have = 0u; ++ wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001792u, 1u); ++ while (true) { ++ v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_2; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ self->private_impl.f_ssize_have += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_dsize_have += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_checksum_want = t_3; ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_checksum); ++ goto exit; ++ } ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint64_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_4 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 56) { ++ t_4 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_size_want = t_4; ++ } ++ if (self->private_impl.f_dsize_have != v_size_want) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint64_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_5 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; ++ if (num_bits_5 == 56) { ++ t_5 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)) << 56; ++ } ++ } ++ v_size_want = t_5; ++ } ++ if ((v_size_want < 26u) || (2251799813685248u < v_size_want)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } else if (self->private_impl.f_ssize_have != (v_size_want - 26u)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } ++ while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ goto label__outer__break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (v_c32 != 1346984524u) { ++ break; ++ } ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma, ++ sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ label__outer__break:; ++ ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzw__error__bad_code[] = "#lzw: bad code"; ++const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input"; ++const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_LZW__QUIRKS_BASE 1348378624u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzw__decoder__read_from( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzw__decoder__write_to( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzw__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzw__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzw__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzw__decoder__initialize( ++ wuffs_lzw__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzw__decoder* ++wuffs_lzw__decoder__alloc(void) { ++ wuffs_lzw__decoder* x = ++ (wuffs_lzw__decoder*)(calloc(1, sizeof(wuffs_lzw__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzw__decoder__initialize( ++ x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzw__decoder(void) { ++ return sizeof(wuffs_lzw__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzw.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzw__decoder__get_quirk( ++ const wuffs_lzw__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 1348378624u) { ++ return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one)); ++ } ++ return 0u; ++} ++ ++// -------- func lzw.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__set_quirk( ++ wuffs_lzw__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1348378624u) { ++ if (a_value > 9u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value)); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzw.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzw__decoder__dst_history_retain_length( ++ const wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func lzw.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzw__decoder__workbuf_len( ++ const wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++// -------- func lzw.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__transform_io( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_i = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_literal_width = 8u; ++ if (self->private_impl.f_pending_literal_width_plus_one > 0u) { ++ self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u); ++ } ++ self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width); ++ self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u); ++ self->private_impl.f_save_code = self->private_impl.f_end_code; ++ self->private_impl.f_prev_code = self->private_impl.f_end_code; ++ self->private_impl.f_width = (self->private_impl.f_literal_width + 1u); ++ self->private_impl.f_bits = 0u; ++ self->private_impl.f_n_bits = 0u; ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_clear_code) { ++ self->private_data.f_lm1s[v_i] = 0u; ++ self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i)); ++ v_i += 1u; ++ } ++ while (true) { ++ wuffs_lzw__decoder__read_from(self, a_src); ++ if (self->private_impl.f_output_wi > 0u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_lzw__decoder__write_to(self, a_dst); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ if (self->private_impl.f_read_from_return_value == 0u) { ++ break; ++ } else if (self->private_impl.f_read_from_return_value == 1u) { ++ continue; ++ } else if (self->private_impl.f_read_from_return_value == 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } else if (self->private_impl.f_read_from_return_value == 3u) { ++ status = wuffs_base__make_status(wuffs_lzw__error__truncated_input); ++ goto exit; ++ } else if (self->private_impl.f_read_from_return_value == 4u) { ++ status = wuffs_base__make_status(wuffs_lzw__error__bad_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzw.decoder.read_from ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzw__decoder__read_from( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint32_t v_clear_code = 0; ++ uint32_t v_end_code = 0; ++ uint32_t v_save_code = 0; ++ uint32_t v_prev_code = 0; ++ uint32_t v_width = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_output_wi = 0; ++ uint32_t v_code = 0; ++ uint32_t v_c = 0; ++ uint32_t v_o = 0; ++ uint32_t v_steps = 0; ++ uint8_t v_first_byte = 0; ++ uint16_t v_lm1_b = 0; ++ uint16_t v_lm1_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_clear_code = self->private_impl.f_clear_code; ++ v_end_code = self->private_impl.f_end_code; ++ v_save_code = self->private_impl.f_save_code; ++ v_prev_code = self->private_impl.f_prev_code; ++ v_width = self->private_impl.f_width; ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_output_wi = self->private_impl.f_output_wi; ++ while (true) { ++ if (v_n_bits < v_width) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits >= v_width) { ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits < v_width) { ++ self->private_impl.f_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ } ++ v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width)); ++ v_bits >>= v_width; ++ v_n_bits -= v_width; ++ if (v_code < v_clear_code) { ++ self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code)); ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (v_save_code <= 4095u) { ++ v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lm1s[v_save_code] = v_lm1_a; ++ if (((uint16_t)(v_lm1_a % 8u)) != 0u) { ++ self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); ++ self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code)); ++ } else { ++ self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; ++ } ++ } else if (v_code <= v_end_code) { ++ if (v_code == v_end_code) { ++ self->private_impl.f_read_from_return_value = 0u; ++ break; ++ } ++ v_save_code = v_end_code; ++ v_prev_code = v_end_code; ++ v_width = (self->private_impl.f_literal_width + 1u); ++ } else if (v_code <= v_save_code) { ++ v_c = v_code; ++ if (v_code == v_save_code) { ++ v_c = v_prev_code; ++ } ++ v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u); ++ v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u); ++ v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u); ++ while (true) { ++ memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u); ++ if (v_steps <= 0u) { ++ break; ++ } ++ v_steps -= 1u; ++ v_o = (((uint32_t)(v_o - 8u)) & 8191u); ++ v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c])); ++ } ++ v_first_byte = self->private_data.f_suffixes[v_c][0u]; ++ if (v_code == v_save_code) { ++ self->private_data.f_output[v_output_wi] = v_first_byte; ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ } ++ if (v_save_code <= 4095u) { ++ v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lm1s[v_save_code] = v_lm1_b; ++ if (((uint16_t)(v_lm1_b % 8u)) != 0u) { ++ self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); ++ self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte; ++ } else { ++ self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; ++ } ++ } else { ++ self->private_impl.f_read_from_return_value = 4u; ++ break; ++ } ++ if (v_output_wi > 4095u) { ++ self->private_impl.f_read_from_return_value = 1u; ++ break; ++ } ++ } ++ if (self->private_impl.f_read_from_return_value != 2u) { ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ self->private_impl.f_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ self->private_impl.f_save_code = v_save_code; ++ self->private_impl.f_prev_code = v_prev_code; ++ self->private_impl.f_width = v_width; ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; ++ self->private_impl.f_output_wi = v_output_wi; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func lzw.decoder.write_to ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzw__decoder__write_to( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_write_to; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (self->private_impl.f_output_wi > 0u) { ++ if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) { ++ status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, ++ self->private_impl.f_output_ri, ++ self->private_impl.f_output_wi); ++ v_n = wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); ++ if (v_n == ((uint64_t)(v_s.len))) { ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u); ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_write_to = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_write_to = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzw.decoder.flush ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 ++wuffs_lzw__decoder__flush( ++ wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__empty_slice_u8(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__empty_slice_u8(); ++ } ++ ++ uint32_t v_ri = 0; ++ uint32_t v_wi = 0; ++ ++ v_ri = self->private_impl.f_output_ri; ++ v_wi = self->private_impl.f_output_wi; ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ if (v_ri <= v_wi) { ++ return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi); ++ } ++ return wuffs_base__make_slice_u8(self->private_data.f_output, 0); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header"; ++const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input"; ++const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file"; ++const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__swizzle( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_netpbm__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_netpbm__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_netpbm__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_netpbm__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_netpbm__decoder__initialize( ++ wuffs_netpbm__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_netpbm__decoder* ++wuffs_netpbm__decoder__alloc(void) { ++ wuffs_netpbm__decoder* x = ++ (wuffs_netpbm__decoder*)(calloc(1, sizeof(wuffs_netpbm__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_netpbm__decoder__initialize( ++ x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_netpbm__decoder(void) { ++ return sizeof(wuffs_netpbm__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func netpbm.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__get_quirk( ++ const wuffs_netpbm__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__set_quirk( ++ wuffs_netpbm__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func netpbm.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 80u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if ((v_c8 < 49u) || (55u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } else if (v_c8 == 53u) { ++ self->private_impl.f_pixfmt = 536870920u; ++ } else if (v_c8 == 54u) { ++ self->private_impl.f_pixfmt = 2684356744u; ++ } else { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 10u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_width = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_width) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_width = v_n; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_height = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) { ++ continue; ++ } else if (v_c8 == 10u) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_height) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_height = v_n; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_max_value = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_11 = *iop_a_src++; ++ v_c8 = t_11; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) { ++ continue; ++ } else if (v_c8 == 10u) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_max_value = v_n; ++ } ++ if (self->private_impl.f_max_value != 255u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ false); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ false, ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_status = wuffs_netpbm__decoder__swizzle(self, a_dst, a_src); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func netpbm.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__swizzle( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_src_bytes_per_pixel = 1u; ++ if (self->private_impl.f_pixfmt == 2684356744u) { ++ v_src_bytes_per_pixel = 3u; ++ } ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; ++ } ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_netpbm__decoder__frame_dirty_rect( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func netpbm.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_netpbm__decoder__num_animation_loops( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__num_decoded_frame_configs( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__num_decoded_frames( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__restart_frame( ++ wuffs_netpbm__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func netpbm.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_netpbm__decoder__set_report_metadata( ++ wuffs_netpbm__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func netpbm.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__tell_me_more( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_netpbm__decoder__workbuf_len( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_nie__error__bad_header[] = "#nie: bad header"; ++const char wuffs_nie__error__truncated_input[] = "#nie: truncated input"; ++const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file"; ++const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__swizzle( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_nie__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_nie__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_nie__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_nie__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_nie__decoder__initialize( ++ wuffs_nie__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_nie__decoder* ++wuffs_nie__decoder__alloc(void) { ++ wuffs_nie__decoder* x = ++ (wuffs_nie__decoder*)(calloc(1, sizeof(wuffs_nie__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_nie__decoder__initialize( ++ x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_nie__decoder(void) { ++ return sizeof(wuffs_nie__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func nie.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__get_quirk( ++ const wuffs_nie__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func nie.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__set_quirk( ++ wuffs_nie__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func nie.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_a = t_0; ++ } ++ if (v_a != 1169146734u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_a = t_1; ++ } ++ if (v_a == 879649535u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } else if (v_a == 946758399u) { ++ self->private_impl.f_pixfmt = 2164308923u; ++ } else if (v_a == 879780607u) { ++ status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); ++ goto exit; ++ } else if (v_a == 946889471u) { ++ status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_a = t_2; ++ } ++ if (v_a > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } else if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_a = t_3; ++ } ++ if (v_a > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } else if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ 16u, ++ false); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ 16u, ++ 0u, ++ false, ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func nie.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__swizzle( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_src_bytes_per_pixel = 4u; ++ if (self->private_impl.f_pixfmt == 2164308923u) { ++ v_src_bytes_per_pixel = 8u; ++ } ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; ++ } ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_nie__decoder__frame_dirty_rect( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func nie.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_nie__decoder__num_animation_loops( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func nie.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frame_configs( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func nie.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frames( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func nie.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__restart_frame( ++ wuffs_nie__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != 16u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func nie.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_nie__decoder__set_report_metadata( ++ wuffs_nie__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func nie.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__tell_me_more( ++ wuffs_nie__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_nie__decoder__workbuf_len( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required"; ++const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum"; ++const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method"; ++const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size"; ++const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check"; ++const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary"; ++const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_ZLIB__QUIRKS_BASE 2113790976u ++ ++#define WUFFS_ZLIB__QUIRKS_COUNT 1u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_zlib__decoder__do_transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_zlib__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_zlib__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_zlib__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_zlib__decoder__initialize( ++ wuffs_zlib__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_adler32__hasher__initialize( ++ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_adler32__hasher__initialize( ++ &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_deflate__decoder__initialize( ++ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_zlib__decoder* ++wuffs_zlib__decoder__alloc(void) { ++ wuffs_zlib__decoder* x = ++ (wuffs_zlib__decoder*)(calloc(1, sizeof(wuffs_zlib__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_zlib__decoder__initialize( ++ x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_zlib__decoder(void) { ++ return sizeof(wuffs_zlib__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func zlib.decoder.dictionary_id ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_zlib__decoder__dictionary_id( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return self->private_impl.f_dict_id_want; ++} ++ ++// -------- func zlib.decoder.add_dictionary ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_zlib__decoder__add_dictionary( ++ wuffs_zlib__decoder* self, ++ wuffs_base__slice_u8 a_dict) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if (self->private_impl.f_header_complete) { ++ self->private_impl.f_bad_call_sequence = true; ++ } else { ++ self->private_impl.f_dict_id_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict); ++ wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict); ++ } ++ self->private_impl.f_got_dictionary = true; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func zlib.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_zlib__decoder__get_quirk( ++ const wuffs_zlib__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_key = 0; ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } else if (a_key >= 2113790976u) { ++ v_key = (a_key - 2113790976u); ++ if (v_key < 1u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; ++} ++ ++// -------- func zlib.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__set_quirk( ++ wuffs_zlib__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_header_complete) { ++ self->private_impl.f_bad_call_sequence = true; ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key >= 2113790976u) { ++ a_key -= 2113790976u; ++ if (a_key < 1u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func zlib.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_zlib__decoder__dst_history_retain_length( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func zlib.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_zlib__decoder__workbuf_len( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func zlib.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_zlib__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func zlib.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_zlib__decoder__do_transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint16_t v_x = 0; ++ uint32_t v_checksum_have = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_want = 0; ++ uint64_t v_mark = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_bad_call_sequence) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_quirks[0u]) { ++ } else if ( ! self->private_impl.f_want_dictionary) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint16_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_number_length = wuffs_json__decoder__decode_number(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- v_number_status = (v_number_length >> 8u); +- v_vminor = 10486787u; +- if ((v_number_length & 128u) != 0u) { +- v_vminor = 10486785u; ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_number_length = (v_number_length & 127u); +- if (v_number_status == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint16_t)(*scratch >> 48)); + break; + } +- while (v_number_length > 0u) { +- v_number_length -= 1u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_x = t_0; ++ } ++ if (((uint16_t)(((uint16_t)(v_x >> 8u)) & 15u)) != 8u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method); ++ goto exit; ++ } ++ if (((uint16_t)(v_x >> 12u)) > 7u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size); ++ goto exit; ++ } ++ if (((uint16_t)(v_x % 31u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check); ++ goto exit; ++ } ++ self->private_impl.f_want_dictionary = (((uint16_t)(v_x & 32u)) != 0u); ++ if (self->private_impl.f_want_dictionary) { ++ self->private_impl.f_dict_id_have = 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- if (v_number_status == 1u) { +- if (self->private_impl.f_quirks[14u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); + break; + } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } else if (v_number_status == 2u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18); +- } +- } +- } +- break; +- } else if (v_class == 5u) { +- v_vminor = 2113553u; +- if (v_depth == 0u) { +- } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { +- v_vminor = 2113601u; +- } else { +- v_vminor = 2113569u; +- } +- if (v_depth >= 1024u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); +- goto exit; +- } +- v_stack_byte = (v_depth / 32u); +- v_stack_bit = (v_depth & 31u); +- self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit); +- v_depth += 1u; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4162u; +- v_expect_after_value = 4164u; +- goto label__outer__continue; +- } else if (v_class == 6u) { +- iop_a_src += 1u; +- if (v_depth <= 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__break; +- } +- v_depth -= 1u; +- v_stack_byte = ((v_depth - 1u) / 32u); +- v_stack_bit = ((v_depth - 1u) & 31u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4356u; +- v_expect_after_value = 4356u; +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4164u; +- v_expect_after_value = 4164u; +- } +- goto label__outer__continue; +- } else if (v_class == 7u) { +- v_vminor = 2105361u; +- if (v_depth == 0u) { +- } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { +- v_vminor = 2105409u; +- } else { +- v_vminor = 2105377u; +- } +- if (v_depth >= 1024u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); +- goto exit; +- } +- v_stack_byte = (v_depth / 32u); +- v_stack_bit = (v_depth & 31u); +- self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit)); +- v_depth += 1u; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 8114u; +- v_expect_after_value = 4356u; +- goto label__outer__continue; +- } else if (v_class == 8u) { +- iop_a_src += 1u; +- if (v_depth <= 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__break; +- } +- v_depth -= 1u; +- v_stack_byte = ((v_depth - 1u) / 32u); +- v_stack_bit = ((v_depth - 1u) & 31u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4356u; +- v_expect_after_value = 4356u; +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4164u; +- v_expect_after_value = 4164u; +- } +- goto label__outer__continue; +- } else if (v_class == 9u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 5u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19); +- goto label__outer__continue; +- } +- } else if (v_class == 10u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 4u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20); +- goto label__outer__continue; +- } +- } else if (v_class == 11u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 4u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); +- goto label__outer__continue; +- } +- if (self->private_impl.f_quirks[14u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- break; +- } +- } else if (v_class == 12u) { +- if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); +- status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_comment_type > 0u) { +- goto label__outer__continue; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } + } ++ self->private_impl.f_dict_id_want = t_1; + } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); ++ goto ok; ++ } else if (self->private_impl.f_got_dictionary) { ++ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); + goto exit; + } +- if (v_depth == 0u) { +- break; ++ } else if (self->private_impl.f_dict_id_have != self->private_impl.f_dict_id_want) { ++ if (self->private_impl.f_got_dictionary) { ++ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); ++ goto exit; + } +- v_expect = v_expect_after_value; ++ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); ++ goto ok; + } +- label__outer__break:; +- if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ self->private_impl.f_header_complete = true; ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); ++ v_status = t_2; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0u]) { ++ v_checksum_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); +- status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; + } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ if ( ! self->private_impl.f_quirks[0u]) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_checksum_want = t_3; + } +- if (status.repr) { +- goto suspend; ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum); ++ goto exit; + } + } +- self->private_impl.f_end_of_data = true; + +- ok: +- self->private_impl.p_decode_tokens[0] = 0; +- goto exit; +- } ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number"; ++const char wuffs_png__error__bad_checksum[] = "#png: bad checksum"; ++const char wuffs_png__error__bad_chunk[] = "#png: bad chunk"; ++const char wuffs_png__error__bad_filter[] = "#png: bad filter"; ++const char wuffs_png__error__bad_header[] = "#png: bad header"; ++const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; ++const char wuffs_png__error__missing_palette[] = "#png: missing palette"; ++const char wuffs_png__error__truncated_input[] = "#png: truncated input"; ++const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; ++const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; ++const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; ++const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; ++const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type"; ++const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length"; ++const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_PNG__ANCILLARY_BIT 32u ++ ++static const uint8_t ++WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 0u, 0u, 0u, 0u, 0u, ++ }, { ++ 3u, 7u, 0u, 3u, 7u, 0u, ++ }, { ++ 3u, 3u, 4u, 3u, 7u, 0u, ++ }, { ++ 2u, 3u, 0u, 3u, 3u, 4u, ++ }, { ++ 2u, 1u, 2u, 2u, 3u, 0u, ++ }, { ++ 1u, 1u, 0u, 2u, 1u, 2u, ++ }, { ++ 1u, 0u, 1u, 1u, 1u, 0u, ++ }, { ++ 0u, 0u, 0u, 1u, 0u, 1u, ++ }, ++}; ++ ++static const uint8_t ++WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 255u, 85u, 0u, 17u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 8u, 4u, 0u, 2u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 0u, 3u, 1u, 2u, 0u, 4u, 0u, ++}; ++ ++static const uint16_t ++WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, ++ 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, ++ 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u, ++ 80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u, ++ 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u, ++ 112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 41410u, 41666u, 41922u, 42178u, 42434u, 42690u, 42946u, ++ 43202u, 43458u, 43714u, 43970u, 44226u, 44482u, 44738u, 44994u, ++ 45250u, 45506u, 45762u, 46018u, 46274u, 46530u, 46786u, 47042u, ++ 47298u, 47554u, 47810u, 48066u, 48322u, 48578u, 48834u, 49090u, ++ 32963u, 33219u, 33475u, 33731u, 33987u, 34243u, 34499u, 34755u, ++ 35011u, 35267u, 35523u, 35779u, 36035u, 36291u, 36547u, 36803u, ++ 37059u, 37315u, 37571u, 37827u, 38083u, 38339u, 38595u, 38851u, ++ 39107u, 39363u, 39619u, 39875u, 40131u, 40387u, 40643u, 40899u, ++ 41155u, 41411u, 41667u, 41923u, 42179u, 42435u, 42691u, 42947u, ++ 43203u, 43459u, 43715u, 43971u, 44227u, 44483u, 44739u, 44995u, ++ 45251u, 45507u, 45763u, 46019u, 46275u, 46531u, 46787u, 47043u, ++ 47299u, 47555u, 47811u, 48067u, 48323u, 48579u, 48835u, 49091u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_2( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- self->private_data.s_decode_tokens[0].v_depth = v_depth; +- self->private_data.s_decode_tokens[0].v_expect = v_expect; +- self->private_data.s_decode_tokens[0].v_expect_after_value = v_expect_after_value; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +-// -------- func json.decoder.decode_number ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_number( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint8_t v_c = 0; +- uint32_t v_n = 0; +- uint32_t v_floating_point = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- do { +- v_n = 0u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c != 45u) { +- } else { +- v_n += 1u; +- iop_a_src += 1u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- v_n |= 256u; +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- } +- if (v_c == 48u) { +- v_n += 1u; +- iop_a_src += 1u; +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (v_n > 99u) { +- break; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c != 46u) { +- } else { +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- v_floating_point = 128u; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (v_n > 99u) { +- break; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- } +- if ((v_c != 69u) && (v_c != 101u)) { +- break; +- } +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- v_floating_point = 128u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- v_n |= 256u; +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_c != 43u) && (v_c != 45u)) { +- } else { +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } while (0); +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- return (v_n | v_floating_point); +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +-// -------- func json.decoder.decode_digits ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_digits( +- wuffs_json__decoder* self, ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_image_config( ++ wuffs_png__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_ihdr( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__assign_filter_distance( ++ wuffs_png__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint64_t ++wuffs_png__decoder__calculate_bytes_per_row( ++ const wuffs_png__decoder* self, ++ uint32_t a_width); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__choose_filter_implementations( ++ wuffs_png__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_other_chunk( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, +- uint32_t a_n) { +- uint8_t v_c = 0; +- uint32_t v_n = 0; ++ bool a_framy); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_actl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_chrm( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_exif( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_fctl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_gama( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_iccp( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_plte( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_srgb( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_trns( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__skip_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_pass( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_tell_me_more( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle_tricky( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_png__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_png__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_png__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_png__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_png__decoder__initialize( ++ wuffs_png__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- v_n = a_n; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c]) { +- break; ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- if (v_n >= 99u) { +- v_n |= 512u; +- break; ++ } ++ ++ self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default; ++ self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default; ++ self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default; ++ self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default; ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; + } +- v_n += 1u; +- iop_a_src += 1u; + } +- if (v_n == a_n) { +- v_n |= 256u; ++ { ++ wuffs_base__status z = wuffs_zlib__decoder__initialize( ++ &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } + } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_png__decoder* ++wuffs_png__decoder__alloc(void) { ++ wuffs_png__decoder* x = ++ (wuffs_png__decoder*)(calloc(1, sizeof(wuffs_png__decoder))); ++ if (!x) { ++ return NULL; + } +- return v_n; ++ if (wuffs_png__decoder__initialize( ++ x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_png__decoder(void) { ++ return sizeof(wuffs_png__decoder); + } + +-// -------- func json.decoder.decode_leading ++// ---------------- Function Implementations + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_leading( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_1_distance_4_arm_neon + +- uint8_t v_c = 0; +- uint32_t v_u = 0; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fx = {0}; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- uint32_t coro_susp_point = self->private_impl.p_decode_leading[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_3_distance_4_arm_neon + +- self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u]; +- self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u]; +- while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fx = {0}; ++ ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_c == 30u) && self->private_impl.f_allow_leading_ars) { +- self->private_impl.f_allow_leading_ars = false; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- continue; +- } else if ((v_c == 239u) && self->private_impl.f_allow_leading_ubom) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- if (a_src && a_src->meta.closed) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- continue; +- } +- v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if (v_u == 12565487u) { +- self->private_impl.f_allow_leading_ubom = false; +- iop_a_src += 3u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- continue; +- } ++ v_curr.len = 0; ++ } ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +- break; ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- ok: +- self->private_impl.p_decode_leading[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_leading[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +-// -------- func json.decoder.decode_comment ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_4_distance_3_arm_neon + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_comment( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint16_t v_c2 = 0; +- uint32_t v_length = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fc = {0}; ++ uint8x8_t v_fx = {0}; ++ uint16x8_t v_fafb = {0}; ++ uint16x8_t v_fcfc = {0}; ++ uint16x8_t v_pa = {0}; ++ uint16x8_t v_pb = {0}; ++ uint16x8_t v_pc = {0}; ++ uint16x8_t v_cmpab = {0}; ++ uint16x8_t v_cmpac = {0}; ++ uint8x8_t v_picka = {0}; ++ uint8x8_t v_pickb = {0}; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end2_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- uint32_t coro_susp_point = self->private_impl.p_decode_comment[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_4_distance_4_arm_neon + +- self->private_impl.f_comment_type = 0u; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- if ((v_c2 == 10799u) && self->private_impl.f_quirks[11u]) { +- iop_a_src += 2u; +- v_length = 2u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { +- if (v_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } +- v_length = 0u; +- continue; +- } +- v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- if (v_c2 == 12074u) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 1u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if (v_length >= 65533u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- } +- v_length = 0u; +- continue; +- } +- v_length += 1u; +- } +- } else if ((v_c2 == 12079u) && self->private_impl.f_quirks[12u]) { +- iop_a_src += 2u; +- v_length = 2u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 2u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if (v_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- } +- v_length = 0u; +- continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c == 10u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 2u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if (v_length >= 65533u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- } +- v_length = 0u; +- continue; +- } +- v_length += 1u; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fc = {0}; ++ uint8x8_t v_fx = {0}; ++ uint16x8_t v_fafb = {0}; ++ uint16x8_t v_fcfc = {0}; ++ uint16x8_t v_pa = {0}; ++ uint16x8_t v_pb = {0}; ++ uint16x8_t v_pc = {0}; ++ uint16x8_t v_cmpab = {0}; ++ uint16x8_t v_cmpac = {0}; ++ uint8x8_t v_picka = {0}; ++ uint8x8_t v_pickb = {0}; ++ ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +- +- ok: +- self->private_impl.p_decode_comment[0] = 0; +- goto exit; ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- goto suspend; +- suspend: +- self->private_impl.p_decode_comment[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// -------- func png.decoder.filter_1 + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ return (*self->private_impl.choosy_filter_1)(self, a_curr); ++} + +- return status; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ uint64_t v_filter_distance = 0; ++ uint8_t v_fa = 0; ++ uint64_t v_i_start = 0; ++ uint64_t v_i = 0; ++ ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ v_i_start = 0u; ++ while (v_i_start < v_filter_distance) { ++ v_fa = 0u; ++ v_i = v_i_start; ++ while (v_i < ((uint64_t)(a_curr.len))) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa)); ++ v_fa = a_curr.ptr[v_i]; ++ v_i += v_filter_distance; ++ } ++ v_i_start += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_inf_nan ++// -------- func png.decoder.filter_1_distance_3_fallback + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_inf_nan( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_c4 = 0; +- uint32_t v_neg = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } ++ v_curr.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ } ++ v_curr.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// -------- func png.decoder.filter_1_distance_4_fallback + +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- v_c4 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if ((v_c4 | 2105376u) == 6712937u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) { +- if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 8u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- } else if ( ! (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- continue; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 3u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 | 2105376u) == 7233902u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 3u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 & 255u) == 43u) { +- v_neg = 0u; +- } else if ((v_c4 & 255u) == 45u) { +- v_neg = 1u; +- } else { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_c4 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u); +- if ((v_c4 | 2105376u) == 6712937u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) { +- if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 9u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- } else if ( ! (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- continue; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 4u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 | 2105376u) == 7233902u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 4u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ uint8_t v_fa3 = 0; + +- ok: +- self->private_impl.p_decode_inf_nan[0] = 0; +- goto exit; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_inf_nan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// -------- func png.decoder.filter_2 + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_2( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; + +- return status; ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while (v_i < v_n) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_trailer ++// -------- func png.decoder.filter_3 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_trailer( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev); ++} + +- uint8_t v_c = 0; +- uint32_t v_whitespace_length = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_filter_distance = 0; ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ v_i = v_filter_distance; ++ while (v_i < ((uint64_t)(a_curr.len))) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_curr.ptr[(v_i - v_filter_distance)] / 2u)))); ++ v_i += 1u; ++ } ++ } else { ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while ((v_i < v_n) && (v_i < v_filter_distance)) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_prev.ptr[v_i] / 2u)))); ++ v_i += 1u; ++ } ++ v_i = v_filter_distance; ++ while (v_i < v_n) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2u))))); ++ v_i += 1u; + } + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_trailer[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// -------- func png.decoder.filter_3_distance_3_fallback + +- if (self->private_impl.f_quirks[18u]) { +- self->private_impl.f_trailer_stop = 10u; +- } else { +- self->private_impl.f_trailer_stop = 0u; +- } +- label__outer__continue:; +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } +- v_whitespace_length = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (a_src && a_src->meta.closed) { +- goto label__outer__break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- goto label__outer__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (WUFFS_JSON__LUT_CLASSES[v_c] != 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (self->private_impl.f_trailer_stop > 0u) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_comment_type > 0u) { +- goto label__outer__continue; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if ((v_whitespace_length >= 65534u) || (v_c == self->private_impl.f_trailer_stop)) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c == self->private_impl.f_trailer_stop) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- goto label__outer__continue; +- } +- v_whitespace_length += 1u; ++ v_curr.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } ++ v_curr.len = 0; ++ } ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- label__outer__break:; +- +- ok: +- self->private_impl.p_decode_trailer[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_trailer[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_lzw__error__bad_code[] = "#lzw: bad code"; +-const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input"; +-const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O"; +- +-// ---------------- Private Consts +- +-#define WUFFS_LZW__QUIRKS_BASE 1348378624 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes ++// -------- func png.decoder.filter_3_distance_4_fallback + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_lzw__decoder__read_from( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_lzw__decoder__write_to( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_lzw__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_lzw__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_lzw__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_lzw__decoder__initialize( +- wuffs_lzw__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++wuffs_png__decoder__filter_3_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ uint8_t v_fa3 = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(((uint8_t)(v_fa3 / 2u)) + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif + } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-wuffs_lzw__decoder* +-wuffs_lzw__decoder__alloc(void) { +- wuffs_lzw__decoder* x = +- (wuffs_lzw__decoder*)(calloc(sizeof(wuffs_lzw__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_lzw__decoder__initialize( +- x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} ++// -------- func png.decoder.filter_4 + +-size_t +-sizeof__wuffs_lzw__decoder(void) { +- return sizeof(wuffs_lzw__decoder); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev); + } + +-// ---------------- Function Implementations +- +-// -------- func lzw.decoder.get_quirk +- + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__get_quirk( +- const wuffs_lzw__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_filter_distance = 0; ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; ++ uint32_t v_fa = 0; ++ uint32_t v_fb = 0; ++ uint32_t v_fc = 0; ++ uint32_t v_pp = 0; ++ uint32_t v_pa = 0; ++ uint32_t v_pb = 0; ++ uint32_t v_pc = 0; + +- if (a_key == 1348378624u) { +- return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one)); ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while ((v_i < v_n) && (v_i < v_filter_distance)) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); ++ v_i += 1u; + } +- return 0u; ++ v_i = v_filter_distance; ++ while (v_i < v_n) { ++ v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])); ++ v_fb = ((uint32_t)(a_prev.ptr[v_i])); ++ v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)])); ++ v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc)); ++ v_pa = ((uint32_t)(v_pp - v_fa)); ++ if (v_pa >= 2147483648u) { ++ v_pa = ((uint32_t)(0u - v_pa)); ++ } ++ v_pb = ((uint32_t)(v_pp - v_fb)); ++ if (v_pb >= 2147483648u) { ++ v_pb = ((uint32_t)(0u - v_pb)); ++ } ++ v_pc = ((uint32_t)(v_pp - v_fc)); ++ if (v_pc >= 2147483648u) { ++ v_pc = ((uint32_t)(0u - v_pc)); ++ } ++ if ((v_pa <= v_pb) && (v_pa <= v_pc)) { ++ } else if (v_pb <= v_pc) { ++ v_fa = v_fb; ++ } else { ++ v_fa = v_fc; ++ } ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa)))); ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.set_quirk ++// -------- func png.decoder.filter_4_distance_3_fallback + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__set_quirk( +- wuffs_lzw__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint32_t v_fa0 = 0; ++ uint32_t v_fa1 = 0; ++ uint32_t v_fa2 = 0; ++ uint32_t v_fb0 = 0; ++ uint32_t v_fb1 = 0; ++ uint32_t v_fb2 = 0; ++ uint32_t v_fc0 = 0; ++ uint32_t v_fc1 = 0; ++ uint32_t v_fc2 = 0; ++ uint32_t v_pp0 = 0; ++ uint32_t v_pp1 = 0; ++ uint32_t v_pp2 = 0; ++ uint32_t v_pa0 = 0; ++ uint32_t v_pa1 = 0; ++ uint32_t v_pa2 = 0; ++ uint32_t v_pb0 = 0; ++ uint32_t v_pb1 = 0; ++ uint32_t v_pb2 = 0; ++ uint32_t v_pc0 = 0; ++ uint32_t v_pc1 = 0; ++ uint32_t v_pc2 = 0; + +- if (a_key == 1348378624u) { +- if (a_value > 9u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb0 = ((uint32_t)(v_prev.ptr[0u])); ++ v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); ++ v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); ++ if (v_pa0 >= 2147483648u) { ++ v_pa0 = ((uint32_t)(0u - v_pa0)); ++ } ++ v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); ++ if (v_pb0 >= 2147483648u) { ++ v_pb0 = ((uint32_t)(0u - v_pb0)); ++ } ++ v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); ++ if (v_pc0 >= 2147483648u) { ++ v_pc0 = ((uint32_t)(0u - v_pc0)); ++ } ++ if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { ++ } else if (v_pb0 <= v_pc0) { ++ v_fa0 = v_fb0; ++ } else { ++ v_fa0 = v_fc0; ++ } ++ v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); ++ v_fa0 = ((uint32_t)(v_curr.ptr[0u])); ++ v_fc0 = v_fb0; ++ v_fb1 = ((uint32_t)(v_prev.ptr[1u])); ++ v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); ++ v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); ++ if (v_pa1 >= 2147483648u) { ++ v_pa1 = ((uint32_t)(0u - v_pa1)); ++ } ++ v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); ++ if (v_pb1 >= 2147483648u) { ++ v_pb1 = ((uint32_t)(0u - v_pb1)); ++ } ++ v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); ++ if (v_pc1 >= 2147483648u) { ++ v_pc1 = ((uint32_t)(0u - v_pc1)); ++ } ++ if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { ++ } else if (v_pb1 <= v_pc1) { ++ v_fa1 = v_fb1; ++ } else { ++ v_fa1 = v_fc1; ++ } ++ v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); ++ v_fa1 = ((uint32_t)(v_curr.ptr[1u])); ++ v_fc1 = v_fb1; ++ v_fb2 = ((uint32_t)(v_prev.ptr[2u])); ++ v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); ++ v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); ++ if (v_pa2 >= 2147483648u) { ++ v_pa2 = ((uint32_t)(0u - v_pa2)); ++ } ++ v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); ++ if (v_pb2 >= 2147483648u) { ++ v_pb2 = ((uint32_t)(0u - v_pb2)); ++ } ++ v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); ++ if (v_pc2 >= 2147483648u) { ++ v_pc2 = ((uint32_t)(0u - v_pc2)); ++ } ++ if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { ++ } else if (v_pb2 <= v_pc2) { ++ v_fa2 = v_fb2; ++ } else { ++ v_fa2 = v_fc2; ++ } ++ v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); ++ v_fa2 = ((uint32_t)(v_curr.ptr[2u])); ++ v_fc2 = v_fb2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value)); +- return wuffs_base__make_status(NULL); ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.history_retain_length ++// -------- func png.decoder.filter_4_distance_4_fallback + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__history_retain_length( +- const wuffs_lzw__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func lzw.decoder.workbuf_len ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint32_t v_fa0 = 0; ++ uint32_t v_fa1 = 0; ++ uint32_t v_fa2 = 0; ++ uint32_t v_fa3 = 0; ++ uint32_t v_fb0 = 0; ++ uint32_t v_fb1 = 0; ++ uint32_t v_fb2 = 0; ++ uint32_t v_fb3 = 0; ++ uint32_t v_fc0 = 0; ++ uint32_t v_fc1 = 0; ++ uint32_t v_fc2 = 0; ++ uint32_t v_fc3 = 0; ++ uint32_t v_pp0 = 0; ++ uint32_t v_pp1 = 0; ++ uint32_t v_pp2 = 0; ++ uint32_t v_pp3 = 0; ++ uint32_t v_pa0 = 0; ++ uint32_t v_pa1 = 0; ++ uint32_t v_pa2 = 0; ++ uint32_t v_pa3 = 0; ++ uint32_t v_pb0 = 0; ++ uint32_t v_pb1 = 0; ++ uint32_t v_pb2 = 0; ++ uint32_t v_pb3 = 0; ++ uint32_t v_pc0 = 0; ++ uint32_t v_pc1 = 0; ++ uint32_t v_pc2 = 0; ++ uint32_t v_pc3 = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_lzw__decoder__workbuf_len( +- const wuffs_lzw__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb0 = ((uint32_t)(v_prev.ptr[0u])); ++ v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); ++ v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); ++ if (v_pa0 >= 2147483648u) { ++ v_pa0 = ((uint32_t)(0u - v_pa0)); ++ } ++ v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); ++ if (v_pb0 >= 2147483648u) { ++ v_pb0 = ((uint32_t)(0u - v_pb0)); ++ } ++ v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); ++ if (v_pc0 >= 2147483648u) { ++ v_pc0 = ((uint32_t)(0u - v_pc0)); ++ } ++ if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { ++ } else if (v_pb0 <= v_pc0) { ++ v_fa0 = v_fb0; ++ } else { ++ v_fa0 = v_fc0; ++ } ++ v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); ++ v_fa0 = ((uint32_t)(v_curr.ptr[0u])); ++ v_fc0 = v_fb0; ++ v_fb1 = ((uint32_t)(v_prev.ptr[1u])); ++ v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); ++ v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); ++ if (v_pa1 >= 2147483648u) { ++ v_pa1 = ((uint32_t)(0u - v_pa1)); ++ } ++ v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); ++ if (v_pb1 >= 2147483648u) { ++ v_pb1 = ((uint32_t)(0u - v_pb1)); ++ } ++ v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); ++ if (v_pc1 >= 2147483648u) { ++ v_pc1 = ((uint32_t)(0u - v_pc1)); ++ } ++ if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { ++ } else if (v_pb1 <= v_pc1) { ++ v_fa1 = v_fb1; ++ } else { ++ v_fa1 = v_fc1; ++ } ++ v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); ++ v_fa1 = ((uint32_t)(v_curr.ptr[1u])); ++ v_fc1 = v_fb1; ++ v_fb2 = ((uint32_t)(v_prev.ptr[2u])); ++ v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); ++ v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); ++ if (v_pa2 >= 2147483648u) { ++ v_pa2 = ((uint32_t)(0u - v_pa2)); ++ } ++ v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); ++ if (v_pb2 >= 2147483648u) { ++ v_pb2 = ((uint32_t)(0u - v_pb2)); ++ } ++ v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); ++ if (v_pc2 >= 2147483648u) { ++ v_pc2 = ((uint32_t)(0u - v_pc2)); ++ } ++ if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { ++ } else if (v_pb2 <= v_pc2) { ++ v_fa2 = v_fb2; ++ } else { ++ v_fa2 = v_fc2; ++ } ++ v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); ++ v_fa2 = ((uint32_t)(v_curr.ptr[2u])); ++ v_fc2 = v_fb2; ++ v_fb3 = ((uint32_t)(v_prev.ptr[3u])); ++ v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3)); ++ v_pa3 = ((uint32_t)(v_pp3 - v_fa3)); ++ if (v_pa3 >= 2147483648u) { ++ v_pa3 = ((uint32_t)(0u - v_pa3)); ++ } ++ v_pb3 = ((uint32_t)(v_pp3 - v_fb3)); ++ if (v_pb3 >= 2147483648u) { ++ v_pb3 = ((uint32_t)(0u - v_pb3)); ++ } ++ v_pc3 = ((uint32_t)(v_pp3 - v_fc3)); ++ if (v_pc3 >= 2147483648u) { ++ v_pc3 = ((uint32_t)(0u - v_pc3)); ++ } ++ if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) { ++ } else if (v_pb3 <= v_pc3) { ++ v_fa3 = v_fb3; ++ } else { ++ v_fa3 = v_fc3; ++ } ++ v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3)))); ++ v_fa3 = ((uint32_t)(v_curr.ptr[3u])); ++ v_fc3 = v_fb3; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.transform_io ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_1_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__transform_io( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; + +- self->private_impl.f_literal_width = 8u; +- if (self->private_impl.f_pending_literal_width_plus_one > 0u) { +- self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u); +- } +- self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width); +- self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u); +- self->private_impl.f_save_code = self->private_impl.f_end_code; +- self->private_impl.f_prev_code = self->private_impl.f_end_code; +- self->private_impl.f_width = (self->private_impl.f_literal_width + 1u); +- self->private_impl.f_bits = 0u; +- self->private_impl.f_n_bits = 0u; +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_clear_code) { +- self->private_data.f_lm1s[v_i] = 0u; +- self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i)); +- v_i += 1u; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- while (true) { +- wuffs_lzw__decoder__read_from(self, a_src); +- if (self->private_impl.f_output_wi > 0u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_lzw__decoder__write_to(self, a_dst); +- if (status.repr) { +- goto suspend; +- } +- } +- if (self->private_impl.f_read_from_return_value == 0u) { +- break; +- } else if (self->private_impl.f_read_from_return_value == 1u) { +- continue; +- } else if (self->private_impl.f_read_from_return_value == 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } else if (self->private_impl.f_read_from_return_value == 3u) { +- status = wuffs_base__make_status(wuffs_lzw__error__truncated_input); +- goto exit; +- } else if (self->private_impl.f_read_from_return_value == 4u) { +- status = wuffs_base__make_status(wuffs_lzw__error__bad_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); +- goto exit; +- } ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- +- ok: +- self->private_impl.p_transform_io[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ v_curr.len = 0; + } +- return status; ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// -------- func lzw.decoder.read_from ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_3_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_lzw__decoder__read_from( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_clear_code = 0; +- uint32_t v_end_code = 0; +- uint32_t v_save_code = 0; +- uint32_t v_prev_code = 0; +- uint32_t v_width = 0; +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_output_wi = 0; +- uint32_t v_code = 0; +- uint32_t v_c = 0; +- uint32_t v_o = 0; +- uint32_t v_steps = 0; +- uint8_t v_first_byte = 0; +- uint16_t v_lm1_b = 0; +- uint16_t v_lm1_a = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++wuffs_png__decoder__filter_3_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_k128 = {0}; + +- v_clear_code = self->private_impl.f_clear_code; +- v_end_code = self->private_impl.f_end_code; +- v_save_code = self->private_impl.f_save_code; +- v_prev_code = self->private_impl.f_prev_code; +- v_width = self->private_impl.f_width; +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_output_wi = self->private_impl.f_output_wi; +- while (true) { +- if (v_n_bits < v_width) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_read_from_return_value = 3u; +- } else { +- self->private_impl.f_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits >= v_width) { +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_read_from_return_value = 3u; +- } else { +- self->private_impl.f_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits < v_width) { +- self->private_impl.f_read_from_return_value = 5u; +- break; +- } +- } +- } +- } +- v_code = ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_width)); +- v_bits >>= v_width; +- v_n_bits -= v_width; +- if (v_code < v_clear_code) { +- self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code)); +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- if (v_save_code <= 4095u) { +- v_lm1_a = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lm1s[v_save_code] = v_lm1_a; +- if ((v_lm1_a % 8u) != 0u) { +- self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; +- memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); +- self->private_data.f_suffixes[v_save_code][(v_lm1_a % 8u)] = ((uint8_t)(v_code)); +- } else { +- self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else if (v_code <= v_end_code) { +- if (v_code == v_end_code) { +- self->private_impl.f_read_from_return_value = 0u; +- break; +- } +- v_save_code = v_end_code; +- v_prev_code = v_end_code; +- v_width = (self->private_impl.f_literal_width + 1u); +- } else if (v_code <= v_save_code) { +- v_c = v_code; +- if (v_code == v_save_code) { +- v_c = v_prev_code; +- } +- v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u); +- v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u); +- v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u); +- while (true) { +- memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u); +- if (v_steps <= 0u) { +- break; +- } +- v_steps -= 1u; +- v_o = (((uint32_t)(v_o - 8u)) & 8191u); +- v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c])); +- } +- v_first_byte = self->private_data.f_suffixes[v_c][0u]; +- if (v_code == v_save_code) { +- self->private_data.f_output[v_output_wi] = v_first_byte; +- v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ v_k128 = _mm_set1_epi8((int8_t)(254u)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- if (v_save_code <= 4095u) { +- v_lm1_b = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lm1s[v_save_code] = v_lm1_b; +- if ((v_lm1_b % 8u) != 0u) { +- self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; +- memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); +- self->private_data.f_suffixes[v_save_code][(v_lm1_b % 8u)] = v_first_byte; +- } else { +- self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- } else { +- self->private_impl.f_read_from_return_value = 4u; +- break; +- } +- if (v_output_wi > 4095u) { +- self->private_impl.f_read_from_return_value = 1u; +- break; ++ v_curr.len = 0; + } +- } +- if (self->private_impl.f_read_from_return_value != 2u) { +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- self->private_impl.f_read_from_return_value = 5u; +- break; ++ } else { ++ v_k128 = _mm_set1_epi8((int8_t)(1u)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } ++ v_curr.len = 0; ++ v_prev.len = 0; + } + } +- self->private_impl.f_save_code = v_save_code; +- self->private_impl.f_prev_code = v_prev_code; +- self->private_impl.f_width = v_width; +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- self->private_impl.f_output_wi = v_output_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- + return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// -------- func lzw.decoder.write_to ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_4_distance_3_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_lzw__decoder__write_to( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__slice_u8 v_s = {0}; +- uint64_t v_n = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_c128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_pa128 = {0}; ++ __m128i v_pb128 = {0}; ++ __m128i v_pc128 = {0}; ++ __m128i v_smallest128 = {0}; ++ __m128i v_z128 = {0}; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- } +- +- uint32_t coro_susp_point = self->private_impl.p_write_to[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (self->private_impl.f_output_wi > 0u) { +- if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) { +- status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, +- self->private_impl.f_output_ri, +- self->private_impl.f_output_wi); +- v_n = wuffs_base__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); +- if (v_n == ((uint64_t)(v_s.len))) { +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u); +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- +- ok: +- self->private_impl.p_write_to[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_write_to[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func lzw.decoder.flush +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +-wuffs_lzw__decoder__flush( +- wuffs_lzw__decoder* self) { +- if (!self) { +- return wuffs_base__make_slice_u8(NULL, 0); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_slice_u8(NULL, 0); +- } +- +- uint32_t v_ri = 0; +- uint32_t v_wi = 0; +- +- v_ri = self->private_impl.f_output_ri; +- v_wi = self->private_impl.f_output_wi; +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- if (v_ri <= v_wi) { +- return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end2_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- return wuffs_base__make_slice_u8(self->private_data.f_output, 0); ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header"; +-const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input"; +-const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file"; +-const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read"; +- +-// ---------------- Private Consts +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_4_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__swizzle( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_netpbm__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_netpbm__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_netpbm__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_netpbm__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_netpbm__decoder__initialize( +- wuffs_netpbm__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_c128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_pa128 = {0}; ++ __m128i v_pb128 = {0}; ++ __m128i v_pc128 = {0}; ++ __m128i v_smallest128 = {0}; ++ __m128i v_z128 = {0}; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_netpbm__decoder* +-wuffs_netpbm__decoder__alloc(void) { +- wuffs_netpbm__decoder* x = +- (wuffs_netpbm__decoder*)(calloc(sizeof(wuffs_netpbm__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_netpbm__decoder__initialize( +- x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_netpbm__decoder(void) { +- return sizeof(wuffs_netpbm__decoder); ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ---------------- Function Implementations +- +-// -------- func netpbm.decoder.get_quirk ++// -------- func png.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__get_quirk( +- const wuffs_netpbm__decoder* self, ++wuffs_png__decoder__get_quirk( ++ const wuffs_png__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -49804,15 +62628,18 @@ wuffs_netpbm__decoder__get_quirk( + return 0; + } + ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } + return 0u; + } + +-// -------- func netpbm.decoder.set_quirk ++// -------- func png.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__set_quirk( +- wuffs_netpbm__decoder* self, ++wuffs_png__decoder__set_quirk( ++ wuffs_png__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -49825,15 +62652,20 @@ wuffs_netpbm__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func netpbm.decoder.decode_image_config ++// -------- func png.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_image_config( +- wuffs_netpbm__decoder* self, ++wuffs_png__decoder__decode_image_config( ++ wuffs_png__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -49859,53 +62691,364 @@ wuffs_netpbm__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func png.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_image_config( ++ wuffs_png__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_magic = 0; ++ uint64_t v_mark = 0; ++ uint32_t v_checksum_have = 0; ++ uint32_t v_checksum_want = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_checksum_have = self->private_data.s_do_decode_image_config.v_checksum_have; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if ( ! self->private_impl.f_seen_ihdr) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 56) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_magic = t_0; ++ } ++ if (v_magic != 727905341920923785u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 56) { ++ t_1 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_magic = t_1; ++ } ++ if (v_magic != 5927942488114331648u) { ++ if (v_magic == 5278895250759221248u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 72u; ++ self->private_impl.f_chunk_type_array[2u] = 68u; ++ self->private_impl.f_chunk_type_array[3u] = 82u; ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_checksum_want = t_3; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_seen_ihdr = true; ++ } else if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } + while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ continue; ++ } ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) { ++ break; ++ } ++ self->private_impl.f_seen_idat = true; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ iop_a_src += 8u; ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { ++ self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u))); ++ self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u))); ++ self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u))); ++ self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u))); ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); ++ v_status = t_4; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } + { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_checksum_want = t_5; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } ++ if ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte) { ++ status = wuffs_base__make_status(wuffs_png__error__missing_palette); ++ goto exit; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_dst_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_first_config_io_position, ++ ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns)); ++ } ++ if ( ! self->private_impl.f_seen_actl) { ++ self->private_impl.f_num_animation_frames_value = 1u; ++ self->private_impl.f_first_rect_x0 = 0u; ++ self->private_impl.f_first_rect_y0 = 0u; ++ self->private_impl.f_first_rect_x1 = self->private_impl.f_width; ++ self->private_impl.f_first_rect_y1 = self->private_impl.f_height; ++ self->private_impl.f_first_duration = 0u; ++ self->private_impl.f_first_disposal = 0u; ++ self->private_impl.f_first_overwrite_instead_of_blend = false; ++ } ++ self->private_impl.f_call_sequence = 32u; + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_do_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_checksum_have = v_checksum_have; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func netpbm.decoder.do_decode_image_config ++// -------- func png.decoder.decode_ihdr + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_png__decoder__decode_ihdr( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_n = 0; ++ uint32_t v_a32 = 0; ++ uint8_t v_a8 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -49918,348 +63061,343 @@ wuffs_netpbm__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_ihdr; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_ihdr.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_a32 = t_0; ++ } ++ if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } else if (v_a32 > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); + goto exit; + } ++ self->private_impl.f_width = v_a32; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_ihdr.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ v_a32 = t_1; ++ } ++ if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } else if (v_a32 > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a32; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ uint8_t t_2 = *iop_a_src++; ++ v_a8 = t_2; + } +- if (v_c != 80u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ if (v_a8 > 16u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } ++ self->private_impl.f_depth = v_a8; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint8_t t_3 = *iop_a_src++; ++ v_a8 = t_3; + } +- if ((v_c < 49u) || (55u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } else if (v_c == 53u) { +- self->private_impl.f_pixfmt = 536870920u; +- } else if (v_c == 54u) { +- self->private_impl.f_pixfmt = 2684356744u; +- } else { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } ++ self->private_impl.f_color_type = v_a8; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint8_t t_4 = *iop_a_src++; ++ v_a8 = t_4; + } +- if (v_c != 10u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ if (v_a8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); + goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_width = ((uint32_t)((v_c - 48u))); +- break; ++ uint8_t t_5 = *iop_a_src++; ++ v_a8 = t_5; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_width) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; +- } +- self->private_impl.f_width = v_n; ++ if (v_a8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_7 = *iop_a_src++; +- v_c = t_7; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_height = ((uint32_t)((v_c - 48u))); +- break; ++ uint8_t t_6 = *iop_a_src++; ++ v_a8 = t_6; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_8 = *iop_a_src++; +- v_c = t_8; +- } +- if ((v_c == 32u) || (v_c == 9u) || (v_c == 13u)) { +- continue; +- } else if (v_c == 10u) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_height) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; +- } +- self->private_impl.f_height = v_n; ++ if (v_a8 == 0u) { ++ self->private_impl.f_interlace_pass = 0u; ++ } else if (v_a8 == 1u) { ++ self->private_impl.f_interlace_pass = 1u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_9 = *iop_a_src++; +- v_c = t_9; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_10 = *iop_a_src++; +- v_c = t_10; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- self->private_impl.f_max_value = ((uint32_t)((v_c - 48u))); +- break; ++ self->private_impl.f_filter_distance = 0u; ++ wuffs_png__decoder__assign_filter_distance(self); ++ if (self->private_impl.f_filter_distance == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_11 = *iop_a_src++; +- v_c = t_11; +- } +- if ((v_c == 32u) || (v_c == 9u) || (v_c == 13u)) { +- continue; +- } else if (v_c == 10u) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; ++ self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1u + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width))); ++ wuffs_png__decoder__choose_filter_implementations(self); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_ihdr = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_ihdr = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func png.decoder.assign_filter_distance ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__assign_filter_distance( ++ wuffs_png__decoder* self) { ++ if (self->private_impl.f_depth < 8u) { ++ if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) { ++ return wuffs_base__make_empty_struct(); ++ } else if (self->private_impl.f_color_type == 0u) { ++ self->private_impl.f_dst_pixfmt = 536870920u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ } else if (self->private_impl.f_color_type == 3u) { ++ self->private_impl.f_dst_pixfmt = 2198077448u; ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ return wuffs_base__make_empty_struct(); ++ } ++ self->private_impl.f_filter_distance = 1u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } else if (self->private_impl.f_color_type == 0u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 536870920u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ self->private_impl.f_filter_distance = 1u; ++ } else if (self->private_impl.f_depth == 16u) { ++ if (self->private_impl.f_interlace_pass == 0u) { ++ self->private_impl.f_dst_pixfmt = 536870923u; ++ self->private_impl.f_src_pixfmt = 537919499u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; + } +- self->private_impl.f_max_value = v_n; ++ self->private_impl.f_filter_distance = 2u; + } +- if (self->private_impl.f_max_value != 255u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; ++ } else if (self->private_impl.f_color_type == 2u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2147485832u; ++ self->private_impl.f_src_pixfmt = 2684356744u; ++ self->private_impl.f_filter_distance = 3u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 6u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); + } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- false); ++ } else if (self->private_impl.f_color_type == 3u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2198077448u; ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ self->private_impl.f_filter_distance = 1u; ++ } ++ } else if (self->private_impl.f_color_type == 4u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 553648264u; ++ self->private_impl.f_src_pixfmt = 553648264u; ++ self->private_impl.f_filter_distance = 2u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 4u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } ++ } else if (self->private_impl.f_color_type == 6u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2701166728u; ++ self->private_impl.f_filter_distance = 4u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 8u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); + } +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func netpbm.decoder.decode_frame_config ++// -------- func png.decoder.calculate_bytes_per_row + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++static uint64_t ++wuffs_png__decoder__calculate_bytes_per_row( ++ const wuffs_png__decoder* self, ++ uint32_t a_width) { ++ uint64_t v_bytes_per_channel = 0; + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ if (self->private_impl.f_depth == 1u) { ++ return ((uint64_t)(((a_width + 7u) / 8u))); ++ } else if (self->private_impl.f_depth == 2u) { ++ return ((uint64_t)(((a_width + 3u) / 4u))); ++ } else if (self->private_impl.f_depth == 4u) { ++ return ((uint64_t)(((a_width + 1u) / 2u))); + } ++ v_bytes_per_channel = ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u)))); ++ return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type]))); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++// -------- func png.decoder.choose_filter_implementations + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__choose_filter_implementations( ++ wuffs_png__decoder* self) { ++ if (self->private_impl.f_filter_distance == 3u) { ++ self->private_impl.choosy_filter_1 = ( ++ &wuffs_png__decoder__filter_1_distance_3_fallback); ++ self->private_impl.choosy_filter_3 = ( ++ &wuffs_png__decoder__filter_3_distance_3_fallback); ++ self->private_impl.choosy_filter_4 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_4_distance_3_fallback); ++ } else if (self->private_impl.f_filter_distance == 4u) { ++ self->private_impl.choosy_filter_1 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_1_distance_4_fallback); ++ self->private_impl.choosy_filter_3 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_3_distance_4_fallback); ++ self->private_impl.choosy_filter_4 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_4_distance_4_fallback); + } +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func netpbm.decoder.do_decode_frame_config ++// -------- func png.decoder.decode_other_chunk + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_png__decoder__decode_other_chunk( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ bool a_framy) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; +@@ -50273,62 +63411,218 @@ wuffs_netpbm__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if ((self->private_impl.f_chunk_type == 1163152464u) && ! a_framy) { ++ if (self->private_impl.f_seen_plte) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_color_type == 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__decode_plte(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) { ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_seen_plte = true; ++ } else if ((self->private_impl.f_chunk_type & 32u) == 0u) { ++ if (self->private_impl.f_chunk_type != 1413563465u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ } ++ if (self->private_impl.f_chunk_type == 1716082789u) { ++ if (self->private_impl.f_report_metadata_exif) { ++ if (self->private_impl.f_seen_exif) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_png__decoder__decode_exif(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_exif = true; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) { ++ if (self->private_impl.f_report_metadata_kvp) { ++ self->private_impl.f_metadata_flavor = 4u; ++ self->private_impl.f_metadata_fourcc = 1263947851u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ } ++ } else if ( ! a_framy) { ++ if (self->private_impl.f_chunk_type == 1280598881u) { ++ if (self->private_impl.f_seen_actl) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_png__decoder__decode_actl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_actl = true; ++ } else if (self->private_impl.f_chunk_type == 1297238115u) { ++ if (self->private_impl.f_report_metadata_chrm) { ++ if (self->private_impl.f_seen_chrm) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_png__decoder__decode_chrm(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_chrm = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ if (self->private_impl.f_seen_fctl) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ status = wuffs_png__decoder__decode_fctl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_fctl = true; ++ } else if (self->private_impl.f_chunk_type == 1095582055u) { ++ if (self->private_impl.f_report_metadata_gama) { ++ if (self->private_impl.f_seen_gama) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_png__decoder__decode_gama(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_gama = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1346585449u) { ++ if (self->private_impl.f_report_metadata_iccp) { ++ if (self->private_impl.f_seen_iccp) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_png__decoder__decode_iccp(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_iccp = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1111970419u) { ++ if (self->private_impl.f_report_metadata_srgb) { ++ if (self->private_impl.f_seen_srgb) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_png__decoder__decode_srgb(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_srgb = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1397641844u) { ++ if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_color_type > 3u) { ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_png__decoder__decode_trns(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_seen_trns = true; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- false, +- false, +- 0u); ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ self->private_data.s_decode_other_chunk.scratch = self->private_impl.f_chunk_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_decode_other_chunk.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_other_chunk.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_other_chunk.scratch; + } +- self->private_impl.f_call_sequence = 64u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_other_chunk = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_other_chunk = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -50339,181 +63633,130 @@ wuffs_netpbm__decoder__do_decode_frame_config( + return status; + } + +-// -------- func netpbm.decoder.decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func netpbm.decoder.do_decode_frame ++// -------- func png.decoder.decode_actl + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_png__decoder__decode_actl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_actl; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ if (self->private_impl.f_chunk_length != 8u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_interlace_pass > 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; + } +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y = 0u; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_actl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_actl.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- goto ok; ++ self->private_impl.f_num_animation_frames_value = t_0; + } +- while (true) { +- v_status = wuffs_netpbm__decoder__swizzle(self, a_dst, a_src); +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ if (self->private_impl.f_num_animation_frames_value == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_actl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_actl.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- goto ok; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ self->private_impl.f_num_animation_loops_value = t_1; + } +- self->private_impl.f_call_sequence = 96u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_actl = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_actl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ + return status; + } + +-// -------- func netpbm.decoder.swizzle ++// -------- func png.decoder.decode_chrm + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__swizzle( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_png__decoder__decode_chrm( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; ++ uint64_t v_u = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -50526,543 +63769,337 @@ wuffs_netpbm__decoder__swizzle( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += 1u; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ uint32_t coro_susp_point = self->private_impl.p_decode_chrm; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_chunk_length != 32u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_src_bytes_per_pixel = 1u; +- if (self->private_impl.f_pixfmt == 2684356744u) { +- v_src_bytes_per_pixel = 3u; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1128813133u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); + } +- v_j -= 8u; + } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); ++ v_u = t_0; ++ } ++ self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- v_j -= 1u; + } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- wuffs_base__pixel_buffer__palette(a_dst), +- &iop_a_src, +- io2_a_src); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read); +- goto ok; ++ v_u = t_1; + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func netpbm.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_netpbm__decoder__frame_dirty_rect( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func netpbm.decoder.num_animation_loops +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_netpbm__decoder__num_animation_loops( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func netpbm.decoder.num_decoded_frame_configs +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frame_configs( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func netpbm.decoder.num_decoded_frames +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frames( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func netpbm.decoder.restart_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__restart_frame( +- wuffs_netpbm__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func netpbm.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_netpbm__decoder__set_report_metadata( +- wuffs_netpbm__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func netpbm.decoder.tell_me_more +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__tell_me_more( +- wuffs_netpbm__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func netpbm.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__history_retain_length( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func netpbm.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_netpbm__decoder__workbuf_len( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_nie__error__bad_header[] = "#nie: bad header"; +-const char wuffs_nie__error__truncated_input[] = "#nie: truncated input"; +-const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file"; +-const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read"; +- +-// ---------------- Private Consts +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__swizzle( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_nie__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_nie__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_nie__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_nie__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_nie__decoder__initialize( +- wuffs_nie__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint64_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ v_u = t_2; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u)); ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint64_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_u = t_3; + } +- } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_nie__decoder* +-wuffs_nie__decoder__alloc(void) { +- wuffs_nie__decoder* x = +- (wuffs_nie__decoder*)(calloc(sizeof(wuffs_nie__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_nie__decoder__initialize( +- x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_nie__decoder(void) { +- return sizeof(wuffs_nie__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func nie.decoder.get_quirk ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint64_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 24) { ++ t_4 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_u = t_4; ++ } ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ uint64_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_u = t_5; ++ } ++ self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u)); ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint64_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 24) { ++ t_6 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); ++ } ++ } ++ v_u = t_6; ++ } ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint64_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7); ++ if (num_bits_7 == 24) { ++ t_7 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)); ++ } ++ } ++ v_u = t_7; ++ } ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__get_quirk( +- const wuffs_nie__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_chrm = 0; ++ goto exit; + } + +- return 0u; +-} +- +-// -------- func nie.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_chrm = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__set_quirk( +- wuffs_nie__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func nie.decoder.decode_image_config ++// -------- func png.decoder.decode_exif + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, ++static wuffs_base__status ++wuffs_png__decoder__decode_exif( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_impl.f_metadata_flavor = 3u; ++ self->private_impl.f_metadata_fourcc = 1163413830u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length))); ++ self->private_impl.f_chunk_length = 0u; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- ++ goto ok; ++ ok: + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func nie.decoder.do_decode_image_config ++// -------- func png.decoder.decode_fctl + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__do_decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_png__decoder__decode_fctl( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_a = 0; ++ uint32_t v_x0 = 0; ++ uint32_t v_y0 = 0; ++ uint32_t v_x1 = 0; ++ uint32_t v_y1 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51075,185 +64112,309 @@ wuffs_nie__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_fctl; ++ if (coro_susp_point) { ++ v_x0 = self->private_data.s_decode_fctl.v_x0; ++ v_x1 = self->private_data.s_decode_fctl.v_x1; ++ v_y1 = self->private_data.s_decode_fctl.v_y1; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ if (self->private_impl.f_chunk_length != 26u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_impl.f_chunk_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); ++ t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ *scratch |= ((uint64_t)(num_bits_0)); + } + } +- v_a = t_0; ++ v_x0 = t_0; + } +- if (v_a != 1169146734u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ if (v_x0 != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } ++ self->private_impl.f_next_animation_seq_num += 1u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); ++ t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ *scratch |= ((uint64_t)(num_bits_1)); + } + } +- v_a = t_1; +- } +- if (v_a == 879649535u) { +- self->private_impl.f_pixfmt = 2164295816u; +- } else if (v_a == 946758399u) { +- self->private_impl.f_pixfmt = 2164308923u; +- } else if (v_a == 879780607u) { +- status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); +- goto exit; +- } else if (v_a == 946889471u) { +- status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); +- goto exit; ++ v_x1 = t_1; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); + if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); ++ t_2 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ *scratch |= ((uint64_t)(num_bits_2)); + } + } +- v_a = t_2; +- } +- if (v_a > 2147483647u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); +- goto exit; +- } else if (v_a > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; ++ v_y1 = t_2; + } +- self->private_impl.f_width = v_a; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_x0 = t_3; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_y0 = t_4; ++ } ++ v_x1 += v_x0; ++ v_y1 += v_y0; ++ if ((v_x0 >= v_x1) || ++ (v_x0 > self->private_impl.f_width) || ++ (v_x1 > self->private_impl.f_width) || ++ (v_y0 >= v_y1) || ++ (v_y0 > self->private_impl.f_height) || ++ (v_y1 > self->private_impl.f_height)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_frame_rect_x0 = v_x0; ++ self->private_impl.f_frame_rect_y0 = v_y0; ++ self->private_impl.f_frame_rect_x1 = v_x1; ++ self->private_impl.f_frame_rect_y1 = v_y1; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; + *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_x0 = t_5; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch)); ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch >> 48)); + break; + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); + } + } +- v_a = t_3; ++ v_x1 = t_6; + } +- if (v_a > 2147483647u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ if (v_x1 <= 0u) { ++ self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u); ++ } else { ++ self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1))); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_7 = *iop_a_src++; ++ v_x0 = t_7; ++ } ++ if (v_x0 == 0u) { ++ self->private_impl.f_frame_disposal = 0u; ++ } else if (v_x0 == 1u) { ++ self->private_impl.f_frame_disposal = 1u; ++ } else if (v_x0 == 2u) { ++ self->private_impl.f_frame_disposal = 2u; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; +- } else if (v_a > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_8 = *iop_a_src++; ++ v_x0 = t_8; ++ } ++ if (v_x0 == 0u) { ++ self->private_impl.f_frame_overwrite_instead_of_blend = true; ++ } else if (v_x0 == 1u) { ++ self->private_impl.f_frame_overwrite_instead_of_blend = false; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } +- self->private_impl.f_height = v_a; +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- 16u, +- false); ++ if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { ++ self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0; ++ self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0; ++ self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1; ++ self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1; ++ self->private_impl.f_first_duration = self->private_impl.f_frame_duration; ++ self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal; ++ self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend; + } +- self->private_impl.f_call_sequence = 32u; + + goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_decode_fctl = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_fctl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_fctl.v_x0 = v_x0; ++ self->private_data.s_decode_fctl.v_x1 = v_x1; ++ self->private_data.s_decode_fctl.v_y1 = v_y1; + + goto exit; + exit: +@@ -51264,82 +64425,99 @@ wuffs_nie__decoder__do_decode_image_config( + return status; + } + +-// -------- func nie.decoder.decode_frame_config ++// -------- func png.decoder.decode_gama + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, ++static wuffs_base__status ++wuffs_png__decoder__decode_gama( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_gama; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; ++ if (self->private_impl.f_chunk_length != 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1195461953u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_gama.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_gama.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_impl.f_metadata_x = t_0; + } ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; + ++ goto ok; + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_gama = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ self->private_impl.p_decode_gama = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func nie.decoder.do_decode_frame_config ++// -------- func png.decoder.decode_iccp + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_png__decoder__decode_iccp( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ uint8_t v_c8 = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51351,62 +64529,63 @@ wuffs_nie__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_iccp; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- if (status.repr) { +- goto suspend; ++ if (v_c8 == 0u) { ++ break; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ } ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- 16u, +- 0u, +- false, +- false, +- 0u); ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; + } +- self->private_impl.f_call_sequence = 64u; ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ self->private_impl.f_metadata_flavor = 4u; ++ self->private_impl.f_metadata_fourcc = 1229144912u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_iccp = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_iccp = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -51417,182 +64596,119 @@ wuffs_nie__decoder__do_decode_frame_config( + return status; + } + +-// -------- func nie.decoder.decode_frame ++// -------- func png.decoder.decode_plte + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_png__decoder__decode_plte( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ uint32_t v_num_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ uint32_t coro_susp_point = self->private_impl.p_decode_plte; ++ if (coro_susp_point) { ++ v_num_entries = self->private_data.s_decode_plte.v_num_entries; ++ v_i = self->private_data.s_decode_plte.v_i; + } +- return status; +-} +- +-// -------- func nie.decoder.do_decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y = 0u; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; ++ if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- while (true) { +- v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src); +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u); ++ self->private_impl.f_chunk_length = 0u; ++ while (v_i < v_num_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_plte.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_plte.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 16) { ++ t_0 = ((uint32_t)(*scratch >> 40)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- goto ok; ++ v_argb = t_0; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- self->private_impl.f_call_sequence = 96u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_plte = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_plte = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_plte.v_num_entries = v_num_entries; ++ self->private_data.s_decode_plte.v_i = v_i; + + goto exit; + exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ + return status; + } + +-// -------- func nie.decoder.swizzle ++// -------- func png.decoder.decode_srgb + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__swizzle( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_png__decoder__decode_srgb( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; +- + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51604,66 +64720,39 @@ wuffs_nie__decoder__swizzle( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += 1u; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_src_bytes_per_pixel = 4u; +- if (self->private_impl.f_pixfmt == 2164308923u) { +- v_src_bytes_per_pixel = 8u; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); +- } +- v_j -= 8u; +- } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); +- } +- v_j -= 1u; +- } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- wuffs_base__pixel_buffer__palette(a_dst), +- &iop_a_src, +- io2_a_src); ++ uint32_t coro_susp_point = self->private_impl.p_decode_srgb; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_chunk_length != 1u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read); +- goto ok; ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1397901122u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t t_0 = *iop_a_src++; ++ self->private_impl.f_metadata_x = t_0; + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_srgb = 0; ++ goto exit; + } +- status = wuffs_base__make_status(NULL); +- goto ok; + +- ok: ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_srgb = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -51673,131 +64762,199 @@ wuffs_nie__decoder__swizzle( + return status; + } + +-// -------- func nie.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_nie__decoder__frame_dirty_rect( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func nie.decoder.num_animation_loops ++// -------- func png.decoder.decode_trns + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_nie__decoder__num_animation_loops( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} ++static wuffs_base__status ++wuffs_png__decoder__decode_trns( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// -------- func nie.decoder.num_decoded_frame_configs ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ uint64_t v_u = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frame_configs( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; ++ uint32_t coro_susp_point = self->private_impl.p_decode_trns; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_decode_trns.v_i; ++ v_n = self->private_data.s_decode_trns.v_n; + } +- return 0u; +-} +- +-// -------- func nie.decoder.num_decoded_frames ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frames( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ if (self->private_impl.f_color_type == 0u) { ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ if (self->private_impl.f_chunk_length != 2u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_trns.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_trns.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint64_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_u = t_0; ++ } ++ if (self->private_impl.f_depth <= 1u) { ++ self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 2u) { ++ self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 4u) { ++ self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u); ++ } else { ++ self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u); ++ } ++ } else if (self->private_impl.f_color_type == 2u) { ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ if (self->private_impl.f_chunk_length != 6u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_decode_trns.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_trns.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 40) { ++ t_1 = ((uint64_t)(*scratch >> 16)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ v_u = t_1; ++ } ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) | ++ (65280u & (v_u >> 8u)) | ++ (16711680u & (v_u >> 16u)) | ++ 4278190080u); ++ } else { ++ self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u); ++ } ++ } else if (self->private_impl.f_color_type == 3u) { ++ self->private_impl.f_dst_pixfmt = 2164523016u; ++ self->private_impl.f_src_pixfmt = 2164523016u; ++ if (self->private_impl.f_chunk_length > 256u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ v_n = ((uint32_t)(self->private_impl.f_chunk_length)); ++ self->private_impl.f_chunk_length = 0u; ++ while (v_i < v_n) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2; ++ } ++ v_i += 1u; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_trns = 0; ++ goto exit; + } +- return 0u; +-} +- +-// -------- func nie.decoder.restart_frame + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__restart_frame( +- wuffs_nie__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_trns = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_trns.v_i = v_i; ++ self->private_data.s_decode_trns.v_n = v_n; + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if ((a_index != 0u) || (a_io_position != 16u)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); +-} + +-// -------- func nie.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_nie__decoder__set_report_metadata( +- wuffs_nie__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func nie.decoder.tell_me_more ++// -------- func png.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__tell_me_more( +- wuffs_nie__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, ++wuffs_png__decoder__decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); +@@ -51808,354 +64965,485 @@ wuffs_nie__decoder__tell_me_more( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_dst || !a_src) { ++ if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func nie.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__history_retain_length( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func nie.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_nie__decoder__workbuf_len( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required"; +-const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum"; +-const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method"; +-const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size"; +-const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check"; +-const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary"; +-const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input"; +- +-// ---------------- Private Consts +- +-#define WUFFS_ZLIB__QUIRKS_BASE 2113790976 +- +-#define WUFFS_ZLIB__QUIRKS_COUNT 1 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_zlib__decoder__do_transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_zlib__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_zlib__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_zlib__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_zlib__decoder__initialize( +- wuffs_zlib__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- wuffs_base__status z = wuffs_adler32__hasher__initialize( +- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_adler32__hasher__initialize( +- &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_deflate__decoder__initialize( +- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_zlib__decoder* +-wuffs_zlib__decoder__alloc(void) { +- wuffs_zlib__decoder* x = +- (wuffs_zlib__decoder*)(calloc(sizeof(wuffs_zlib__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_zlib__decoder__initialize( +- x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_zlib__decoder(void) { +- return sizeof(wuffs_zlib__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func zlib.decoder.dictionary_id +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_zlib__decoder__dictionary_id( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return self->private_impl.f_dict_id_want; +-} + +-// -------- func zlib.decoder.add_dictionary +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_zlib__decoder__add_dictionary( +- wuffs_zlib__decoder* self, +- wuffs_base__slice_u8 a_dict) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; + } + +- if (self->private_impl.f_header_complete) { +- self->private_impl.f_bad_call_sequence = true; +- } else { +- self->private_impl.f_dict_id_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict); +- wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict); ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- self->private_impl.f_got_dictionary = true; +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func zlib.decoder.get_quirk ++// -------- func png.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__get_quirk( +- const wuffs_zlib__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_checksum_have = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t v_key = 0; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; +- } else if (a_key >= 2113790976u) { +- v_key = (a_key - 2113790976u); +- if (v_key < 1u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_png__decoder__skip_frame(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 48u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } ++ if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { ++ self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; ++ self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0; ++ self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1; ++ self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1; ++ self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position; ++ self->private_impl.f_frame_duration = self->private_impl.f_first_duration; ++ self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal; ++ self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend; ++ } else { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ self->private_impl.f_chunk_length = t_0; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_chunk_type = t_1; ++ } ++ if (self->private_impl.f_chunk_type == 1145980233u) { ++ if (self->private_impl.f_chunk_length != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_checksum_have = t_2; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8u)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_png__decoder__decode_fctl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_data.s_do_decode_frame_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame_config.scratch; ++ break; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 48u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } ++ self->private_data.s_do_decode_frame_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame_config.scratch; ++ self->private_impl.f_chunk_length = 0u; + } + } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ self->private_impl.f_frame_rect_x0, ++ self->private_impl.f_frame_rect_y0, ++ self->private_impl.f_frame_rect_x1, ++ self->private_impl.f_frame_rect_y1), ++ ((wuffs_base__flicks)(self->private_impl.f_frame_duration)), ++ ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)), ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_frame_disposal, ++ ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns), ++ self->private_impl.f_frame_overwrite_instead_of_blend, ++ 0u); ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- return 0u; +-} + +-// -------- func zlib.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__set_quirk( +- wuffs_zlib__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (self->private_impl.f_header_complete) { +- self->private_impl.f_bad_call_sequence = true; +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } else if (a_key >= 2113790976u) { +- a_key -= 2113790976u; +- if (a_key < 1u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func zlib.decoder.history_retain_length ++// -------- func png.decoder.skip_frame + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__history_retain_length( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++static wuffs_base__status ++wuffs_png__decoder__skip_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_seq_num = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- return 0u; +-} ++ uint32_t coro_susp_point = self->private_impl.p_skip_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// -------- func zlib.decoder.workbuf_len ++ self->private_impl.f_chunk_type_array[0u] = 0u; ++ self->private_impl.f_chunk_type_array[1u] = 0u; ++ self->private_impl.f_chunk_type_array[2u] = 0u; ++ self->private_impl.f_chunk_type_array[3u] = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ if (self->private_impl.f_chunk_type_array[0u] == 102u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 68u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 102u; ++ self->private_impl.f_chunk_type_array[1u] = 100u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ iop_a_src += 8u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_skip_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_skip_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_seq_num = t_0; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; ++ } ++ self->private_impl.f_next_animation_seq_num += 1u; ++ self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ continue; ++ } else if (self->private_impl.f_chunk_type_array[0u] != 0u) { ++ break; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ self->private_impl.f_call_sequence = 32u; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_zlib__decoder__workbuf_len( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ok: ++ self->private_impl.p_skip_frame = 0; ++ goto exit; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return status; + } + +-// -------- func zlib.decoder.transform_io ++// -------- func png.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_png__decoder__decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -52170,7 +65458,7 @@ wuffs_zlib__decoder__transform_io( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -52179,71 +65467,312 @@ wuffs_zlib__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func png.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_seq_num = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_pass_width = 0; ++ uint32_t v_pass_height = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else if (self->private_impl.f_call_sequence != 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } + while (true) { +- { +- wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); +- v_status = t_0; ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_zlib__error__truncated_input); ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 68u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ iop_a_src += 8u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ break; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ self->private_impl.f_chunk_type_array[0u] = 102u; ++ self->private_impl.f_chunk_type_array[1u] = 100u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ iop_a_src += 8u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_seq_num = t_0; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; ++ } ++ self->private_impl.f_next_animation_seq_num += 1u; ++ break; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_data.s_do_decode_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ } ++ if (self->private_impl.f_zlib_is_dirty) { ++ wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, ++ sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ if (self->private_impl.f_ignore_checksum) { ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); ++ } ++ } ++ self->private_impl.f_zlib_is_dirty = true; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_workbuf_hist_pos_base = 0u; ++ while (true) { ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_pass_width = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1u])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u])); ++ v_pass_height = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4u])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u])); ++ } else { ++ v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0))); ++ v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0))); ++ } ++ if ((v_pass_width > 0u) && (v_pass_height > 0u)) { ++ self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); ++ self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row)); ++ while (true) { ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { ++ if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); ++ } ++ if (v_status.repr == wuffs_base__suspension__short_read) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; ++ } ++ if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) { ++ break; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace_pass += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ self->private_impl.f_call_sequence = 32u; + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_do_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func zlib.decoder.do_transform_io ++// -------- func png.decoder.decode_pass + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_zlib__decoder__do_transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_png__decoder__decode_pass( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint16_t v_x = 0; +- uint32_t v_checksum_got = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_w_mark = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_have = 0; + uint32_t v_checksum_want = 0; +- uint64_t v_mark = 0; ++ uint32_t v_seq_num = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -52255,77 +65784,93 @@ wuffs_zlib__decoder__do_transform_io( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_pass; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_bad_call_sequence) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_quirks[0u]) { +- } else if ( ! self->private_impl.f_want_dictionary) { ++ self->private_impl.f_workbuf_wi = 0u; ++ while (true) { ++ if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint16_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ wuffs_base__io_buffer* o_0_v_w = v_w; ++ uint8_t* o_0_iop_v_w = iop_v_w; ++ uint8_t* o_0_io0_v_w = io0_v_w; ++ uint8_t* o_0_io1_v_w = io1_v_w; ++ uint8_t* o_0_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_workbuf_wi, ++ self->private_impl.f_pass_workbuf_length), ++ ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi))); ++ { ++ const bool o_1_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_1_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 8) { +- t_0 = ((uint16_t)(*scratch >> 48)); +- break; ++ wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_0; ++ iop_v_w = u_w.data.ptr + u_w.meta.wi; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)))); ++ io2_a_src = o_1_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_1_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); + } + } +- v_x = t_0; +- } +- if (((v_x >> 8u) & 15u) != 8u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method); +- goto exit; +- } +- if ((v_x >> 12u) > 7u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size); +- goto exit; +- } +- if ((v_x % 31u) != 0u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check); +- goto exit; ++ v_w = o_0_v_w; ++ iop_v_w = o_0_iop_v_w; ++ io0_v_w = o_0_io0_v_w; ++ io1_v_w = o_0_io1_v_w; ++ io2_v_w = o_0_io2_v_w; + } +- self->private_impl.f_want_dictionary = ((v_x & 32u) != 0u); +- if (self->private_impl.f_want_dictionary) { +- self->private_impl.f_dict_id_got = 1u; ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ if (self->private_impl.f_chunk_length > 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ goto exit; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; + *scratch <<= 8; +@@ -52338,101 +65883,208 @@ wuffs_zlib__decoder__do_transform_io( + *scratch |= ((uint64_t)(num_bits_1)); + } + } +- self->private_impl.f_dict_id_want = t_1; ++ v_checksum_want = t_1; + } +- status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); +- goto ok; +- } else if (self->private_impl.f_got_dictionary) { +- status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); +- goto exit; +- } +- } else if (self->private_impl.f_dict_id_got != self->private_impl.f_dict_id_want) { +- if (self->private_impl.f_got_dictionary) { +- status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ } ++ break; ++ } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) { ++ if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); + goto exit; +- } +- status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); +- goto ok; +- } +- self->private_impl.f_header_complete = true; +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ goto ok; ++ } else if (self->private_impl.f_chunk_length == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ v_checksum_want = t_2; + } +- wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); +- v_status = t_2; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } + } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ self->private_impl.f_chunk_length = t_3; + } +- } +- if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0u]) { +- v_checksum_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- } +- if ( ! self->private_impl.f_quirks[0u]) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; ++ } ++ self->private_impl.f_chunk_type = t_4; ++ } ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ if (self->private_impl.f_chunk_type != 1413563465u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ } else { ++ if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); ++ v_seq_num = t_5; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; + } ++ self->private_impl.f_next_animation_seq_num += 1u; + } +- v_checksum_want = t_3; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_got != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum); ++ continue; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input); + goto exit; + } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) { ++ status = wuffs_base__make_status(wuffs_base__error__not_enough_data); ++ goto exit; ++ } else if (0u < ((uint64_t)(a_workbuf.len))) { ++ if (a_workbuf.ptr[0u] == 4u) { ++ a_workbuf.ptr[0u] = 1u; ++ } + } + + ok: +- self->private_impl.p_do_transform_io[0] = 0; ++ self->private_impl.p_decode_pass = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; ++ self->private_impl.p_decode_pass = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -52440,2021 +66092,1710 @@ wuffs_zlib__decoder__do_transform_io( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number"; +-const char wuffs_png__error__bad_checksum[] = "#png: bad checksum"; +-const char wuffs_png__error__bad_chunk[] = "#png: bad chunk"; +-const char wuffs_png__error__bad_filter[] = "#png: bad filter"; +-const char wuffs_png__error__bad_header[] = "#png: bad header"; +-const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; +-const char wuffs_png__error__missing_palette[] = "#png: missing palette"; +-const char wuffs_png__error__truncated_input[] = "#png: truncated input"; +-const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; +-const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; +-const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; +-const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; +-const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type"; +-const char wuffs_png__error__internal_error_inconsistent_frame_bounds[] = "#png: internal error: inconsistent frame bounds"; +-const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length"; +-const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input"; +- +-// ---------------- Private Consts +- +-#define WUFFS_PNG__ANCILLARY_BIT 32 +- +-static const uint8_t +-WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = { +- { +- 0, 0, 0, 0, 0, 0, +- }, { +- 3, 7, 0, 3, 7, 0, +- }, { +- 3, 3, 4, 3, 7, 0, +- }, { +- 2, 3, 0, 3, 3, 4, +- }, { +- 2, 1, 2, 2, 3, 0, +- }, { +- 1, 1, 0, 2, 1, 2, +- }, { +- 1, 0, 1, 1, 1, 0, +- }, { +- 0, 0, 0, 1, 0, 1, +- }, +-}; +- +-static const uint8_t +-WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 255, 85, 0, 17, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 8, 4, 0, 2, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 0, 3, 1, 2, 0, 4, 0, +-}; +- +-static const uint16_t +-WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 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, +- 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, +- 64, 65, 66, 67, 68, 69, 70, 71, +- 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, +- 88, 89, 90, 91, 92, 93, 94, 95, +- 96, 97, 98, 99, 100, 101, 102, 103, +- 104, 105, 106, 107, 108, 109, 110, 111, +- 112, 113, 114, 115, 116, 117, 118, 119, +- 120, 121, 122, 123, 124, 125, 126, 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, 0, +- 0, 41410, 41666, 41922, 42178, 42434, 42690, 42946, +- 43202, 43458, 43714, 43970, 44226, 44482, 44738, 44994, +- 45250, 45506, 45762, 46018, 46274, 46530, 46786, 47042, +- 47298, 47554, 47810, 48066, 48322, 48578, 48834, 49090, +- 32963, 33219, 33475, 33731, 33987, 34243, 34499, 34755, +- 35011, 35267, 35523, 35779, 36035, 36291, 36547, 36803, +- 37059, 37315, 37571, 37827, 38083, 38339, 38595, 38851, +- 39107, 39363, 39619, 39875, 40131, 40387, 40643, 40899, +- 41155, 41411, 41667, 41923, 42179, 42435, 42691, 42947, +- 43203, 43459, 43715, 43971, 44227, 44483, 44739, 44995, +- 45251, 45507, 45763, 46019, 46275, 46531, 46787, 47043, +- 47299, 47555, 47811, 48067, 48323, 48579, 48835, 49091, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_2( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_ihdr( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__assign_filter_distance( +- wuffs_png__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint64_t +-wuffs_png__decoder__calculate_bytes_per_row( +- const wuffs_png__decoder* self, +- uint32_t a_width); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__choose_filter_implementations( +- wuffs_png__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_other_chunk( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- bool a_framy); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_actl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_chrm( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_png__decoder__frame_dirty_rect( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_exif( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return wuffs_base__utility__make_rect_ie_u32( ++ self->private_impl.f_frame_rect_x0, ++ self->private_impl.f_frame_rect_y0, ++ self->private_impl.f_frame_rect_x1, ++ self->private_impl.f_frame_rect_y1); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_fctl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_gama( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_png__decoder__num_animation_loops( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_iccp( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return self->private_impl.f_num_animation_loops_value; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_plte( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_srgb( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_png__decoder__num_decoded_frame_configs( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_trns( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__skip_frame( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_png__decoder__num_decoded_frames( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ return ((uint64_t)(self->private_impl.f_num_decoded_frames_value)); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_pass( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func png.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_tell_me_more( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_png__decoder__restart_frame( + wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0u) && (a_io_position != self->private_impl.f_first_config_io_position))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ if (self->private_impl.f_interlace_pass >= 1u) { ++ self->private_impl.f_interlace_pass = 1u; ++ } ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index)); ++ self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value; ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func png.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle_tricky( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_png__decoder__set_report_metadata( + wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables ++ uint32_t a_fourcc, ++ bool a_report) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_png__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_png__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_png__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_png__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len), +-}; ++ if (a_fourcc == 1128813133u) { ++ self->private_impl.f_report_metadata_chrm = a_report; ++ } else if (a_fourcc == 1163413830u) { ++ self->private_impl.f_report_metadata_exif = a_report; ++ } else if (a_fourcc == 1195461953u) { ++ self->private_impl.f_report_metadata_gama = a_report; ++ } else if (a_fourcc == 1229144912u) { ++ self->private_impl.f_report_metadata_iccp = a_report; ++ } else if (a_fourcc == 1263947808u) { ++ self->private_impl.f_report_metadata_kvp = a_report; ++ } else if (a_fourcc == 1397901122u) { ++ self->private_impl.f_report_metadata_srgb = a_report; ++ } ++ return wuffs_base__make_empty_struct(); ++} + +-// ---------------- Initializer Implementations ++// -------- func png.decoder.tell_me_more + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_png__decoder__initialize( ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_png__decoder__tell_me_more( + wuffs_png__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default; +- self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default; +- self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default; +- self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( +- &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_zlib__decoder__initialize( +- &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} + +-wuffs_png__decoder* +-wuffs_png__decoder__alloc(void) { +- wuffs_png__decoder* x = +- (wuffs_png__decoder*)(calloc(sizeof(wuffs_png__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_png__decoder__initialize( +- x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ ok: ++ self->private_impl.p_tell_me_more = 0; ++ goto exit; + } +- return x; +-} + +-size_t +-sizeof__wuffs_png__decoder(void) { +- return sizeof(wuffs_png__decoder); +-} ++ goto suspend; ++ suspend: ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + +-// ---------------- Function Implementations ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_1_distance_4_arm_neon ++// -------- func png.decoder.do_tell_me_more + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_arm_neon( ++static wuffs_base__status ++wuffs_png__decoder__do_tell_me_more( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fx = {0}; ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ uint8_t v_c8 = 0; ++ uint16_t v_c16 = 0; ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_num_written = 0; ++ uint64_t v_w_mark = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; + } +- v_curr.len = 0; + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_3_distance_4_arm_neon ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fx = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more; ++ if (coro_susp_point) { ++ v_zlib_status = self->private_data.s_do_tell_me_more.v_zlib_status; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ } ++ do { ++ if (self->private_impl.f_metadata_flavor == 3u) { ++ while (true) { ++ if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } else if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ self->private_impl.f_metadata_flavor, ++ self->private_impl.f_metadata_fourcc, ++ self->private_impl.f_metadata_x, ++ self->private_impl.f_metadata_y, ++ self->private_impl.f_metadata_z); ++ } ++ if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) { ++ goto label__goto_done__break; ++ } ++ self->private_impl.f_metadata_y = self->private_impl.f_metadata_z; ++ status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ } ++ if (self->private_impl.f_metadata_is_zlib_compressed) { ++ if (self->private_impl.f_zlib_is_dirty) { ++ wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, ++ sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ if (self->private_impl.f_ignore_checksum) { ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); ++ } ++ } ++ self->private_impl.f_zlib_is_dirty = true; ++ self->private_impl.f_ztxt_hist_pos = 0u; ++ } ++ label__loop__continue:; ++ while (true) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ self->private_impl.f_metadata_flavor, ++ self->private_impl.f_metadata_fourcc, ++ self->private_impl.f_metadata_x, ++ self->private_impl.f_metadata_y, ++ self->private_impl.f_metadata_z); ++ } ++ if (self->private_impl.f_metadata_flavor != 4u) { ++ break; ++ } ++ if (self->private_impl.f_metadata_is_zlib_compressed) { ++ if (self->private_impl.f_chunk_type == 1346585449u) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } else if (self->private_impl.f_chunk_type == 1951945833u) { ++ { ++ const bool o_1_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_1_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_1; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_1_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_1_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } else if (self->private_impl.f_chunk_type == 1951945850u) { ++ if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) { ++ { ++ wuffs_base__io_buffer* o_2_v_w = v_w; ++ uint8_t* o_2_iop_v_w = iop_v_w; ++ uint8_t* o_2_io0_v_w = io0_v_w; ++ uint8_t* o_2_io1_v_w = io1_v_w; ++ uint8_t* o_2_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), ++ self->private_impl.f_ztxt_hist_pos); ++ { ++ const bool o_3_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_3_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_2; ++ iop_v_w = u_w.data.ptr + u_w.meta.wi; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ v_num_written = wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))); ++ io2_a_src = o_3_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_3_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ v_w = o_2_v_w; ++ iop_v_w = o_2_iop_v_w; ++ io0_v_w = o_2_io0_v_w; ++ io1_v_w = o_2_io1_v_w; ++ io2_v_w = o_2_io2_v_w; ++ } ++ if (v_num_written > 1024u) { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ self->private_impl.f_ztxt_ri = 0u; ++ self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written)); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written); ++ } ++ while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) { ++ v_c16 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]]; ++ if (v_c16 == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); ++ goto exit; ++ } else if (v_c16 <= 127u) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_ztxt_ri += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1); ++ } else { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_ztxt_ri += 1u; ++ (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) { ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type); ++ goto exit; ++ } ++ } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) { ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ goto label__loop__break; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__loop__continue; ++ } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c8), iop_a_dst += 1); ++ } ++ } else { ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ if (self->private_impl.f_metadata_fourcc == 1263947851u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ goto label__loop__break; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__loop__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 == 0u) { ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ goto label__loop__break; ++ } ++ v_c16 = WUFFS_PNG__LATIN_1[v_c8]; ++ if (v_c16 == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); ++ goto exit; ++ } else if (v_c16 <= 127u) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1); ++ } else { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2); ++ } ++ } ++ } + } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ label__loop__break:; ++ if (self->private_impl.f_metadata_fourcc == 1263947851u) { ++ self->private_impl.f_metadata_fourcc = 1263947862u; ++ if (self->private_impl.f_chunk_type == 1951945833u) { ++ if (self->private_impl.f_chunk_length <= 1u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 2u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_c8 == 0u) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ } else if (v_c8 == 1u) { ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if ((v_c8 != 0u) && self->private_impl.f_metadata_is_zlib_compressed) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; ++ } ++ self->private_impl.f_metadata_fourcc -= 2u; ++ while (self->private_impl.f_metadata_fourcc != 1263947862u) { ++ self->private_impl.f_metadata_fourcc += 1u; ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if (v_c8 == 0u) { ++ break; ++ } ++ } ++ } ++ } else if (self->private_impl.f_chunk_type == 1951945850u) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; ++ } ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ } ++ self->private_impl.f_call_sequence &= 239u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- v_curr.len = 0; ++ } while (0); ++ label__goto_done__break:; ++ if (self->private_impl.f_chunk_length != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ self->private_data.s_do_tell_me_more.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (self->private_data.s_do_tell_me_more.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_tell_me_more.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_4_distance_3_arm_neon +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fc = {0}; +- uint8x8_t v_fx = {0}; +- uint16x8_t v_fafb = {0}; +- uint16x8_t v_fcfc = {0}; +- uint16x8_t v_pa = {0}; +- uint16x8_t v_pb = {0}; +- uint16x8_t v_pc = {0}; +- uint16x8_t v_cmpab = {0}; +- uint16x8_t v_cmpac = {0}; +- uint8x8_t v_picka = {0}; +- uint8x8_t v_pickb = {0}; ++ iop_a_src += self->private_data.s_do_tell_me_more.scratch; ++ self->private_impl.f_metadata_flavor = 0u; ++ self->private_impl.f_metadata_fourcc = 0u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ self->private_impl.f_call_sequence &= 239u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end2_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ ok: ++ self->private_impl.p_do_tell_me_more = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_4_distance_4_arm_neon +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fc = {0}; +- uint8x8_t v_fx = {0}; +- uint16x8_t v_fafb = {0}; +- uint16x8_t v_fcfc = {0}; +- uint16x8_t v_pa = {0}; +- uint16x8_t v_pb = {0}; +- uint16x8_t v_pc = {0}; +- uint16x8_t v_cmpab = {0}; +- uint16x8_t v_cmpac = {0}; +- uint8x8_t v_picka = {0}; +- uint8x8_t v_pickb = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_tell_me_more.v_zlib_status = v_zlib_status; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// -------- func png.decoder.filter_1 +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- return (*self->private_impl.choosy_filter_1)(self, a_curr); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- uint64_t v_filter_distance = 0; +- uint8_t v_fa = 0; +- uint64_t v_i_start = 0; +- uint64_t v_i = 0; +- +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- v_i_start = 0u; +- while (v_i_start < v_filter_distance) { +- v_fa = 0u; +- v_i = v_i_start; +- while (v_i < ((uint64_t)(a_curr.len))) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa)); +- v_fa = a_curr.ptr[v_i]; +- v_i += v_filter_distance; +- } +- v_i_start += 1u; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func png.decoder.filter_1_distance_3_fallback +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- } +- v_curr.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- } +- v_curr.len = 0; +- } +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func png.decoder.filter_1_distance_4_fallback ++// -------- func png.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; +- uint8_t v_fa3 = 0; +- +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_png__decoder__workbuf_len( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func png.decoder.filter_2 +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_2( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_n = 0; +- uint64_t v_i = 0; +- +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while (v_i < v_n) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); +- v_i += 1u; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length); + } + +-// -------- func png.decoder.filter_3 ++// -------- func png.decoder.filter_and_swizzle + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev); ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf); + } + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3__choosy_default( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle__choosy_default( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_filter_distance = 0; +- uint64_t v_n = 0; +- uint64_t v_i = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row0 = 0; ++ uint64_t v_dst_bytes_per_row1 = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint32_t v_y = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_filter = 0; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ wuffs_base__slice_u8 v_prev_row = {0}; + +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- if (((uint64_t)(a_prev.len)) == 0u) { +- v_i = v_filter_distance; +- while (v_i < ((uint64_t)(a_curr.len))) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_curr.ptr[(v_i - v_filter_distance)] / 2u))); +- v_i += 1u; +- } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel); ++ v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) { ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ 0u, ++ 0u, ++ v_dst_bytes_per_row1, ++ ((uint64_t)(v_tab.height))); ++ } ++ if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) { ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ v_dst_bytes_per_row0, ++ 0u, ++ ((uint64_t)(v_tab.width)), ++ ((uint64_t)(v_tab.height))); + } else { +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while ((v_i < v_n) && (v_i < v_filter_distance)) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_prev.ptr[v_i] / 2u))); +- v_i += 1u; ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ 0u, ++ 0u, ++ 0u, ++ 0u); ++ } ++ v_y = self->private_impl.f_frame_rect_y0; ++ while (v_y < self->private_impl.f_frame_rect_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (1u > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); + } +- v_i = v_filter_distance; +- while (v_i < v_n) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2u))))); +- v_i += 1u; ++ v_filter = a_workbuf.ptr[0u]; ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); ++ if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ if (v_filter == 0u) { ++ } else if (v_filter == 1u) { ++ wuffs_png__decoder__filter_1(self, v_curr_row); ++ } else if (v_filter == 2u) { ++ wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 3u) { ++ wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 4u) { ++ wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); ++ } else { ++ return wuffs_base__make_status(wuffs_png__error__bad_filter); + } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row); ++ v_prev_row = v_curr_row; ++ v_y += 1u; + } +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_3_distance_3_fallback ++// -------- func png.decoder.filter_and_swizzle_tricky + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_3_fallback( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle_tricky( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row1 = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_src_bytes_per_pixel = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ uint64_t v_i = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_filter = 0; ++ wuffs_base__slice_u8 v_s = {0}; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ wuffs_base__slice_u8 v_prev_row = {0}; ++ uint8_t v_bits_unpacked[8] = {0}; ++ uint8_t v_bits_packed = 0; ++ uint8_t v_packs_remaining = 0; ++ uint8_t v_multiplier = 0; ++ uint8_t v_shift = 0; + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_src_bytes_per_pixel = 1u; ++ if (self->private_impl.f_depth >= 8u) { ++ v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u))))); ++ } ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u])); ++ } else { ++ v_y = self->private_impl.f_frame_rect_y0; ++ } ++ while (v_y < self->private_impl.f_frame_rect_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1); ++ } ++ if (1u > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_filter = a_workbuf.ptr[0u]; ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); ++ if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ if (v_filter == 0u) { ++ } else if (v_filter == 1u) { ++ wuffs_png__decoder__filter_1(self, v_curr_row); ++ } else if (v_filter == 2u) { ++ wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 3u) { ++ wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 4u) { ++ wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); ++ } else { ++ return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ } ++ v_s = v_curr_row; ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u])); ++ } else { ++ v_x = self->private_impl.f_frame_rect_x0; ++ } ++ if (self->private_impl.f_depth == 8u) { ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { ++ if (self->private_impl.f_color_type == 0u) { ++ if (1u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[0u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[0u]; ++ v_bits_unpacked[3u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } ++ } else { ++ if (3u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[2u]; ++ v_bits_unpacked[1u] = v_s.ptr[1u]; ++ v_bits_unpacked[2u] = v_s.ptr[0u]; ++ v_bits_unpacked[3u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } ++ } ++ } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel)); ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel); ++ } ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; ++ } else if (self->private_impl.f_depth < 8u) { ++ v_multiplier = 1u; ++ if (self->private_impl.f_color_type == 0u) { ++ v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth]; + } +- v_curr.len = 0; +- } +- } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ v_shift = ((uint8_t)(((uint8_t)(8u - self->private_impl.f_depth)) & 7u)); ++ v_packs_remaining = 0u; ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) { ++ v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth]; ++ v_bits_packed = v_s.ptr[0u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ } ++ v_bits_unpacked[0u] = ((uint8_t)(((uint8_t)(v_bits_packed >> v_shift)) * v_multiplier)); ++ v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth)); ++ v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u)); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { ++ v_bits_unpacked[1u] = v_bits_unpacked[0u]; ++ v_bits_unpacked[2u] = v_bits_unpacked[0u]; ++ v_bits_unpacked[3u] = 255u; ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } else { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1)); ++ } ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ } else { ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_color_type == 0u) { ++ if (2u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[1u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[1u]; ++ v_bits_unpacked[3u] = v_s.ptr[0u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = 255u; ++ v_bits_unpacked[7u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint64_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint64_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint64_t)(v_bits_unpacked[3u])) << 24u) | ++ (((uint64_t)(v_bits_unpacked[4u])) << 32u) | ++ (((uint64_t)(v_bits_unpacked[5u])) << 40u) | ++ (((uint64_t)(v_bits_unpacked[6u])) << 48u) | ++ (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ v_bits_unpacked[4u] = 0u; ++ v_bits_unpacked[5u] = 0u; ++ v_bits_unpacked[6u] = 0u; ++ v_bits_unpacked[7u] = 0u; ++ } ++ } ++ } else if (self->private_impl.f_color_type == 2u) { ++ if (6u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[5u]; ++ v_bits_unpacked[1u] = v_s.ptr[4u]; ++ v_bits_unpacked[2u] = v_s.ptr[3u]; ++ v_bits_unpacked[3u] = v_s.ptr[2u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = 255u; ++ v_bits_unpacked[7u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); ++ if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint64_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint64_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint64_t)(v_bits_unpacked[3u])) << 24u) | ++ (((uint64_t)(v_bits_unpacked[4u])) << 32u) | ++ (((uint64_t)(v_bits_unpacked[5u])) << 40u) | ++ (((uint64_t)(v_bits_unpacked[6u])) << 48u) | ++ (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ v_bits_unpacked[4u] = 0u; ++ v_bits_unpacked[5u] = 0u; ++ v_bits_unpacked[6u] = 0u; ++ v_bits_unpacked[7u] = 0u; ++ } ++ } ++ } else if (self->private_impl.f_color_type == 4u) { ++ if (4u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[1u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[1u]; ++ v_bits_unpacked[3u] = v_s.ptr[0u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = v_s.ptr[3u]; ++ v_bits_unpacked[7u] = v_s.ptr[2u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ } else { ++ if (8u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[5u]; ++ v_bits_unpacked[1u] = v_s.ptr[4u]; ++ v_bits_unpacked[2u] = v_s.ptr[3u]; ++ v_bits_unpacked[3u] = v_s.ptr[2u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = v_s.ptr[7u]; ++ v_bits_unpacked[7u] = v_s.ptr[6u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ } ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8)); ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 0; +- v_prev.len = 0; + } ++ v_prev_row = v_curr_row; ++ v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]); + } +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_3_distance_4_fallback ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_qoi__error__bad_footer[] = "#qoi: bad footer"; ++const char wuffs_qoi__error__bad_header[] = "#qoi: bad header"; ++const char wuffs_qoi__error__truncated_input[] = "#qoi: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; +- uint8_t v_fa3 = 0; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_src_to_buffer( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_buffer_to_dst( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_qoi__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_qoi__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_qoi__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_qoi__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_qoi__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_qoi__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_qoi__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_qoi__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_qoi__decoder__initialize( ++ wuffs_qoi__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)((v_fa3 / 2u) + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } +- return wuffs_base__make_empty_struct(); ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_4 ++wuffs_qoi__decoder* ++wuffs_qoi__decoder__alloc(void) { ++ wuffs_qoi__decoder* x = ++ (wuffs_qoi__decoder*)(calloc(1, sizeof(wuffs_qoi__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_qoi__decoder__initialize( ++ x, sizeof(wuffs_qoi__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev); ++size_t ++sizeof__wuffs_qoi__decoder(void) { ++ return sizeof(wuffs_qoi__decoder); + } + ++// ---------------- Function Implementations ++ ++// -------- func qoi.decoder.get_quirk ++ + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_filter_distance = 0; +- uint64_t v_n = 0; +- uint64_t v_i = 0; +- uint32_t v_fa = 0; +- uint32_t v_fb = 0; +- uint32_t v_fc = 0; +- uint32_t v_pp = 0; +- uint32_t v_pa = 0; +- uint32_t v_pb = 0; +- uint32_t v_pc = 0; ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__get_quirk( ++ const wuffs_qoi__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while ((v_i < v_n) && (v_i < v_filter_distance)) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); +- v_i += 1u; ++ return 0u; ++} ++ ++// -------- func qoi.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__set_quirk( ++ wuffs_qoi__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- v_i = v_filter_distance; +- while (v_i < v_n) { +- v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])); +- v_fb = ((uint32_t)(a_prev.ptr[v_i])); +- v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)])); +- v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc)); +- v_pa = ((uint32_t)(v_pp - v_fa)); +- if (v_pa >= 2147483648u) { +- v_pa = ((uint32_t)(0u - v_pa)); +- } +- v_pb = ((uint32_t)(v_pp - v_fb)); +- if (v_pb >= 2147483648u) { +- v_pb = ((uint32_t)(0u - v_pb)); +- } +- v_pc = ((uint32_t)(v_pp - v_fc)); +- if (v_pc >= 2147483648u) { +- v_pc = ((uint32_t)(0u - v_pc)); +- } +- if ((v_pa <= v_pb) && (v_pa <= v_pc)) { +- } else if (v_pb <= v_pc) { +- v_fa = v_fb; +- } else { +- v_fa = v_fc; +- } +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa)))); +- v_i += 1u; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func png.decoder.filter_4_distance_3_fallback ++// -------- func qoi.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint32_t v_fa0 = 0; +- uint32_t v_fa1 = 0; +- uint32_t v_fa2 = 0; +- uint32_t v_fb0 = 0; +- uint32_t v_fb1 = 0; +- uint32_t v_fb2 = 0; +- uint32_t v_fc0 = 0; +- uint32_t v_fc1 = 0; +- uint32_t v_fc2 = 0; +- uint32_t v_pp0 = 0; +- uint32_t v_pp1 = 0; +- uint32_t v_pp2 = 0; +- uint32_t v_pa0 = 0; +- uint32_t v_pa1 = 0; +- uint32_t v_pa2 = 0; +- uint32_t v_pb0 = 0; +- uint32_t v_pb1 = 0; +- uint32_t v_pb2 = 0; +- uint32_t v_pc0 = 0; +- uint32_t v_pc1 = 0; +- uint32_t v_pc2 = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end0_curr) { +- v_fb0 = ((uint32_t)(v_prev.ptr[0u])); +- v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); +- v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); +- if (v_pa0 >= 2147483648u) { +- v_pa0 = ((uint32_t)(0u - v_pa0)); +- } +- v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); +- if (v_pb0 >= 2147483648u) { +- v_pb0 = ((uint32_t)(0u - v_pb0)); +- } +- v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); +- if (v_pc0 >= 2147483648u) { +- v_pc0 = ((uint32_t)(0u - v_pc0)); +- } +- if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { +- } else if (v_pb0 <= v_pc0) { +- v_fa0 = v_fb0; +- } else { +- v_fa0 = v_fc0; +- } +- v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); +- v_fa0 = ((uint32_t)(v_curr.ptr[0u])); +- v_fc0 = v_fb0; +- v_fb1 = ((uint32_t)(v_prev.ptr[1u])); +- v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); +- v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); +- if (v_pa1 >= 2147483648u) { +- v_pa1 = ((uint32_t)(0u - v_pa1)); +- } +- v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); +- if (v_pb1 >= 2147483648u) { +- v_pb1 = ((uint32_t)(0u - v_pb1)); +- } +- v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); +- if (v_pc1 >= 2147483648u) { +- v_pc1 = ((uint32_t)(0u - v_pc1)); +- } +- if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { +- } else if (v_pb1 <= v_pc1) { +- v_fa1 = v_fb1; +- } else { +- v_fa1 = v_fc1; +- } +- v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); +- v_fa1 = ((uint32_t)(v_curr.ptr[1u])); +- v_fc1 = v_fb1; +- v_fb2 = ((uint32_t)(v_prev.ptr[2u])); +- v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); +- v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); +- if (v_pa2 >= 2147483648u) { +- v_pa2 = ((uint32_t)(0u - v_pa2)); +- } +- v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); +- if (v_pb2 >= 2147483648u) { +- v_pb2 = ((uint32_t)(0u - v_pb2)); +- } +- v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); +- if (v_pc2 >= 2147483648u) { +- v_pc2 = ((uint32_t)(0u - v_pc2)); ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; + } +- if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { +- } else if (v_pb2 <= v_pc2) { +- v_fa2 = v_fb2; +- } else { +- v_fa2 = v_fc2; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); ++ goto exit; + } +- v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); +- v_fa2 = ((uint32_t)(v_curr.ptr[2u])); +- v_fc2 = v_fb2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- v_curr.len = 0; +- v_prev.len = 0; ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func png.decoder.filter_4_distance_4_fallback ++// -------- func qoi.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint32_t v_fa0 = 0; +- uint32_t v_fa1 = 0; +- uint32_t v_fa2 = 0; +- uint32_t v_fa3 = 0; +- uint32_t v_fb0 = 0; +- uint32_t v_fb1 = 0; +- uint32_t v_fb2 = 0; +- uint32_t v_fb3 = 0; +- uint32_t v_fc0 = 0; +- uint32_t v_fc1 = 0; +- uint32_t v_fc2 = 0; +- uint32_t v_fc3 = 0; +- uint32_t v_pp0 = 0; +- uint32_t v_pp1 = 0; +- uint32_t v_pp2 = 0; +- uint32_t v_pp3 = 0; +- uint32_t v_pa0 = 0; +- uint32_t v_pa1 = 0; +- uint32_t v_pa2 = 0; +- uint32_t v_pa3 = 0; +- uint32_t v_pb0 = 0; +- uint32_t v_pb1 = 0; +- uint32_t v_pb2 = 0; +- uint32_t v_pb3 = 0; +- uint32_t v_pc0 = 0; +- uint32_t v_pc1 = 0; +- uint32_t v_pc2 = 0; +- uint32_t v_pc3 = 0; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fb0 = ((uint32_t)(v_prev.ptr[0u])); +- v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); +- v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); +- if (v_pa0 >= 2147483648u) { +- v_pa0 = ((uint32_t)(0u - v_pa0)); +- } +- v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); +- if (v_pb0 >= 2147483648u) { +- v_pb0 = ((uint32_t)(0u - v_pb0)); +- } +- v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); +- if (v_pc0 >= 2147483648u) { +- v_pc0 = ((uint32_t)(0u - v_pc0)); +- } +- if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { +- } else if (v_pb0 <= v_pc0) { +- v_fa0 = v_fb0; +- } else { +- v_fa0 = v_fc0; +- } +- v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); +- v_fa0 = ((uint32_t)(v_curr.ptr[0u])); +- v_fc0 = v_fb0; +- v_fb1 = ((uint32_t)(v_prev.ptr[1u])); +- v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); +- v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); +- if (v_pa1 >= 2147483648u) { +- v_pa1 = ((uint32_t)(0u - v_pa1)); +- } +- v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); +- if (v_pb1 >= 2147483648u) { +- v_pb1 = ((uint32_t)(0u - v_pb1)); +- } +- v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); +- if (v_pc1 >= 2147483648u) { +- v_pc1 = ((uint32_t)(0u - v_pc1)); +- } +- if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { +- } else if (v_pb1 <= v_pc1) { +- v_fa1 = v_fb1; ++ uint32_t v_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa1 = v_fc1; +- } +- v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); +- v_fa1 = ((uint32_t)(v_curr.ptr[1u])); +- v_fc1 = v_fb1; +- v_fb2 = ((uint32_t)(v_prev.ptr[2u])); +- v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); +- v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); +- if (v_pa2 >= 2147483648u) { +- v_pa2 = ((uint32_t)(0u - v_pa2)); +- } +- v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); +- if (v_pb2 >= 2147483648u) { +- v_pb2 = ((uint32_t)(0u - v_pb2)); +- } +- v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); +- if (v_pc2 >= 2147483648u) { +- v_pc2 = ((uint32_t)(0u - v_pc2)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } + } +- if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { +- } else if (v_pb2 <= v_pc2) { +- v_fa2 = v_fb2; ++ v_a = t_0; ++ } ++ if (v_a != 1718185841u) { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa2 = v_fc2; +- } +- v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); +- v_fa2 = ((uint32_t)(v_curr.ptr[2u])); +- v_fc2 = v_fb2; +- v_fb3 = ((uint32_t)(v_prev.ptr[3u])); +- v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3)); +- v_pa3 = ((uint32_t)(v_pp3 - v_fa3)); +- if (v_pa3 >= 2147483648u) { +- v_pa3 = ((uint32_t)(0u - v_pa3)); +- } +- v_pb3 = ((uint32_t)(v_pp3 - v_fb3)); +- if (v_pb3 >= 2147483648u) { +- v_pb3 = ((uint32_t)(0u - v_pb3)); +- } +- v_pc3 = ((uint32_t)(v_pp3 - v_fc3)); +- if (v_pc3 >= 2147483648u) { +- v_pc3 = ((uint32_t)(0u - v_pc3)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } + } +- if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) { +- } else if (v_pb3 <= v_pc3) { +- v_fa3 = v_fb3; ++ v_a = t_1; ++ } ++ if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa3 = v_fc3; ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } + } +- v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3)))); +- v_fa3 = ((uint32_t)(v_curr.ptr[3u])); +- v_fc3 = v_fb3; +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ v_a = t_2; + } +- v_curr.len = 0; +- v_prev.len = 0; +- } +- return wuffs_base__make_empty_struct(); +-} ++ if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_3 = *iop_a_src++; ++ v_a = t_3; ++ } ++ if (v_a == 3u) { ++ self->private_impl.f_pixfmt = 2415954056u; ++ } else if (v_a == 4u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } else { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_header); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src++; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ 14u, ++ (self->private_impl.f_pixfmt == 2415954056u)); ++ } ++ self->private_impl.f_call_sequence = 32u; + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_1_distance_4_x86_sse42 ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_empty_struct(); ++ ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_3_distance_4_x86_sse42 ++// -------- func qoi.decoder.decode_frame_config + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_k128 = {0}; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- if (((uint64_t)(a_prev.len)) == 0u) { +- v_k128 = _mm_set1_epi8((int8_t)(254u)); +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 0; +- } +- } else { +- v_k128 = _mm_set1_epi8((int8_t)(1u)); +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; + } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); ++ goto exit; + } +- v_curr.len = 0; +- v_prev.len = 0; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_4_distance_3_x86_sse42 ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_c128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_pa128 = {0}; +- __m128i v_pb128 = {0}; +- __m128i v_pc128 = {0}; +- __m128i v_smallest128 = {0}; +- __m128i v_z128 = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end2_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- return wuffs_base__make_empty_struct(); ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_4_distance_4_x86_sse42 ++// -------- func qoi.decoder.do_decode_frame_config + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_c128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_pa128 = {0}; +- __m128i v_pb128 = {0}; +- __m128i v_pc128 = {0}; +- __m128i v_smallest128 = {0}; +- __m128i v_z128 = {0}; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_qoi__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_curr.len = 0; +- v_prev.len = 0; +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 +- +-// -------- func png.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__get_quirk( +- const wuffs_png__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ 14u, ++ 0u, ++ (self->private_impl.f_pixfmt == 2415954056u), ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- return 0u; +-} + +-// -------- func png.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__set_quirk( +- wuffs_png__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value); +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func png.decoder.decode_image_config ++// -------- func qoi.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_qoi__decoder__decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -54464,12 +67805,12 @@ wuffs_png__decoder__decode_image_config( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_src) { ++ if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -54478,17 +67819,22 @@ wuffs_png__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); + goto exit; + } + status = v_status; +@@ -54496,14 +67842,14 @@ wuffs_png__decoder__decode_image_config( + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: +@@ -54513,21 +67859,21 @@ wuffs_png__decoder__decode_image_config( + return status; + } + +-// -------- func png.decoder.do_decode_image_config ++// -------- func qoi.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_qoi__decoder__do_decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_magic = 0; +- uint64_t v_mark = 0; +- uint32_t v_checksum_have = 0; +- uint32_t v_checksum_want = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint64_t v_c64 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -54540,281 +67886,332 @@ wuffs_png__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_checksum_have = self->private_data.s_do_decode_image_config[0].v_checksum_have; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if ( ! self->private_impl.f_seen_ihdr) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { +- t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); +- iop_a_src += 8; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 56) { +- t_0 = ((uint64_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_magic = t_0; ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (v_magic != 727905341920923785u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_qoi__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { +- t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); +- iop_a_src += 8; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 56) { +- t_1 = ((uint64_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- v_magic = t_1; ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ self->private_data.f_pixel[0u] = 0u; ++ self->private_data.f_pixel[1u] = 0u; ++ self->private_data.f_pixel[2u] = 0u; ++ self->private_data.f_pixel[3u] = 255u; ++ wuffs_private_impl__bulk_memset(&self->private_data.f_cache[0], 256u, 0u); ++ self->private_impl.f_remaining_pixels_times_4 = (((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(self->private_impl.f_height)) * 4u); ++ while (self->private_impl.f_remaining_pixels_times_4 > 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (v_magic != 5927942488114331648u) { +- if (v_magic == 5278895250759221248u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_qoi__decoder__from_src_to_buffer(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_remaining_pixels_times_4 < ((uint64_t)(self->private_impl.f_buffer_index))) { ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ goto exit; ++ } ++ self->private_impl.f_remaining_pixels_times_4 -= ((uint64_t)(self->private_impl.f_buffer_index)); ++ v_status = wuffs_qoi__decoder__from_buffer_to_dst(self, a_dst); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ goto ok; + } +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 72u; +- self->private_impl.f_chunk_type_array[2u] = 68u; +- self->private_impl.f_chunk_type_array[3u] = 82u; +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- while (true) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src); +- v_status = t_2; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 56) { ++ t_0 = ((uint64_t)(*scratch >> 0)); ++ break; + } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); + } +- if ( ! self->private_impl.f_ignore_checksum) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } ++ v_c64 = t_0; ++ } ++ if (v_c64 != 1u) { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_footer); ++ goto exit; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func qoi.decoder.from_src_to_buffer ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_src_to_buffer( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_dg = 0; ++ uint32_t v_bi = 0; ++ uint32_t v_bj = 0; ++ uint32_t v_bk = 0; ++ uint32_t v_ci = 0; ++ uint32_t v_hash4 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_from_src_to_buffer; ++ if (coro_susp_point) { ++ v_dg = self->private_data.s_from_src_to_buffer.v_dg; ++ v_bi = self->private_data.s_from_src_to_buffer.v_bi; ++ v_bk = self->private_data.s_from_src_to_buffer.v_bk; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_bk = 7936u; ++ if (self->private_impl.f_remaining_pixels_times_4 < 7936u) { ++ v_bk = ((uint32_t)(self->private_impl.f_remaining_pixels_times_4)); ++ } ++ while (v_bi < v_bk) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_checksum_want = t_3; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- self->private_impl.f_seen_ihdr = true; +- } else if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- continue; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) { +- break; ++ if (v_c8 == 254u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_data.f_pixel[2u] = t_1; + } +- self->private_impl.f_seen_idat = true; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_data.f_pixel[1u] = t_2; + } +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- iop_a_src += 8u; +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { +- self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u))); +- self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u))); +- self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u))); +- self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u))); +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- while (true) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); +- v_status = t_4; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint8_t t_3 = *iop_a_src++; ++ self->private_data.f_pixel[0u] = t_3; ++ } ++ } else if (v_c8 == 255u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ self->private_data.f_pixel[2u] = t_4; + } +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ self->private_data.f_pixel[1u] = t_5; + } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ self->private_data.f_pixel[0u] = t_6; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_7 = *iop_a_src++; ++ self->private_data.f_pixel[3u] = t_7; + } +- v_checksum_want = t_5; +- } +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- if ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte) { +- status = wuffs_base__make_status(wuffs_png__error__missing_palette); +- goto exit; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position; +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_dst_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_first_config_io_position, +- ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns)); +- } +- if ( ! self->private_impl.f_seen_actl) { +- self->private_impl.f_num_animation_frames_value = 1u; +- self->private_impl.f_first_rect_x0 = 0u; +- self->private_impl.f_first_rect_y0 = 0u; +- self->private_impl.f_first_rect_x1 = self->private_impl.f_width; +- self->private_impl.f_first_rect_y1 = self->private_impl.f_height; +- self->private_impl.f_first_duration = 0u; +- self->private_impl.f_first_disposal = 0u; +- self->private_impl.f_first_overwrite_instead_of_blend = false; +- } +- self->private_impl.f_call_sequence = 32u; ++ } else if (((uint8_t)(v_c8 >> 6u)) == 0u) { ++ v_ci = (4u * ((uint32_t)(((uint8_t)(v_c8 & 63u))))); ++ self->private_data.f_pixel[0u] = self->private_data.f_cache[(v_ci + 0u)]; ++ self->private_data.f_pixel[1u] = self->private_data.f_cache[(v_ci + 1u)]; ++ self->private_data.f_pixel[2u] = self->private_data.f_cache[(v_ci + 2u)]; ++ self->private_data.f_pixel[3u] = self->private_data.f_cache[(v_ci + 3u)]; ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ continue; ++ } else if (((uint8_t)(v_c8 >> 6u)) == 1u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 4u)) & 3u)) + 254u)); ++ self->private_data.f_pixel[1u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 2u)) & 3u)) + 254u)); ++ self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 0u)) & 3u)) + 254u)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (((uint8_t)(v_c8 >> 6u)) == 2u) { ++ v_dg = ((uint8_t)(((uint8_t)(v_c8 & 63u)) + 224u)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 4u)))))); ++ self->private_data.f_pixel[1u] += v_dg; ++ self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 0u)))))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ v_bj = (v_bi + (4u * (63u & (1u + ((uint32_t)(v_c8)))))); ++ while (v_bi < v_bj) { ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ } ++ continue; ++ } ++ v_hash4 = (4u * (63u & ((((uint32_t)(self->private_data.f_pixel[2u])) * 3u) + ++ (((uint32_t)(self->private_data.f_pixel[1u])) * 5u) + ++ (((uint32_t)(self->private_data.f_pixel[0u])) * 7u) + ++ (((uint32_t)(self->private_data.f_pixel[3u])) * 11u)))); ++ self->private_data.f_cache[(v_hash4 + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_cache[(v_hash4 + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_cache[(v_hash4 + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_cache[(v_hash4 + 3u)] = self->private_data.f_pixel[3u]; ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ } ++ self->private_impl.f_buffer_index = v_bi; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_from_src_to_buffer = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_checksum_have = v_checksum_have; ++ self->private_impl.p_from_src_to_buffer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_from_src_to_buffer.v_dg = v_dg; ++ self->private_data.s_from_src_to_buffer.v_bi = v_bi; ++ self->private_data.s_from_src_to_buffer.v_bk = v_bk; + + goto exit; + exit: +@@ -54825,1068 +68222,1113 @@ wuffs_png__decoder__do_decode_image_config( + return status; + } + +-// -------- func png.decoder.decode_ihdr ++// -------- func qoi.decoder.from_buffer_to_dst + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_ihdr( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_a32 = 0; +- uint8_t v_a8 = 0; ++wuffs_qoi__decoder__from_buffer_to_dst( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint32_t v_bi = 0; ++ uint32_t v_rem_x = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_src = {0}; ++ uint32_t v_src_length = 0; ++ uint64_t v_i = 0; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_ihdr[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_ihdr[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_a32 = t_0; +- } +- if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } else if (v_a32 > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_a32; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_ihdr[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_a32 = t_1; +- } +- if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } else if (v_a32 > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_a32; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_a8 = t_2; +- } +- if (v_a8 > 16u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } +- self->private_impl.f_depth = v_a8; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_a8 = t_3; +- } +- if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } +- self->private_impl.f_color_type = v_a8; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_a8 = t_4; +- } +- if (v_a8 != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (v_bi < self->private_impl.f_buffer_index) { ++ if (self->private_impl.f_width <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; + } +- uint8_t t_5 = *iop_a_src++; +- v_a8 = t_5; +- } +- if (v_a8 != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_rem_x = self->private_impl.f_width; ++ } else { ++ v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x); + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_a8 = t_6; ++ v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_bi, self->private_impl.f_buffer_index); ++ if (((uint64_t)((4u * v_rem_x))) < ((uint64_t)(v_src.len))) { ++ v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((4u * v_rem_x)))); + } +- if (v_a8 == 0u) { +- self->private_impl.f_interlace_pass = 0u; +- } else if (v_a8 == 1u) { +- self->private_impl.f_interlace_pass = 1u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_src_length = ((uint32_t)(((uint64_t)(v_src.len)))); ++ v_bi += v_src_length; ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); + } +- self->private_impl.f_filter_distance = 0u; +- wuffs_png__decoder__assign_filter_distance(self); +- if (self->private_impl.f_filter_distance == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ self->private_impl.f_dst_x += (v_src_length / 4u); ++ if (v_i < ((uint64_t)(v_dst.len))) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), wuffs_base__pixel_buffer__palette(a_dst), v_src); + } +- self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1u + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width))); +- wuffs_png__decoder__choose_filter_implementations(self); ++ } ++ return wuffs_base__make_status(NULL); ++} + +- goto ok; +- ok: +- self->private_impl.p_decode_ihdr[0] = 0; +- goto exit; ++// -------- func qoi.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_qoi__decoder__frame_dirty_rect( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_ihdr[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func qoi.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_qoi__decoder__num_animation_loops( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func qoi.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__num_decoded_frame_configs( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} + ++// -------- func qoi.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__num_decoded_frames( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func qoi.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__restart_frame( ++ wuffs_qoi__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != 14u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func qoi.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_qoi__decoder__set_report_metadata( ++ wuffs_qoi__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func qoi.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__tell_me_more( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.assign_filter_distance ++// -------- func qoi.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_qoi__decoder__workbuf_len( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) ++ ++// ---------------- Status Codes Implementations ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_SHA256__INITIAL_SHA256_H[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1779033703u, 3144134277u, 1013904242u, 2773480762u, 1359893119u, 2600822924u, 528734635u, 1541459225u, ++}; ++ ++static const uint32_t ++WUFFS_SHA256__K[64] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1116352408u, 1899447441u, 3049323471u, 3921009573u, 961987163u, 1508970993u, 2453635748u, 2870763221u, ++ 3624381080u, 310598401u, 607225278u, 1426881987u, 1925078388u, 2162078206u, 2614888103u, 3248222580u, ++ 3835390401u, 4022224774u, 264347078u, 604807628u, 770255983u, 1249150122u, 1555081692u, 1996064986u, ++ 2554220882u, 2821834349u, 2952996808u, 3210313671u, 3336571891u, 3584528711u, 113926993u, 338241895u, ++ 666307205u, 773529912u, 1294757372u, 1396182291u, 1695183700u, 1986661051u, 2177026350u, 2456956037u, ++ 2730485921u, 2820302411u, 3259730800u, 3345764771u, 3516065817u, 3600352804u, 4094571909u, 275423344u, ++ 430227734u, 506948616u, 659060556u, 883997877u, 958139571u, 1322822218u, 1537002063u, 1747873779u, ++ 1955562222u, 2024104815u, 2227730452u, 2361852424u, 2428436474u, 2756734187u, 3204031479u, 3329325298u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_png__decoder__assign_filter_distance( +- wuffs_png__decoder* self) { +- if (self->private_impl.f_depth < 8u) { +- if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) { +- return wuffs_base__make_empty_struct(); +- } else if (self->private_impl.f_color_type == 0u) { +- self->private_impl.f_dst_pixfmt = 536870920u; +- self->private_impl.f_src_pixfmt = 536870920u; +- } else if (self->private_impl.f_color_type == 3u) { +- self->private_impl.f_dst_pixfmt = 2198077448u; +- self->private_impl.f_src_pixfmt = 2198077448u; ++wuffs_sha256__hasher__up( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++// ---------------- VTables ++ ++const wuffs_base__hasher_bitvec256__func_ptrs ++wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256 = { ++ (wuffs_base__bitvec256(*)(const void*))(&wuffs_sha256__hasher__checksum_bitvec256), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_sha256__hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_sha256__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_sha256__hasher__update), ++ (wuffs_base__bitvec256(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_sha256__hasher__update_bitvec256), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_sha256__hasher__initialize( ++ wuffs_sha256__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { +- return wuffs_base__make_empty_struct(); ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- self->private_impl.f_filter_distance = 1u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else if (self->private_impl.f_color_type == 0u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 536870920u; +- self->private_impl.f_src_pixfmt = 536870920u; +- self->private_impl.f_filter_distance = 1u; +- } else if (self->private_impl.f_depth == 16u) { +- if (self->private_impl.f_interlace_pass == 0u) { +- self->private_impl.f_dst_pixfmt = 536870923u; +- self->private_impl.f_src_pixfmt = 537919499u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.vtable_name = ++ wuffs_base__hasher_bitvec256__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.function_pointers = ++ (const void*)(&wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_sha256__hasher* ++wuffs_sha256__hasher__alloc(void) { ++ wuffs_sha256__hasher* x = ++ (wuffs_sha256__hasher*)(calloc(1, sizeof(wuffs_sha256__hasher))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_sha256__hasher__initialize( ++ x, sizeof(wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_sha256__hasher(void) { ++ return sizeof(wuffs_sha256__hasher); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func sha256.hasher.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_sha256__hasher__get_quirk( ++ const wuffs_sha256__hasher* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func sha256.hasher.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_sha256__hasher__set_quirk( ++ wuffs_sha256__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func sha256.hasher.update ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_sha256__hasher__update( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ uint64_t v_new_lmu = 0; ++ ++ if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { ++ self->private_impl.f_h0 = WUFFS_SHA256__INITIAL_SHA256_H[0u]; ++ self->private_impl.f_h1 = WUFFS_SHA256__INITIAL_SHA256_H[1u]; ++ self->private_impl.f_h2 = WUFFS_SHA256__INITIAL_SHA256_H[2u]; ++ self->private_impl.f_h3 = WUFFS_SHA256__INITIAL_SHA256_H[3u]; ++ self->private_impl.f_h4 = WUFFS_SHA256__INITIAL_SHA256_H[4u]; ++ self->private_impl.f_h5 = WUFFS_SHA256__INITIAL_SHA256_H[5u]; ++ self->private_impl.f_h6 = WUFFS_SHA256__INITIAL_SHA256_H[6u]; ++ self->private_impl.f_h7 = WUFFS_SHA256__INITIAL_SHA256_H[7u]; ++ } ++ v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); ++ self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); ++ self->private_impl.f_length_modulo_u64 = v_new_lmu; ++ if (self->private_impl.f_buf_len != 0u) { ++ while (self->private_impl.f_buf_len < 64u) { ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.f_filter_distance = 2u; +- } +- } else if (self->private_impl.f_color_type == 2u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2147485832u; +- self->private_impl.f_src_pixfmt = 2684356744u; +- self->private_impl.f_filter_distance = 3u; +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 6u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } +- } else if (self->private_impl.f_color_type == 3u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2198077448u; +- self->private_impl.f_src_pixfmt = 2198077448u; +- self->private_impl.f_filter_distance = 1u; +- } +- } else if (self->private_impl.f_color_type == 4u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- self->private_impl.f_filter_distance = 2u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 4u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } +- } else if (self->private_impl.f_color_type == 6u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2701166728u; +- self->private_impl.f_filter_distance = 4u; +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 8u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ self->private_impl.f_buf_len += 1u; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } ++ self->private_impl.f_buf_len = 0u; ++ wuffs_sha256__hasher__up(self, wuffs_base__make_slice_u8(self->private_impl.f_buf_data, 64)); + } ++ wuffs_sha256__hasher__up(self, a_x); + return wuffs_base__make_empty_struct(); + } + +-// -------- func png.decoder.calculate_bytes_per_row ++// -------- func sha256.hasher.update_bitvec256 + + WUFFS_BASE__GENERATED_C_CODE +-static uint64_t +-wuffs_png__decoder__calculate_bytes_per_row( +- const wuffs_png__decoder* self, +- uint32_t a_width) { +- uint64_t v_bytes_per_channel = 0; +- +- if (self->private_impl.f_depth == 1u) { +- return ((uint64_t)(((a_width + 7u) / 8u))); +- } else if (self->private_impl.f_depth == 2u) { +- return ((uint64_t)(((a_width + 3u) / 4u))); +- } else if (self->private_impl.f_depth == 4u) { +- return ((uint64_t)(((a_width + 1u) / 2u))); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__update_bitvec256( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } +- v_bytes_per_channel = ((uint64_t)((self->private_impl.f_depth >> 3u))); +- return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type]))); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ ++ wuffs_sha256__hasher__update(self, a_x); ++ return wuffs_sha256__hasher__checksum_bitvec256(self); + } + +-// -------- func png.decoder.choose_filter_implementations ++// -------- func sha256.hasher.up + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_png__decoder__choose_filter_implementations( +- wuffs_png__decoder* self) { +- if (self->private_impl.f_filter_distance == 3u) { +- self->private_impl.choosy_filter_1 = ( +- &wuffs_png__decoder__filter_1_distance_3_fallback); +- self->private_impl.choosy_filter_3 = ( +- &wuffs_png__decoder__filter_3_distance_3_fallback); +- self->private_impl.choosy_filter_4 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_4_distance_3_fallback); +- } else if (self->private_impl.f_filter_distance == 4u) { +- self->private_impl.choosy_filter_1 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_1_distance_4_fallback); +- self->private_impl.choosy_filter_3 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_3_distance_4_fallback); +- self->private_impl.choosy_filter_4 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_4_distance_4_fallback); ++wuffs_sha256__hasher__up( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_w[64] = {0}; ++ uint32_t v_w2 = 0; ++ uint32_t v_w15 = 0; ++ uint32_t v_s0 = 0; ++ uint32_t v_s1 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_a = 0; ++ uint32_t v_b = 0; ++ uint32_t v_c = 0; ++ uint32_t v_d = 0; ++ uint32_t v_e = 0; ++ uint32_t v_f = 0; ++ uint32_t v_g = 0; ++ uint32_t v_h = 0; ++ uint32_t v_i = 0; ++ uint32_t v_buf_len = 0; ++ ++ v_a = self->private_impl.f_h0; ++ v_b = self->private_impl.f_h1; ++ v_c = self->private_impl.f_h2; ++ v_d = self->private_impl.f_h3; ++ v_e = self->private_impl.f_h4; ++ v_f = self->private_impl.f_h5; ++ v_g = self->private_impl.f_h6; ++ v_h = self->private_impl.f_h7; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 64; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64)); ++ while (v_p.ptr < i_end0_p) { ++ v_w[0u] = ((((uint32_t)(v_p.ptr[0u])) << 24u) | ++ (((uint32_t)(v_p.ptr[1u])) << 16u) | ++ (((uint32_t)(v_p.ptr[2u])) << 8u) | ++ ((uint32_t)(v_p.ptr[3u]))); ++ v_w[1u] = ((((uint32_t)(v_p.ptr[4u])) << 24u) | ++ (((uint32_t)(v_p.ptr[5u])) << 16u) | ++ (((uint32_t)(v_p.ptr[6u])) << 8u) | ++ ((uint32_t)(v_p.ptr[7u]))); ++ v_w[2u] = ((((uint32_t)(v_p.ptr[8u])) << 24u) | ++ (((uint32_t)(v_p.ptr[9u])) << 16u) | ++ (((uint32_t)(v_p.ptr[10u])) << 8u) | ++ ((uint32_t)(v_p.ptr[11u]))); ++ v_w[3u] = ((((uint32_t)(v_p.ptr[12u])) << 24u) | ++ (((uint32_t)(v_p.ptr[13u])) << 16u) | ++ (((uint32_t)(v_p.ptr[14u])) << 8u) | ++ ((uint32_t)(v_p.ptr[15u]))); ++ v_w[4u] = ((((uint32_t)(v_p.ptr[16u])) << 24u) | ++ (((uint32_t)(v_p.ptr[17u])) << 16u) | ++ (((uint32_t)(v_p.ptr[18u])) << 8u) | ++ ((uint32_t)(v_p.ptr[19u]))); ++ v_w[5u] = ((((uint32_t)(v_p.ptr[20u])) << 24u) | ++ (((uint32_t)(v_p.ptr[21u])) << 16u) | ++ (((uint32_t)(v_p.ptr[22u])) << 8u) | ++ ((uint32_t)(v_p.ptr[23u]))); ++ v_w[6u] = ((((uint32_t)(v_p.ptr[24u])) << 24u) | ++ (((uint32_t)(v_p.ptr[25u])) << 16u) | ++ (((uint32_t)(v_p.ptr[26u])) << 8u) | ++ ((uint32_t)(v_p.ptr[27u]))); ++ v_w[7u] = ((((uint32_t)(v_p.ptr[28u])) << 24u) | ++ (((uint32_t)(v_p.ptr[29u])) << 16u) | ++ (((uint32_t)(v_p.ptr[30u])) << 8u) | ++ ((uint32_t)(v_p.ptr[31u]))); ++ v_w[8u] = ((((uint32_t)(v_p.ptr[32u])) << 24u) | ++ (((uint32_t)(v_p.ptr[33u])) << 16u) | ++ (((uint32_t)(v_p.ptr[34u])) << 8u) | ++ ((uint32_t)(v_p.ptr[35u]))); ++ v_w[9u] = ((((uint32_t)(v_p.ptr[36u])) << 24u) | ++ (((uint32_t)(v_p.ptr[37u])) << 16u) | ++ (((uint32_t)(v_p.ptr[38u])) << 8u) | ++ ((uint32_t)(v_p.ptr[39u]))); ++ v_w[10u] = ((((uint32_t)(v_p.ptr[40u])) << 24u) | ++ (((uint32_t)(v_p.ptr[41u])) << 16u) | ++ (((uint32_t)(v_p.ptr[42u])) << 8u) | ++ ((uint32_t)(v_p.ptr[43u]))); ++ v_w[11u] = ((((uint32_t)(v_p.ptr[44u])) << 24u) | ++ (((uint32_t)(v_p.ptr[45u])) << 16u) | ++ (((uint32_t)(v_p.ptr[46u])) << 8u) | ++ ((uint32_t)(v_p.ptr[47u]))); ++ v_w[12u] = ((((uint32_t)(v_p.ptr[48u])) << 24u) | ++ (((uint32_t)(v_p.ptr[49u])) << 16u) | ++ (((uint32_t)(v_p.ptr[50u])) << 8u) | ++ ((uint32_t)(v_p.ptr[51u]))); ++ v_w[13u] = ((((uint32_t)(v_p.ptr[52u])) << 24u) | ++ (((uint32_t)(v_p.ptr[53u])) << 16u) | ++ (((uint32_t)(v_p.ptr[54u])) << 8u) | ++ ((uint32_t)(v_p.ptr[55u]))); ++ v_w[14u] = ((((uint32_t)(v_p.ptr[56u])) << 24u) | ++ (((uint32_t)(v_p.ptr[57u])) << 16u) | ++ (((uint32_t)(v_p.ptr[58u])) << 8u) | ++ ((uint32_t)(v_p.ptr[59u]))); ++ v_w[15u] = ((((uint32_t)(v_p.ptr[60u])) << 24u) | ++ (((uint32_t)(v_p.ptr[61u])) << 16u) | ++ (((uint32_t)(v_p.ptr[62u])) << 8u) | ++ ((uint32_t)(v_p.ptr[63u]))); ++ v_i = 16u; ++ while (v_i < 64u) { ++ v_w2 = v_w[(v_i - 2u)]; ++ v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u))); ++ v_w15 = v_w[(v_i - 15u)]; ++ v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u))); ++ v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)])); ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_t1 = v_h; ++ v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u))); ++ v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g)); ++ v_t1 += WUFFS_SHA256__K[v_i]; ++ v_t1 += v_w[v_i]; ++ v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u))); ++ v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c)); ++ v_h = v_g; ++ v_g = v_f; ++ v_f = v_e; ++ v_e = ((uint32_t)(v_d + v_t1)); ++ v_d = v_c; ++ v_c = v_b; ++ v_b = v_a; ++ v_a = ((uint32_t)(v_t1 + v_t2)); ++ v_i += 1u; ++ } ++ v_a += self->private_impl.f_h0; ++ self->private_impl.f_h0 = v_a; ++ v_b += self->private_impl.f_h1; ++ self->private_impl.f_h1 = v_b; ++ v_c += self->private_impl.f_h2; ++ self->private_impl.f_h2 = v_c; ++ v_d += self->private_impl.f_h3; ++ self->private_impl.f_h3 = v_d; ++ v_e += self->private_impl.f_h4; ++ self->private_impl.f_h4 = v_e; ++ v_f += self->private_impl.f_h5; ++ self->private_impl.f_h5 = v_f; ++ v_g += self->private_impl.f_h6; ++ self->private_impl.f_h6 = v_g; ++ v_h += self->private_impl.f_h7; ++ self->private_impl.f_h7 = v_h; ++ v_p.ptr += 64; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 63u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } ++ self->private_impl.f_buf_len = ((uint32_t)((((uint64_t)(a_x.len)) & 63u))); + return wuffs_base__make_empty_struct(); + } + +-// -------- func png.decoder.decode_other_chunk ++// -------- func sha256.hasher.checksum_bitvec256 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_other_chunk( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- bool a_framy) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__checksum_bitvec256( ++ const wuffs_sha256__hasher* self) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ uint32_t v_buf_len = 0; ++ uint8_t v_buf_data[64] = {0}; ++ uint64_t v_length_in_bits = 0; ++ uint32_t v_w[64] = {0}; ++ uint32_t v_w2 = 0; ++ uint32_t v_w15 = 0; ++ uint32_t v_s0 = 0; ++ uint32_t v_s1 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_h0 = 0; ++ uint32_t v_h1 = 0; ++ uint32_t v_h2 = 0; ++ uint32_t v_h3 = 0; ++ uint32_t v_h4 = 0; ++ uint32_t v_h5 = 0; ++ uint32_t v_h6 = 0; ++ uint32_t v_h7 = 0; ++ uint32_t v_a = 0; ++ uint32_t v_b = 0; ++ uint32_t v_c = 0; ++ uint32_t v_d = 0; ++ uint32_t v_e = 0; ++ uint32_t v_f = 0; ++ uint32_t v_g = 0; ++ uint32_t v_h = 0; ++ uint32_t v_i = 0; ++ bool v_final_block = false; + +- if ((self->private_impl.f_chunk_type == 1163152464u) && ! a_framy) { +- if (self->private_impl.f_seen_plte) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_color_type == 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__decode_plte(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) { +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_seen_plte = true; +- } else if ((self->private_impl.f_chunk_type & 32u) == 0u) { +- if (self->private_impl.f_chunk_type != 1413563465u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_buf_data[v_i] = self->private_impl.f_buf_data[v_i]; ++ v_i += 1u; ++ } ++ v_buf_len = (self->private_impl.f_buf_len & 63u); ++ if (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 128u; ++ v_buf_len += 1u; ++ while (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; + } +- if (self->private_impl.f_chunk_type == 1716082789u) { +- if (self->private_impl.f_report_metadata_exif) { +- if (self->private_impl.f_seen_exif) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_png__decoder__decode_exif(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_exif = true; +- } +- } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) { +- if (self->private_impl.f_report_metadata_kvp) { +- self->private_impl.f_metadata_flavor = 4u; +- self->private_impl.f_metadata_fourcc = 1263947851u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- } +- } else if ( ! a_framy) { +- if (self->private_impl.f_chunk_type == 1280598881u) { +- if (self->private_impl.f_seen_actl) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_png__decoder__decode_actl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_actl = true; +- } else if (self->private_impl.f_chunk_type == 1297238115u) { +- if (self->private_impl.f_report_metadata_chrm) { +- if (self->private_impl.f_seen_chrm) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_png__decoder__decode_chrm(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_chrm = true; +- } +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- if (self->private_impl.f_seen_fctl) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- status = wuffs_png__decoder__decode_fctl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_fctl = true; +- } else if (self->private_impl.f_chunk_type == 1095582055u) { +- if (self->private_impl.f_report_metadata_gama) { +- if (self->private_impl.f_seen_gama) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_png__decoder__decode_gama(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_gama = true; +- } +- } else if (self->private_impl.f_chunk_type == 1346585449u) { +- if (self->private_impl.f_report_metadata_iccp) { +- if (self->private_impl.f_seen_iccp) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_png__decoder__decode_iccp(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_iccp = true; +- } +- } else if (self->private_impl.f_chunk_type == 1111970419u) { +- if (self->private_impl.f_report_metadata_srgb) { +- if (self->private_impl.f_seen_srgb) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_png__decoder__decode_srgb(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_srgb = true; +- } +- } else if (self->private_impl.f_chunk_type == 1397641844u) { +- if (self->private_impl.f_seen_trns || (self->private_impl.f_color_type > 3u) || ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_png__decoder__decode_trns(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_trns = true; +- } ++ v_final_block = true; ++ } else { ++ v_buf_data[v_buf_len] = 128u; ++ v_buf_len += 1u; ++ while (v_buf_len < 64u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; ++ } ++ } ++ v_h0 = self->private_impl.f_h0; ++ v_a = v_h0; ++ v_h1 = self->private_impl.f_h1; ++ v_b = v_h1; ++ v_h2 = self->private_impl.f_h2; ++ v_c = v_h2; ++ v_h3 = self->private_impl.f_h3; ++ v_d = v_h3; ++ v_h4 = self->private_impl.f_h4; ++ v_e = v_h4; ++ v_h5 = self->private_impl.f_h5; ++ v_f = v_h5; ++ v_h6 = self->private_impl.f_h6; ++ v_g = v_h6; ++ v_h7 = self->private_impl.f_h7; ++ v_h = v_h7; ++ while (true) { ++ if (v_final_block) { ++ v_length_in_bits = ((uint64_t)(self->private_impl.f_length_modulo_u64 * 8u)); ++ v_buf_data[56u] = ((uint8_t)((v_length_in_bits >> 56u))); ++ v_buf_data[57u] = ((uint8_t)((v_length_in_bits >> 48u))); ++ v_buf_data[58u] = ((uint8_t)((v_length_in_bits >> 40u))); ++ v_buf_data[59u] = ((uint8_t)((v_length_in_bits >> 32u))); ++ v_buf_data[60u] = ((uint8_t)((v_length_in_bits >> 24u))); ++ v_buf_data[61u] = ((uint8_t)((v_length_in_bits >> 16u))); ++ v_buf_data[62u] = ((uint8_t)((v_length_in_bits >> 8u))); ++ v_buf_data[63u] = ((uint8_t)(v_length_in_bits)); ++ } ++ v_w[0u] = ((((uint32_t)(v_buf_data[0u])) << 24u) | ++ (((uint32_t)(v_buf_data[1u])) << 16u) | ++ (((uint32_t)(v_buf_data[2u])) << 8u) | ++ ((uint32_t)(v_buf_data[3u]))); ++ v_w[1u] = ((((uint32_t)(v_buf_data[4u])) << 24u) | ++ (((uint32_t)(v_buf_data[5u])) << 16u) | ++ (((uint32_t)(v_buf_data[6u])) << 8u) | ++ ((uint32_t)(v_buf_data[7u]))); ++ v_w[2u] = ((((uint32_t)(v_buf_data[8u])) << 24u) | ++ (((uint32_t)(v_buf_data[9u])) << 16u) | ++ (((uint32_t)(v_buf_data[10u])) << 8u) | ++ ((uint32_t)(v_buf_data[11u]))); ++ v_w[3u] = ((((uint32_t)(v_buf_data[12u])) << 24u) | ++ (((uint32_t)(v_buf_data[13u])) << 16u) | ++ (((uint32_t)(v_buf_data[14u])) << 8u) | ++ ((uint32_t)(v_buf_data[15u]))); ++ v_w[4u] = ((((uint32_t)(v_buf_data[16u])) << 24u) | ++ (((uint32_t)(v_buf_data[17u])) << 16u) | ++ (((uint32_t)(v_buf_data[18u])) << 8u) | ++ ((uint32_t)(v_buf_data[19u]))); ++ v_w[5u] = ((((uint32_t)(v_buf_data[20u])) << 24u) | ++ (((uint32_t)(v_buf_data[21u])) << 16u) | ++ (((uint32_t)(v_buf_data[22u])) << 8u) | ++ ((uint32_t)(v_buf_data[23u]))); ++ v_w[6u] = ((((uint32_t)(v_buf_data[24u])) << 24u) | ++ (((uint32_t)(v_buf_data[25u])) << 16u) | ++ (((uint32_t)(v_buf_data[26u])) << 8u) | ++ ((uint32_t)(v_buf_data[27u]))); ++ v_w[7u] = ((((uint32_t)(v_buf_data[28u])) << 24u) | ++ (((uint32_t)(v_buf_data[29u])) << 16u) | ++ (((uint32_t)(v_buf_data[30u])) << 8u) | ++ ((uint32_t)(v_buf_data[31u]))); ++ v_w[8u] = ((((uint32_t)(v_buf_data[32u])) << 24u) | ++ (((uint32_t)(v_buf_data[33u])) << 16u) | ++ (((uint32_t)(v_buf_data[34u])) << 8u) | ++ ((uint32_t)(v_buf_data[35u]))); ++ v_w[9u] = ((((uint32_t)(v_buf_data[36u])) << 24u) | ++ (((uint32_t)(v_buf_data[37u])) << 16u) | ++ (((uint32_t)(v_buf_data[38u])) << 8u) | ++ ((uint32_t)(v_buf_data[39u]))); ++ v_w[10u] = ((((uint32_t)(v_buf_data[40u])) << 24u) | ++ (((uint32_t)(v_buf_data[41u])) << 16u) | ++ (((uint32_t)(v_buf_data[42u])) << 8u) | ++ ((uint32_t)(v_buf_data[43u]))); ++ v_w[11u] = ((((uint32_t)(v_buf_data[44u])) << 24u) | ++ (((uint32_t)(v_buf_data[45u])) << 16u) | ++ (((uint32_t)(v_buf_data[46u])) << 8u) | ++ ((uint32_t)(v_buf_data[47u]))); ++ v_w[12u] = ((((uint32_t)(v_buf_data[48u])) << 24u) | ++ (((uint32_t)(v_buf_data[49u])) << 16u) | ++ (((uint32_t)(v_buf_data[50u])) << 8u) | ++ ((uint32_t)(v_buf_data[51u]))); ++ v_w[13u] = ((((uint32_t)(v_buf_data[52u])) << 24u) | ++ (((uint32_t)(v_buf_data[53u])) << 16u) | ++ (((uint32_t)(v_buf_data[54u])) << 8u) | ++ ((uint32_t)(v_buf_data[55u]))); ++ v_w[14u] = ((((uint32_t)(v_buf_data[56u])) << 24u) | ++ (((uint32_t)(v_buf_data[57u])) << 16u) | ++ (((uint32_t)(v_buf_data[58u])) << 8u) | ++ ((uint32_t)(v_buf_data[59u]))); ++ v_w[15u] = ((((uint32_t)(v_buf_data[60u])) << 24u) | ++ (((uint32_t)(v_buf_data[61u])) << 16u) | ++ (((uint32_t)(v_buf_data[62u])) << 8u) | ++ ((uint32_t)(v_buf_data[63u]))); ++ v_i = 16u; ++ while (v_i < 64u) { ++ v_w2 = v_w[(v_i - 2u)]; ++ v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u))); ++ v_w15 = v_w[(v_i - 15u)]; ++ v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u))); ++ v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)])); ++ v_i += 1u; + } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- self->private_data.s_decode_other_chunk[0].scratch = self->private_impl.f_chunk_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_decode_other_chunk[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_other_chunk[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_other_chunk[0].scratch; ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_t1 = v_h; ++ v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u))); ++ v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g)); ++ v_t1 += WUFFS_SHA256__K[v_i]; ++ v_t1 += v_w[v_i]; ++ v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u))); ++ v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c)); ++ v_h = v_g; ++ v_g = v_f; ++ v_f = v_e; ++ v_e = ((uint32_t)(v_d + v_t1)); ++ v_d = v_c; ++ v_c = v_b; ++ v_b = v_a; ++ v_a = ((uint32_t)(v_t1 + v_t2)); ++ v_i += 1u; ++ } ++ v_a += v_h0; ++ v_b += v_h1; ++ v_c += v_h2; ++ v_d += v_h3; ++ v_e += v_h4; ++ v_f += v_h5; ++ v_g += v_h6; ++ v_h += v_h7; ++ if (v_final_block) { ++ break; ++ } ++ v_final_block = true; ++ v_h0 = v_a; ++ v_h1 = v_b; ++ v_h2 = v_c; ++ v_h3 = v_d; ++ v_h4 = v_e; ++ v_h5 = v_f; ++ v_h6 = v_g; ++ v_h7 = v_h; ++ v_buf_len = 0u; ++ while (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_other_chunk[0] = 0; +- goto exit; + } ++ return wuffs_base__utility__make_bitvec256( ++ (((uint64_t)(v_h)) | (((uint64_t)(v_g)) << 32u)), ++ (((uint64_t)(v_f)) | (((uint64_t)(v_e)) << 32u)), ++ (((uint64_t)(v_d)) | (((uint64_t)(v_c)) << 32u)), ++ (((uint64_t)(v_b)) | (((uint64_t)(v_a)) << 32u))); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_other_chunk[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +- return status; +-} ++// ---------------- Status Codes Implementations + +-// -------- func png.decoder.decode_actl ++const char wuffs_tga__error__bad_header[] = "#tga: bad header"; ++const char wuffs_tga__error__bad_run_length_encoding[] = "#tga: bad run length encoding"; ++const char wuffs_tga__error__truncated_input[] = "#tga: truncated input"; ++const char wuffs_tga__error__unsupported_tga_file[] = "#tga: unsupported TGA file"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_actl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++wuffs_tga__decoder__do_decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_tga__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_tga__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_tga__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_tga__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_tga__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_tga__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_tga__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_tga__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_tga__decoder__initialize( ++ wuffs_tga__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_tga__decoder* ++wuffs_tga__decoder__alloc(void) { ++ wuffs_tga__decoder* x = ++ (wuffs_tga__decoder*)(calloc(1, sizeof(wuffs_tga__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_tga__decoder__initialize( ++ x, sizeof(wuffs_tga__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_actl[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++size_t ++sizeof__wuffs_tga__decoder(void) { ++ return sizeof(wuffs_tga__decoder); ++} + +- if (self->private_impl.f_chunk_length != 8u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_interlace_pass > 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_actl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- self->private_impl.f_num_animation_frames_value = t_0; +- } +- if (self->private_impl.f_num_animation_frames_value == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_actl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- self->private_impl.f_num_animation_loops_value = t_1; +- } ++// ---------------- Function Implementations + +- goto ok; +- ok: +- self->private_impl.p_decode_actl[0] = 0; +- goto exit; ++// -------- func tga.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__get_quirk( ++ const wuffs_tga__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_actl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ return 0u; ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++// -------- func tga.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__set_quirk( ++ wuffs_tga__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- return status; ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func png.decoder.decode_chrm ++// -------- func tga.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_chrm( +- wuffs_png__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_u = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_chrm[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 32u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1128813133u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_u = t_0; +- } +- self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_u = t_1; +- } +- self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint64_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_u = t_2; +- } +- self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u)); +- self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint64_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); +- } +- } +- v_u = t_3; +- } +- self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint64_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 24) { +- t_4 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); +- } +- } +- v_u = t_4; +- } +- self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- uint64_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); +- } +- } +- v_u = t_5; +- } +- self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u)); +- self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint64_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); +- if (num_bits_6 == 24) { +- t_6 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)); +- } ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; + } +- v_u = t_6; +- } +- self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- uint64_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7); +- if (num_bits_7 == 24) { +- t_7 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)); +- } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; + } +- v_u = t_7; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u); + +- goto ok; + ok: +- self->private_impl.p_decode_chrm[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_chrm[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func png.decoder.decode_exif +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_exif( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_metadata_flavor = 3u; +- self->private_impl.f_metadata_fourcc = 1163413830u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length))); +- self->private_impl.f_chunk_length = 0u; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +- goto ok; +- ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.decode_fctl ++// -------- func tga.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_fctl( +- wuffs_png__decoder* self, ++wuffs_tga__decoder__do_decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_x0 = 0; +- uint32_t v_y0 = 0; +- uint32_t v_x1 = 0; +- uint32_t v_y1 = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_c5 = 0; ++ uint32_t v_i = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -55899,309 +69341,577 @@ wuffs_png__decoder__decode_fctl( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_fctl[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + if (coro_susp_point) { +- v_x0 = self->private_data.s_decode_fctl[0].v_x0; +- v_x1 = self->private_data.s_decode_fctl[0].v_x1; +- v_y1 = self->private_data.s_decode_fctl[0].v_y1; ++ v_i = self->private_data.s_do_decode_image_config.v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 26u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } +- self->private_impl.f_chunk_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_x0 = t_0; ++ uint8_t t_0 = *iop_a_src++; ++ self->private_impl.f_header_id_length = t_0; + } +- if (v_x0 != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_impl.f_header_color_map_type = t_1; ++ } ++ if (self->private_impl.f_header_color_map_type > 1u) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } +- self->private_impl.f_next_animation_seq_num += 1u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_x1 = t_1; ++ uint8_t t_2 = *iop_a_src++; ++ self->private_impl.f_header_image_type = t_2; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_y1 = t_2; ++ if ((self->private_impl.f_header_image_type == 1u) || ++ (self->private_impl.f_header_image_type == 2u) || ++ (self->private_impl.f_header_image_type == 3u) || ++ (self->private_impl.f_header_image_type == 9u) || ++ (self->private_impl.f_header_image_type == 10u) || ++ (self->private_impl.f_header_image_type == 11u)) { ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint16_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint16_t)(*scratch)); + break; + } + num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; + } + } +- v_x0 = t_3; ++ self->private_impl.f_header_color_map_first_entry_index = t_3; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint16_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch >> 32)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint16_t)(*scratch)); + break; + } + num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } +- v_y0 = t_4; ++ self->private_impl.f_header_color_map_length = t_4; + } +- v_x1 += v_x0; +- v_y1 += v_y0; +- if ((v_x0 >= v_x1) || +- (v_x0 > self->private_impl.f_width) || +- (v_x1 > self->private_impl.f_width) || +- (v_y0 >= v_y1) || +- (v_y0 > self->private_impl.f_height) || +- (v_y1 > self->private_impl.f_height)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ self->private_impl.f_header_color_map_entry_size = t_5; + } +- self->private_impl.f_frame_rect_x0 = v_x0; +- self->private_impl.f_frame_rect_y0 = v_y0; +- self->private_impl.f_frame_rect_x1 = v_x1; +- self->private_impl.f_frame_rect_y1 = v_y1; ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } else if ((self->private_impl.f_header_color_map_entry_size != 15u) && ++ (self->private_impl.f_header_color_map_entry_size != 16u) && ++ (self->private_impl.f_header_color_map_entry_size != 24u) && ++ (self->private_impl.f_header_color_map_entry_size != 32u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; ++ } ++ } else { ++ if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length != 0u) || (self->private_impl.f_header_color_map_entry_size != 0u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_image_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- uint32_t t_5; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_6; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 8) { +- t_5 = ((uint32_t)(*scratch >> 48)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch)); + break; + } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)) << 56; + } + } +- v_x0 = t_5; ++ self->private_impl.f_width = t_6; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint32_t t_6; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_7; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch >> 48)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 8) { ++ t_7 = ((uint32_t)(*scratch)); + break; + } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)); ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; + } + } +- v_x1 = t_6; +- } +- if (v_x1 <= 0u) { +- self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u); +- } else { +- self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1))); ++ self->private_impl.f_height = t_7; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_7 = *iop_a_src++; +- v_x0 = t_7; ++ uint8_t t_8 = *iop_a_src++; ++ self->private_impl.f_header_pixel_depth = t_8; + } +- if (v_x0 == 0u) { +- self->private_impl.f_frame_disposal = 0u; +- } else if (v_x0 == 1u) { +- self->private_impl.f_frame_disposal = 1u; +- } else if (v_x0 == 2u) { +- self->private_impl.f_frame_disposal = 2u; +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if ((self->private_impl.f_header_pixel_depth != 1u) && ++ (self->private_impl.f_header_pixel_depth != 8u) && ++ (self->private_impl.f_header_pixel_depth != 15u) && ++ (self->private_impl.f_header_pixel_depth != 16u) && ++ (self->private_impl.f_header_pixel_depth != 24u) && ++ (self->private_impl.f_header_pixel_depth != 32u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } ++ if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 9u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 1u; ++ self->private_impl.f_src_bytes_per_pixel = 1u; ++ self->private_impl.f_src_pixfmt = 2164523016u; ++ self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15u) || (self->private_impl.f_header_color_map_entry_size == 24u)); ++ } else if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 10u) { ++ if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) { ++ self->private_impl.f_scratch_bytes_per_pixel = 4u; ++ self->private_impl.f_src_bytes_per_pixel = 0u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else if (self->private_impl.f_header_pixel_depth == 24u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 3u; ++ self->private_impl.f_src_bytes_per_pixel = 3u; ++ self->private_impl.f_src_pixfmt = 2147485832u; ++ self->private_impl.f_opaque = true; ++ } else if (self->private_impl.f_header_pixel_depth == 32u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 4u; ++ self->private_impl.f_src_bytes_per_pixel = 4u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ } else { ++ if (self->private_impl.f_header_pixel_depth == 8u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 1u; ++ self->private_impl.f_src_bytes_per_pixel = 1u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ self->private_impl.f_opaque = true; ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_8 = *iop_a_src++; +- v_x0 = t_8; +- } +- if (v_x0 == 0u) { +- self->private_impl.f_frame_overwrite_instead_of_blend = true; +- } else if (v_x0 == 1u) { +- self->private_impl.f_frame_overwrite_instead_of_blend = false; ++ uint8_t t_9 = *iop_a_src++; ++ self->private_impl.f_header_image_descriptor = t_9; ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_header_id_length)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) { ++ if (self->private_impl.f_header_color_map_entry_size == 24u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ uint32_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; ++ if (num_bits_10 == 16) { ++ t_10 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)) << 56; ++ } ++ } ++ v_c32 = t_10; ++ } ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ } else if (self->private_impl.f_header_color_map_entry_size == 32u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint32_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; ++ if (num_bits_11 == 24) { ++ t_11 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)) << 56; ++ } ++ } ++ v_c32 = t_11; ++ } ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c32 >> 24u))); ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ uint32_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; ++ if (num_bits_12 == 8) { ++ t_12 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)) << 56; ++ } ++ } ++ v_c32 = t_12; ++ } ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ } ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u; ++ v_i += 1u; ++ } ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_src_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_opaque); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func tga.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func tga.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_tga__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { +- self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0; +- self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0; +- self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1; +- self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1; +- self->private_impl.f_first_duration = self->private_impl.f_frame_duration; +- self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal; +- self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend; ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ self->private_impl.f_opaque, ++ false, ++ 4278190080u); + } ++ self->private_impl.f_call_sequence = 64u; + +- goto ok; + ok: +- self->private_impl.p_decode_fctl[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_fctl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_fctl[0].v_x0 = v_x0; +- self->private_data.s_decode_fctl[0].v_x1 = v_x1; +- self->private_data.s_decode_fctl[0].v_y1 = v_y1; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -56212,15 +69922,114 @@ wuffs_png__decoder__decode_fctl( + return status; + } + +-// -------- func png.decoder.decode_gama ++// -------- func tga.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func tga.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_gama( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_tga__decoder__do_decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint32_t v_dst_x = 0; ++ uint32_t v_dst_y = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_dst_start = 0; ++ wuffs_base__slice_u8 v_src_palette = {0}; ++ uint64_t v_mark = 0; ++ uint64_t v_num_pixels64 = 0; ++ uint32_t v_num_pixels32 = 0; ++ uint32_t v_lit_length = 0; ++ uint32_t v_run_length = 0; ++ uint64_t v_num_dst_bytes = 0; ++ uint32_t v_num_src_bytes = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_c5 = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -56232,516 +70041,739 @@ wuffs_png__decoder__decode_gama( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_gama[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel; ++ v_dst_x = self->private_data.s_do_decode_frame.v_dst_x; ++ v_dst_y = self->private_data.s_do_decode_frame.v_dst_y; ++ v_mark = self->private_data.s_do_decode_frame.v_mark; ++ v_num_pixels32 = self->private_data.s_do_decode_frame.v_num_pixels32; ++ v_lit_length = self->private_data.s_do_decode_frame.v_lit_length; ++ v_run_length = self->private_data.s_do_decode_frame.v_run_length; ++ v_num_dst_bytes = self->private_data.s_do_decode_frame.v_num_dst_bytes; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_tga__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024); ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ v_src_palette, ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1195461953u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_gama[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_gama[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint64_t)(*scratch >> 32)); +- break; ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) { ++ v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) { ++ v_lit_length = self->private_impl.f_width; ++ } ++ label__resume__continue:; ++ while (true) { ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ while (v_dst_y < self->private_impl.f_height) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); ++ if (v_dst_start <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ while (v_dst_x < self->private_impl.f_width) { ++ if (self->private_impl.f_src_bytes_per_pixel > 0u) { ++ if (v_lit_length > 0u) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel))); ++ v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length))))); ++ v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel); ++ v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel); ++ self->private_data.s_do_decode_frame.scratch = v_num_src_bytes; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ v_dst_x += v_num_pixels32; ++ v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u); ++ if (v_lit_length > 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__resume__continue; ++ } ++ } else if (v_run_length > 0u) { ++ v_run_length -= 1u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ goto label__resume__continue; ++ } ++ if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { ++ v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); ++ iop_a_src += 1u; ++ if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } else { ++ if (self->private_impl.f_src_bytes_per_pixel == 1u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } else if (self->private_impl.f_src_bytes_per_pixel == 3u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } ++ if ((v_run_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } ++ } ++ } else { ++ if (v_lit_length > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__resume__continue; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_scratch[3u] = 255u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, 4)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ v_lit_length -= 1u; ++ } else if (v_run_length > 0u) { ++ v_run_length -= 1u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__resume__continue; ++ } ++ if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { ++ v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); ++ iop_a_src += 1u; ++ if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_scratch[3u] = 255u; ++ if ((v_run_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } ++ } + } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ v_dst_x = 0u; ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) { ++ v_dst_y -= 1u; ++ } else { ++ v_dst_y += 1u; ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) { ++ v_lit_length = self->private_impl.f_width; + } + } +- self->private_impl.f_metadata_x = t_0; ++ break; + } +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; ++ self->private_data.s_do_decode_frame.v_dst_x = v_dst_x; ++ self->private_data.s_do_decode_frame.v_dst_y = v_dst_y; ++ self->private_data.s_do_decode_frame.v_mark = v_mark; ++ self->private_data.s_do_decode_frame.v_num_pixels32 = v_num_pixels32; ++ self->private_data.s_do_decode_frame.v_lit_length = v_lit_length; ++ self->private_data.s_do_decode_frame.v_run_length = v_run_length; ++ self->private_data.s_do_decode_frame.v_num_dst_bytes = v_num_dst_bytes; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func tga.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_tga__decoder__frame_dirty_rect( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func tga.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_tga__decoder__num_animation_loops( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func tga.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frame_configs( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func tga.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frames( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func tga.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__restart_frame( ++ wuffs_tga__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ return wuffs_base__make_status(NULL); ++} + +- goto ok; +- ok: +- self->private_impl.p_decode_gama[0] = 0; +- goto exit; ++// -------- func tga.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_tga__decoder__set_report_metadata( ++ wuffs_tga__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func tga.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__tell_me_more( ++ wuffs_tga__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_gama[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; + ++ goto ok; ++ ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.decode_iccp ++// -------- func tga.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_iccp( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_tga__decoder__workbuf_len( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_iccp[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} + +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c == 0u) { +- break; +- } +- } +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_is_zlib_compressed = true; +- self->private_impl.f_metadata_flavor = 4u; +- self->private_impl.f_metadata_fourcc = 1229144912u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +- goto ok; +- ok: +- self->private_impl.p_decode_iccp[0] = 0; +- goto exit; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_iccp[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// ---------------- Status Codes Implementations + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++// ---------------- Private Consts + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func png.decoder.decode_plte ++// ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_plte( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ---------------- VTables + +- uint32_t v_num_entries = 0; +- uint32_t v_i = 0; +- uint32_t v_argb = 0; ++// ---------------- Initializer Implementations + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_vp8__placeholder__initialize( ++ wuffs_vp8__placeholder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_plte[0]; +- if (coro_susp_point) { +- v_num_entries = self->private_data.s_decode_plte[0].v_num_entries; +- v_i = self->private_data.s_decode_plte[0].v_i; ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u); +- self->private_impl.f_chunk_length = 0u; +- while (v_i < v_num_entries) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_plte[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_plte[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 16) { +- t_0 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_argb = t_0; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_plte[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_plte[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_plte[0].v_num_entries = v_num_entries; +- self->private_data.s_decode_plte[0].v_i = v_i; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ return wuffs_base__make_status(NULL); ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++wuffs_vp8__placeholder* ++wuffs_vp8__placeholder__alloc(void) { ++ wuffs_vp8__placeholder* x = ++ (wuffs_vp8__placeholder*)(calloc(1, sizeof(wuffs_vp8__placeholder))); ++ if (!x) { ++ return NULL; + } +- +- return status; ++ if (wuffs_vp8__placeholder__initialize( ++ x, sizeof(wuffs_vp8__placeholder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; + } + +-// -------- func png.decoder.decode_srgb +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_srgb( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++size_t ++sizeof__wuffs_vp8__placeholder(void) { ++ return sizeof(wuffs_vp8__placeholder); ++} + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++// ---------------- Function Implementations + +- uint32_t coro_susp_point = self->private_impl.p_decode_srgb[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) + +- if (self->private_impl.f_chunk_length != 1u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1397901122u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t t_0 = *iop_a_src++; +- self->private_impl.f_metadata_x = t_0; +- } +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) + +- goto ok; +- ok: +- self->private_impl.p_decode_srgb[0] = 0; +- goto exit; +- } ++// ---------------- Status Codes Implementations + +- goto suspend; +- suspend: +- self->private_impl.p_decode_srgb[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header"; ++const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input"; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++// ---------------- Private Consts + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func png.decoder.decode_trns ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_trns( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++wuffs_wbmp__decoder__do_decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- uint32_t v_i = 0; +- uint32_t v_n = 0; +- uint64_t v_u = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- uint32_t coro_susp_point = self->private_impl.p_decode_trns[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_decode_trns[0].v_i; +- v_n = self->private_data.s_decode_trns[0].v_n; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- VTables + +- if (self->private_impl.f_color_type == 0u) { +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- } +- if (self->private_impl.f_chunk_length != 2u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_trns[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 8) { +- t_0 = ((uint64_t)(*scratch >> 48)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_u = t_0; +- } +- if (self->private_impl.f_depth <= 1u) { +- self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 2u) { +- self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 4u) { +- self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u); +- } else { +- self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u); +- } +- } else if (self->private_impl.f_color_type == 2u) { +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- } +- if (self->private_impl.f_chunk_length != 6u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { +- t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src))); +- iop_a_src += 6; +- } else { +- self->private_data.s_decode_trns[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 40) { +- t_1 = ((uint64_t)(*scratch >> 16)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_u = t_1; +- } +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) | +- (65280u & (v_u >> 8u)) | +- (16711680u & (v_u >> 16u)) | +- 4278190080u); +- } else { +- self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u); +- } +- } else if (self->private_impl.f_color_type == 3u) { +- self->private_impl.f_dst_pixfmt = 2164523016u; +- self->private_impl.f_src_pixfmt = 2164523016u; +- if (self->private_impl.f_chunk_length > 256u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- v_n = ((uint32_t)(self->private_impl.f_chunk_length)); +- self->private_impl.f_chunk_length = 0u; +- while (v_i < v_n) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2; +- } +- v_i += 1u; +- } ++const wuffs_base__image_decoder__func_ptrs ++wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_wbmp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_wbmp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_wbmp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_wbmp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_wbmp__decoder__initialize( ++ wuffs_wbmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } ++ } + +- goto ok; +- ok: +- self->private_impl.p_decode_trns[0] = 0; +- goto exit; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_wbmp__decoder* ++wuffs_wbmp__decoder__alloc(void) { ++ wuffs_wbmp__decoder* x = ++ (wuffs_wbmp__decoder*)(calloc(1, sizeof(wuffs_wbmp__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_wbmp__decoder__initialize( ++ x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_trns[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_trns[0].v_i = v_i; +- self->private_data.s_decode_trns[0].v_n = v_n; ++size_t ++sizeof__wuffs_wbmp__decoder(void) { ++ return sizeof(wuffs_wbmp__decoder); ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++// ---------------- Function Implementations ++ ++// -------- func wbmp.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__get_quirk( ++ const wuffs_wbmp__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- return status; ++ return 0u; + } + +-// -------- func png.decoder.decode_frame_config ++// -------- func wbmp.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_wbmp__decoder__set_quirk( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func wbmp.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); +@@ -56757,7 +70789,7 @@ wuffs_png__decoder__decode_frame_config( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -56766,17 +70798,17 @@ wuffs_png__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -56784,14 +70816,14 @@ wuffs_png__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -56801,17 +70833,19 @@ wuffs_png__decoder__decode_frame_config( + return status; + } + +-// -------- func png.decoder.do_decode_frame_config ++// -------- func wbmp.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_wbmp__decoder__do_decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_checksum_have = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_p = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -56824,392 +70858,88 @@ wuffs_png__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_do_decode_image_config.v_i; ++ v_p = self->private_data.s_do_decode_image_config.v_p; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { ++ if (self->private_impl.f_call_sequence != 0u) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; +- } else if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_png__decoder__skip_frame(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 48u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; + } +- if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { +- self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; +- self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0; +- self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1; +- self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1; +- self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position; +- self->private_impl.f_frame_duration = self->private_impl.f_first_duration; +- self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal; +- self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend; +- } else { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- self->private_impl.f_chunk_length = t_0; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_chunk_type = t_1; +- } +- if (self->private_impl.f_chunk_type == 1145980233u) { +- if (self->private_impl.f_chunk_length != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- v_checksum_have = t_2; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8u)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_png__decoder__decode_fctl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_data.s_do_decode_frame_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; +- break; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 48u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- self->private_data.s_do_decode_frame_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; ++ v_i = 0u; ++ while (v_i < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; +- self->private_impl.f_chunk_length = 0u; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- self->private_impl.f_frame_rect_x0, +- self->private_impl.f_frame_rect_y0, +- self->private_impl.f_frame_rect_x1, +- self->private_impl.f_frame_rect_y1), +- ((wuffs_base__flicks)(self->private_impl.f_frame_duration)), +- ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)), +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_frame_disposal, +- ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns), +- self->private_impl.f_frame_overwrite_instead_of_blend, +- 0u); +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func png.decoder.skip_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__skip_frame( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_seq_num = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.f_chunk_type_array[0u] = 0u; +- self->private_impl.f_chunk_type_array[1u] = 0u; +- self->private_impl.f_chunk_type_array[2u] = 0u; +- self->private_impl.f_chunk_type_array[3u] = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); ++ goto exit; + } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- if (self->private_impl.f_chunk_type_array[0u] == 102u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 68u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_type_array[0u] = 102u; +- self->private_impl.f_chunk_type_array[1u] = 100u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- iop_a_src += 8u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 2u) { ++ v_p = 0u; ++ while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_skip_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_skip_frame[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_seq_num = t_0; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ v_p |= ((uint32_t)(((uint8_t)(v_c8 & 127u)))); ++ if (((uint8_t)(v_c8 >> 7u)) == 0u) { ++ break; ++ } else if (v_p > 131071u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); + goto exit; + } +- self->private_impl.f_next_animation_seq_num += 1u; +- self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; +- continue; +- } else if (self->private_impl.f_chunk_type_array[0u] != 0u) { +- break; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ v_p <<= 7u; + } +- self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (v_i == 0u) { ++ self->private_impl.f_width = v_p; ++ } else { ++ self->private_impl.f_height = v_p; + } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; ++ v_i += 1u; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ 2198077448u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ true); + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); + self->private_impl.f_call_sequence = 32u; + ++ goto ok; + ok: +- self->private_impl.p_skip_frame[0] = 0; ++ self->private_impl.p_do_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_i = v_i; ++ self->private_data.s_do_decode_image_config.v_p = v_p; + + goto exit; + exit: +@@ -57220,17 +70950,14 @@ wuffs_png__decoder__skip_frame( + return status; + } + +-// -------- func png.decoder.decode_frame ++// -------- func wbmp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_wbmp__decoder__decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -57240,12 +70967,12 @@ wuffs_png__decoder__decode_frame( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_dst || !a_src) { ++ if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -57254,22 +70981,17 @@ wuffs_png__decoder__decode_frame( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -57277,14 +70999,14 @@ wuffs_png__decoder__decode_frame( + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: +@@ -57294,24 +71016,16 @@ wuffs_png__decoder__decode_frame( + return status; + } + +-// -------- func png.decoder.do_decode_frame ++// -------- func wbmp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_wbmp__decoder__do_decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_seq_num = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_pass_width = 0; +- uint32_t v_pass_height = 0; +- + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -57323,210 +71037,62 @@ wuffs_png__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else if (self->private_impl.f_call_sequence != 64u) { ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src); ++ status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 68u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- iop_a_src += 8u; +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- break; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- self->private_impl.f_chunk_type_array[0u] = 102u; +- self->private_impl.f_chunk_type_array[1u] = 100u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- iop_a_src += 8u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_seq_num = t_0; +- } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; +- } +- self->private_impl.f_next_animation_seq_num += 1u; +- break; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_data.s_do_decode_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; +- } +- if (self->private_impl.f_zlib_is_dirty) { +- wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, +- sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- if (self->private_impl.f_ignore_checksum) { +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); +- } +- } +- self->private_impl.f_zlib_is_dirty = true; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } +- self->private_impl.f_workbuf_hist_pos_base = 0u; +- while (true) { +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_pass_width = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1u])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u])); +- v_pass_height = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4u])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u])); +- } else { +- v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0))); +- v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0))); +- } +- if ((v_pass_width > 0u) && (v_pass_height > 0u)) { +- self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); +- self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row)); +- while (true) { +- { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); +- v_status = t_1; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { +- if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { +- wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); +- } +- if (v_status.repr == wuffs_base__suspension__short_read) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); +- goto exit; +- } +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- } +- v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; +- } +- if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) { +- break; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace_pass += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- self->private_impl.f_call_sequence = 32u; ++ self->private_impl.f_call_sequence = 64u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -57537,338 +71103,217 @@ wuffs_png__decoder__do_decode_frame( + return status; + } + +-// -------- func png.decoder.decode_pass ++// -------- func wbmp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_pass( +- wuffs_png__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_w = &u_w; +- uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_w_mark = 0; +- uint64_t v_r_mark = 0; +- wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); +- uint32_t v_checksum_have = 0; +- uint32_t v_checksum_want = 0; +- uint32_t v_seq_num = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_pass[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_workbuf_wi = 0u; + while (true) { +- if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); +- goto exit; +- } + { +- wuffs_base__io_buffer* o_0_v_w = v_w; +- uint8_t *o_0_iop_v_w = iop_v_w; +- uint8_t *o_0_io0_v_w = io0_v_w; +- uint8_t *o_0_io1_v_w = io1_v_w; +- uint8_t *o_0_io2_v_w = io2_v_w; +- v_w = wuffs_base__io_writer__set( +- &u_w, +- &iop_v_w, +- &io0_v_w, +- &io1_v_w, +- &io2_v_w, +- wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_workbuf_wi, +- self->private_impl.f_pass_workbuf_length), +- ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi))); +- { +- const bool o_1_closed_a_src = a_src->meta.closed; +- const uint8_t *o_1_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_0; +- iop_v_w = u_w.data.ptr + u_w.meta.wi; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)))); +- io2_a_src = o_1_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_1_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- v_w = o_0_v_w; +- iop_v_w = o_0_iop_v_w; +- io0_v_w = o_0_io0_v_w; +- io1_v_w = o_0_io1_v_w; +- io2_v_w = o_0_io2_v_w; ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; + } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- if (self->private_impl.f_chunk_length > 0u) { +- status = wuffs_base__make_status(wuffs_base__error__too_much_data); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_checksum_want = t_1; +- } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); +- if (v_checksum_have != v_checksum_want) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- break; +- } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) { +- if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; +- } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } else if (self->private_impl.f_chunk_length == 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_checksum_want = t_2; +- } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); +- if (v_checksum_have != v_checksum_want) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func wbmp.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_x_in_bytes = 0; ++ uint32_t v_dst_x = 0; ++ uint32_t v_dst_y = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_src[1] = {0}; ++ uint8_t v_c8 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel; ++ v_dst_x = self->private_data.s_do_decode_frame.v_dst_x; ++ v_dst_y = self->private_data.s_do_decode_frame.v_dst_y; ++ memcpy(v_src, self->private_data.s_do_decode_frame.v_src, sizeof(v_src)); ++ v_c8 = self->private_data.s_do_decode_frame.v_c8; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(536870920u), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ if (self->private_impl.f_width > 0u) { ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (v_dst_y < self->private_impl.f_height) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_x = 0u; ++ while (v_dst_x < self->private_impl.f_width) { ++ if ((v_dst_x & 7u) == 0u) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); ++ if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes); + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); + } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; + } +- self->private_impl.f_chunk_length = t_3; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ if (((uint8_t)(v_c8 & 128u)) == 0u) { ++ v_src[0u] = 0u; + } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_chunk_type = t_4; +- } +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- if (self->private_impl.f_chunk_type != 1413563465u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- } else { +- if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); +- } +- } +- v_seq_num = t_5; ++ v_src[0u] = 255u; + } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; ++ v_c8 = ((uint8_t)((((uint32_t)(v_c8)) << 1u))); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); + } +- self->private_impl.f_next_animation_seq_num += 1u; ++ v_dst_x += 1u; + } +- continue; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- } +- if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) { +- status = wuffs_base__make_status(wuffs_base__error__not_enough_data); +- goto exit; +- } else if (0u < ((uint64_t)(a_workbuf.len))) { +- if (a_workbuf.ptr[0u] == 4u) { +- a_workbuf.ptr[0u] = 1u; ++ v_dst_y += 1u; + } + } ++ self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_decode_pass[0] = 0; ++ self->private_impl.p_do_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_pass[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; ++ self->private_data.s_do_decode_frame.v_dst_x = v_dst_x; ++ self->private_data.s_do_decode_frame.v_dst_y = v_dst_y; ++ memcpy(self->private_data.s_do_decode_frame.v_src, v_src, sizeof(v_src)); ++ self->private_data.s_do_decode_frame.v_c8 = v_c8; + + goto exit; + exit: +@@ -57879,12 +71324,12 @@ wuffs_png__decoder__decode_pass( + return status; + } + +-// -------- func png.decoder.frame_dirty_rect ++// -------- func wbmp.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_png__decoder__frame_dirty_rect( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__frame_dirty_rect( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } +@@ -57894,18 +71339,18 @@ wuffs_png__decoder__frame_dirty_rect( + } + + return wuffs_base__utility__make_rect_ie_u32( +- self->private_impl.f_frame_rect_x0, +- self->private_impl.f_frame_rect_y0, +- self->private_impl.f_frame_rect_x1, +- self->private_impl.f_frame_rect_y1); ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); + } + +-// -------- func png.decoder.num_animation_loops ++// -------- func wbmp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_png__decoder__num_animation_loops( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_animation_loops( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57914,15 +71359,15 @@ wuffs_png__decoder__num_animation_loops( + return 0; + } + +- return self->private_impl.f_num_animation_loops_value; ++ return 0u; + } + +-// -------- func png.decoder.num_decoded_frame_configs ++// -------- func wbmp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__num_decoded_frame_configs( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_decoded_frame_configs( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57931,15 +71376,18 @@ wuffs_png__decoder__num_decoded_frame_configs( + return 0; + } + +- return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)); ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func png.decoder.num_decoded_frames ++// -------- func wbmp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__num_decoded_frames( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_decoded_frames( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57948,15 +71396,18 @@ wuffs_png__decoder__num_decoded_frames( + return 0; + } + +- return ((uint64_t)(self->private_impl.f_num_decoded_frames_value)); ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func png.decoder.restart_frame ++// -------- func wbmp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__restart_frame( +- wuffs_png__decoder* self, ++wuffs_wbmp__decoder__restart_frame( ++ wuffs_wbmp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { +@@ -57971,154 +71422,514 @@ wuffs_png__decoder__restart_frame( + + if (self->private_impl.f_call_sequence < 32u) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0u) && (a_io_position != self->private_impl.f_first_config_io_position))) { ++ } ++ if (a_index != 0u) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40u; +- if (self->private_impl.f_interlace_pass >= 1u) { +- self->private_impl.f_interlace_pass = 1u; +- } + self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index)); +- self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value; + return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.set_report_metadata ++// -------- func wbmp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_png__decoder__set_report_metadata( +- wuffs_png__decoder* self, ++wuffs_wbmp__decoder__set_report_metadata( ++ wuffs_wbmp__decoder* self, + uint32_t a_fourcc, + bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func wbmp.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__tell_me_more( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- if (a_fourcc == 1128813133u) { +- self->private_impl.f_report_metadata_chrm = a_report; +- } else if (a_fourcc == 1163413830u) { +- self->private_impl.f_report_metadata_exif = a_report; +- } else if (a_fourcc == 1195461953u) { +- self->private_impl.f_report_metadata_gama = a_report; +- } else if (a_fourcc == 1229144912u) { +- self->private_impl.f_report_metadata_iccp = a_report; +- } else if (a_fourcc == 1263947808u) { +- self->private_impl.f_report_metadata_kvp = a_report; +- } else if (a_fourcc == 1397901122u) { +- self->private_impl.f_report_metadata_srgb = a_report; ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func wbmp.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_wbmp__decoder__workbuf_len( ++ const wuffs_wbmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_webp__error__bad_huffman_code_over_subscribed[] = "#webp: bad Huffman code (over-subscribed)"; ++const char wuffs_webp__error__bad_huffman_code_under_subscribed[] = "#webp: bad Huffman code (under-subscribed)"; ++const char wuffs_webp__error__bad_huffman_code[] = "#webp: bad Huffman code"; ++const char wuffs_webp__error__bad_back_reference[] = "#webp: bad back-reference"; ++const char wuffs_webp__error__bad_color_cache[] = "#webp: bad color cache"; ++const char wuffs_webp__error__bad_header[] = "#webp: bad header"; ++const char wuffs_webp__error__bad_transform[] = "#webp: bad transform"; ++const char wuffs_webp__error__short_chunk[] = "#webp: short chunk"; ++const char wuffs_webp__error__truncated_input[] = "#webp: truncated input"; ++const char wuffs_webp__error__unsupported_number_of_huffman_groups[] = "#webp: unsupported number of Huffman groups"; ++const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[] = "#webp: unsupported transform after color indexing transform"; ++const char wuffs_webp__error__unsupported_webp_file[] = "#webp: unsupported WebP file"; ++const char wuffs_webp__error__internal_error_inconsistent_huffman_code[] = "#webp: internal error: inconsistent Huffman code"; ++const char wuffs_webp__error__internal_error_inconsistent_dst_buffer[] = "#webp: internal error: inconsistent dst buffer"; ++const char wuffs_webp__error__internal_error_inconsistent_n_bits[] = "#webp: internal error: inconsistent n_bits"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 17u, 18u, 0u, 1u, 2u, 3u, 4u, 5u, ++ 16u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, ++ 13u, 14u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__REPEAT_N_BITS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 2u, 3u, 7u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__REPEAT_COUNTS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 3u, 3u, 11u, 0u, ++}; ++ ++static const uint16_t ++WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1612u, 0u, 511u, 1022u, 1533u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u, ++ 22u, 26u, 38u, 42u, 56u, 5u, 55u, 57u, ++ 21u, 27u, 54u, 58u, 37u, 43u, 72u, 4u, ++ 71u, 73u, 20u, 28u, 53u, 59u, 70u, 74u, ++ 36u, 44u, 88u, 69u, 75u, 52u, 60u, 3u, ++ 87u, 89u, 19u, 29u, 86u, 90u, 35u, 45u, ++ 68u, 76u, 85u, 91u, 51u, 61u, 104u, 2u, ++ 103u, 105u, 18u, 30u, 102u, 106u, 34u, 46u, ++ 84u, 92u, 67u, 77u, 101u, 107u, 50u, 62u, ++ 120u, 1u, 119u, 121u, 83u, 93u, 17u, 31u, ++ 100u, 108u, 66u, 78u, 118u, 122u, 33u, 47u, ++ 117u, 123u, 49u, 63u, 99u, 109u, 82u, 94u, ++ 0u, 116u, 124u, 65u, 79u, 16u, 32u, 98u, ++ 110u, 48u, 115u, 125u, 81u, 95u, 64u, 114u, ++ 126u, 97u, 111u, 80u, 113u, 127u, 96u, 112u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_groups( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n_huffman_groups); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree_simple( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_code_length_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths_huffman_nodes( ++ wuffs_webp__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_huffman_nodes( ++ wuffs_webp__decoder* self, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels_slow( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_predictor( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_webp__decoder__absolute_difference( ++ const wuffs_webp__decoder* self, ++ uint32_t a_a, ++ uint32_t a_b); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode12( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode13( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_cross_color( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_subtract_green( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_color_indexing( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited_vp8l( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_transform( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_color_cache_parameters( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_hg_table( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__swizzle( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_src, ++ wuffs_base__pixel_blend a_blend); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_webp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_webp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_webp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_webp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_webp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_webp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_webp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_webp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_webp__decoder__initialize( ++ wuffs_webp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_webp__decoder* ++wuffs_webp__decoder__alloc(void) { ++ wuffs_webp__decoder* x = ++ (wuffs_webp__decoder*)(calloc(1, sizeof(wuffs_webp__decoder))); ++ if (!x) { ++ return NULL; + } +- return wuffs_base__make_empty_struct(); ++ if (wuffs_webp__decoder__initialize( ++ x, sizeof(wuffs_webp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; + } + +-// -------- func png.decoder.tell_me_more ++size_t ++sizeof__wuffs_webp__decoder(void) { ++ return sizeof(wuffs_webp__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func webp.decoder.decode_huffman_groups + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__tell_me_more( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_groups( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n_huffman_groups) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_hg = 0; ++ uint32_t v_ht = 0; + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_groups; ++ if (coro_susp_point) { ++ v_hg = self->private_data.s_decode_huffman_groups.v_hg; ++ v_ht = self->private_data.s_decode_huffman_groups.v_ht; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); +- goto exit; ++ v_hg = 0u; ++ while (v_hg < a_n_huffman_groups) { ++ v_ht = 0u; ++ while (v_ht < 5u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__decode_huffman_tree(self, a_src, v_hg, v_ht); ++ if (status.repr) { ++ goto suspend; ++ } ++ v_ht += 1u; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_hg += 1u; + } + ++ goto ok; + ok: +- self->private_impl.p_tell_me_more[0] = 0; ++ self->private_impl.p_decode_huffman_groups = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ self->private_impl.p_decode_huffman_groups = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_groups.v_hg = v_hg; ++ self->private_data.s_decode_huffman_groups.v_ht = v_ht; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } + return status; + } + +-// -------- func png.decoder.do_tell_me_more ++// -------- func webp.decoder.decode_huffman_tree + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_tell_me_more( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++wuffs_webp__decoder__decode_huffman_tree( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint16_t v_c2 = 0; +- wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_w = &u_w; +- uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_num_written = 0; +- uint64_t v_w_mark = 0; +- uint64_t v_r_mark = 0; +- wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint32_t v_use_simple = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -58130,462 +71941,105 @@ wuffs_png__decoder__do_tell_me_more( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; +- if (coro_susp_point) { +- v_zlib_status = self->private_data.s_do_tell_me_more[0].v_zlib_status; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ if (a_ht >= 4u) { ++ self->private_impl.f_ht_n_symbols = 40u; ++ } else if (a_ht > 0u) { ++ self->private_impl.f_ht_n_symbols = 256u; ++ } else if (self->private_impl.f_color_cache_bits == 0u) { ++ self->private_impl.f_ht_n_symbols = 280u; ++ } else { ++ self->private_impl.f_ht_n_symbols = (280u + (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits)); + } +- do { +- if (self->private_impl.f_metadata_flavor == 3u) { +- while (true) { +- if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; +- } else if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- self->private_impl.f_metadata_flavor, +- self->private_impl.f_metadata_fourcc, +- self->private_impl.f_metadata_x, +- self->private_impl.f_metadata_y, +- self->private_impl.f_metadata_z); +- } +- if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) { +- goto label__goto_done__break; +- } +- self->private_impl.f_metadata_y = self->private_impl.f_metadata_z; +- status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- if (self->private_impl.f_metadata_is_zlib_compressed) { +- if (self->private_impl.f_zlib_is_dirty) { +- wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, +- sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- if (self->private_impl.f_ignore_checksum) { +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); +- } +- } +- self->private_impl.f_zlib_is_dirty = true; +- self->private_impl.f_ztxt_hist_pos = 0u; ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_simple = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_use_simple != 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- label__loop__continue:; +- while (true) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- self->private_impl.f_metadata_flavor, +- self->private_impl.f_metadata_fourcc, +- self->private_impl.f_metadata_x, +- self->private_impl.f_metadata_y, +- self->private_impl.f_metadata_z); +- } +- if (self->private_impl.f_metadata_flavor != 4u) { +- break; +- } +- if (self->private_impl.f_metadata_is_zlib_compressed) { +- if (self->private_impl.f_chunk_type == 1346585449u) { +- { +- const bool o_0_closed_a_src = a_src->meta.closed; +- const uint8_t *o_0_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_0; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- io2_a_src = o_0_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_0_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } else if (self->private_impl.f_chunk_type == 1951945833u) { +- { +- const bool o_1_closed_a_src = a_src->meta.closed; +- const uint8_t *o_1_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_1; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- io2_a_src = o_1_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_1_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } else if (self->private_impl.f_chunk_type == 1951945850u) { +- if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) { +- { +- wuffs_base__io_buffer* o_2_v_w = v_w; +- uint8_t *o_2_iop_v_w = iop_v_w; +- uint8_t *o_2_io0_v_w = io0_v_w; +- uint8_t *o_2_io1_v_w = io1_v_w; +- uint8_t *o_2_io2_v_w = io2_v_w; +- v_w = wuffs_base__io_writer__set( +- &u_w, +- &iop_v_w, +- &io0_v_w, +- &io1_v_w, +- &io2_v_w, +- wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), +- self->private_impl.f_ztxt_hist_pos); +- { +- const bool o_3_closed_a_src = a_src->meta.closed; +- const uint8_t *o_3_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_2; +- iop_v_w = u_w.data.ptr + u_w.meta.wi; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- v_num_written = wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))); +- io2_a_src = o_3_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_3_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- v_w = o_2_v_w; +- iop_v_w = o_2_iop_v_w; +- io0_v_w = o_2_io0_v_w; +- io1_v_w = o_2_io1_v_w; +- io2_v_w = o_2_io2_v_w; +- } +- if (v_num_written > 1024u) { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- self->private_impl.f_ztxt_ri = 0u; +- self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written)); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written); +- } +- while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) { +- v_c2 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]]; +- if (v_c2 == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); +- goto exit; +- } else if (v_c2 <= 127u) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- goto label__loop__continue; +- } +- self->private_impl.f_ztxt_ri += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); +- } else { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__loop__continue; +- } +- self->private_impl.f_ztxt_ri += 1u; +- (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) { +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- } +- } else { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type); +- goto exit; +- } +- } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) { +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- goto label__loop__break; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__loop__continue; +- } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c), iop_a_dst += 1); +- } +- } else { +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- if (self->private_impl.f_metadata_fourcc == 1263947851u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- goto label__loop__break; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__loop__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c == 0u) { +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- goto label__loop__break; +- } +- v_c2 = WUFFS_PNG__LATIN_1[v_c]; +- if (v_c2 == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); +- goto exit; +- } else if (v_c2 <= 127u) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); +- } else { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); +- } +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_webp__decoder__decode_huffman_tree_simple(self, a_src, a_hg, a_ht); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_code_length_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_webp__decoder__build_code_lengths_huffman_nodes(self); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } ++ goto ok; + } +- label__loop__break:; +- if (self->private_impl.f_metadata_fourcc == 1263947851u) { +- self->private_impl.f_metadata_fourcc = 1263947862u; +- if (self->private_impl.f_chunk_type == 1951945833u) { +- if (self->private_impl.f_chunk_length <= 1u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 2u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if (v_c == 0u) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- } else if (v_c == 1u) { +- self->private_impl.f_metadata_is_zlib_compressed = true; +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if ((v_c != 0u) && self->private_impl.f_metadata_is_zlib_compressed) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_fourcc -= 2u; +- while (self->private_impl.f_metadata_fourcc != 1263947862u) { +- self->private_impl.f_metadata_fourcc += 1u; +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (v_c == 0u) { +- break; +- } +- } +- } +- } else if (self->private_impl.f_chunk_type == 1951945850u) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_is_zlib_compressed = true; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__build_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_webp__decoder__build_huffman_nodes(self, a_hg, a_ht); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } +- self->private_impl.f_call_sequence &= 239u; +- status = wuffs_base__make_status(NULL); + goto ok; + } +- } while (0); +- label__goto_done__break:; +- if (self->private_impl.f_chunk_length != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_data.s_do_tell_me_more[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- if (self->private_data.s_do_tell_me_more[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_tell_me_more[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; + } +- iop_a_src += self->private_data.s_do_tell_me_more[0].scratch; +- self->private_impl.f_metadata_flavor = 0u; +- self->private_impl.f_metadata_fourcc = 0u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- self->private_impl.f_call_sequence &= 239u; +- status = wuffs_base__make_status(NULL); +- goto ok; + + ok: +- self->private_impl.p_do_tell_me_more[0] = 0; ++ self->private_impl.p_decode_huffman_tree = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_tell_me_more[0].v_zlib_status = v_zlib_status; ++ self->private_impl.p_decode_huffman_tree = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -58593,563 +72047,1574 @@ wuffs_png__decoder__do_tell_me_more( + return status; + } + +-// -------- func png.decoder.history_retain_length ++// -------- func webp.decoder.decode_huffman_tree_simple + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__history_retain_length( +- const wuffs_png__decoder* self) { +- if (!self) { +- return 0; ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree_simple( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_second_symbol = 0; ++ uint32_t v_first_symbol_n_bits = 0; ++ uint32_t v_symbol0 = 0; ++ uint32_t v_symbol1 = 0; ++ uint32_t v_base_offset = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree_simple; ++ if (coro_susp_point) { ++ v_use_second_symbol = self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol; ++ v_first_symbol_n_bits = self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits; ++ v_symbol0 = self->private_data.s_decode_huffman_tree_simple.v_symbol0; ++ v_base_offset = self->private_data.s_decode_huffman_tree_simple.v_base_offset; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- return 0u; ++ if (self->private_impl.f_n_bits < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 2u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_use_second_symbol = (self->private_impl.f_bits & 1u); ++ v_first_symbol_n_bits = ((((self->private_impl.f_bits & 2u) >> 1u) * 7u) + 1u); ++ self->private_impl.f_bits >>= 2u; ++ self->private_impl.f_n_bits -= 2u; ++ if (self->private_impl.f_n_bits < v_first_symbol_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= v_first_symbol_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_symbol0 = (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_first_symbol_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_first_symbol_n_bits; ++ self->private_impl.f_n_bits -= v_first_symbol_n_bits; ++ v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht])); ++ if (v_use_second_symbol != 0u) { ++ if (self->private_impl.f_n_bits < 8u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (self->private_impl.f_n_bits >= 8u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_symbol1 = (self->private_impl.f_bits & 255u); ++ self->private_impl.f_bits >>= 8u; ++ self->private_impl.f_n_bits -= 8u; ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 0u)] = ((uint16_t)((v_base_offset + 1u))); ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 1u)] = ((uint16_t)((v_symbol0 | 32768u))); ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 2u)] = ((uint16_t)((v_symbol1 | 32768u))); ++ } else { ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_symbol0 | 32768u))); ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_huffman_tree_simple = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_huffman_tree_simple = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol = v_use_second_symbol; ++ self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits = v_first_symbol_n_bits; ++ self->private_data.s_decode_huffman_tree_simple.v_symbol0 = v_symbol0; ++ self->private_data.s_decode_huffman_tree_simple.v_base_offset = v_base_offset; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.workbuf_len ++// -------- func webp.decoder.decode_code_length_code_lengths + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_png__decoder__workbuf_len( +- const wuffs_png__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++static wuffs_base__status ++wuffs_webp__decoder__decode_code_length_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_n_codes = 0; ++ uint32_t v_i = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_code_length_code_lengths; ++ if (coro_susp_point) { ++ v_n_codes = self->private_data.s_decode_code_length_code_lengths.v_n_codes; ++ v_i = self->private_data.s_decode_code_length_code_lengths.v_i; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length); ++ if (self->private_impl.f_n_bits < 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_n_codes = ((self->private_impl.f_bits & 15u) + 4u); ++ self->private_impl.f_bits >>= 4u; ++ self->private_impl.f_n_bits -= 4u; ++ v_i = 0u; ++ while (v_i < v_n_codes) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = ((uint8_t)((self->private_impl.f_bits & 7u))); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ v_i += 1u; ++ } ++ while (v_i < 19u) { ++ self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = 0u; ++ v_i += 1u; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_code_length_code_lengths = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_code_length_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_code_length_code_lengths.v_n_codes = v_n_codes; ++ self->private_data.s_decode_code_length_code_lengths.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.filter_and_swizzle ++// -------- func webp.decoder.build_code_lengths_huffman_nodes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf); ++wuffs_webp__decoder__build_code_lengths_huffman_nodes( ++ wuffs_webp__decoder* self) { ++ uint32_t v_code_bits = 0; ++ uint32_t v_code_len = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_histogram[8] = {0}; ++ uint32_t v_n_used_symbols = 0; ++ uint32_t v_last_used_symbol = 0; ++ uint32_t v_subscription_weight = 0; ++ uint32_t v_subscription_total = 0; ++ uint32_t v_curr_code = 0; ++ uint32_t v_next_codes[9] = {0}; ++ uint32_t v_n_branches = 0; ++ uint32_t v_h = 0; ++ uint32_t v_children = 0; ++ uint16_t v_node = 0; ++ ++ v_symbol = 0u; ++ while (v_symbol < 19u) { ++ v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol])); ++ if (v_code_len != 0u) { ++ v_histogram[v_code_len] += 1u; ++ v_n_used_symbols += 1u; ++ v_last_used_symbol = v_symbol; ++ } ++ v_symbol += 1u; ++ } ++ if (v_n_used_symbols < 1u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ } else if (v_n_used_symbols == 1u) { ++ self->private_data.f_code_lengths_huffman_nodes[0u] = ((uint16_t)((v_last_used_symbol | 32768u))); ++ return wuffs_base__make_status(NULL); ++ } ++ v_subscription_weight = 16384u; ++ v_code_len = 1u; ++ while (true) { ++ v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u)); ++ v_next_codes[(v_code_len + 1u)] = v_curr_code; ++ v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len])); ++ v_subscription_weight >>= 1u; ++ if (v_code_len >= 7u) { ++ break; ++ } ++ v_code_len += 1u; ++ } ++ if (v_subscription_total > 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed); ++ } else if (v_subscription_total < 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed); ++ } ++ self->private_data.f_code_lengths_huffman_nodes[0u] = 0u; ++ v_symbol = 0u; ++ while (v_symbol < 19u) { ++ v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol])); ++ if (v_code_len > 0u) { ++ v_code_bits = v_next_codes[v_code_len]; ++ v_next_codes[v_code_len] += 1u; ++ v_code_bits <<= (32u - v_code_len); ++ v_h = 0u; ++ while (v_code_len > 0u) { ++ v_node = self->private_data.f_code_lengths_huffman_nodes[v_h]; ++ if (v_node == 0u) { ++ v_children = ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches)))); ++ v_children = wuffs_base__u32__min(v_children, 35u); ++ self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)(v_children)); ++ self->private_data.f_code_lengths_huffman_nodes[(v_children + 0u)] = 0u; ++ self->private_data.f_code_lengths_huffman_nodes[(v_children + 1u)] = 0u; ++ v_h = (v_children + (v_code_bits >> 31u)); ++ v_n_branches += 1u; ++ } else { ++ v_children = ((uint32_t)(v_node)); ++ v_h = (wuffs_base__u32__min(v_children, 35u) + (v_code_bits >> 31u)); ++ } ++ v_code_bits <<= 1u; ++ v_code_len -= 1u; ++ } ++ self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)((v_symbol | 32768u))); ++ } ++ v_symbol += 1u; ++ } ++ return wuffs_base__make_status(NULL); + } + ++// -------- func webp.decoder.build_huffman_nodes ++ + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row0 = 0; +- uint64_t v_dst_bytes_per_row1 = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- uint32_t v_y = 0; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_filter = 0; +- wuffs_base__slice_u8 v_curr_row = {0}; +- wuffs_base__slice_u8 v_prev_row = {0}; +- +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++wuffs_webp__decoder__build_huffman_nodes( ++ wuffs_webp__decoder* self, ++ uint32_t a_hg, ++ uint32_t a_ht) { ++ uint32_t v_base_offset = 0; ++ uint32_t v_code_bits = 0; ++ uint32_t v_code_len = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_histogram[16] = {0}; ++ uint32_t v_n_used_symbols = 0; ++ uint32_t v_last_used_symbol = 0; ++ uint32_t v_subscription_weight = 0; ++ uint32_t v_subscription_total = 0; ++ uint32_t v_curr_code = 0; ++ uint32_t v_next_codes[17] = {0}; ++ uint32_t v_n_branches = 0; ++ uint32_t v_h = 0; ++ uint32_t v_children = 0; ++ uint16_t v_node = 0; ++ ++ v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht])); ++ v_symbol = 0u; ++ while (v_symbol < self->private_impl.f_ht_n_symbols) { ++ v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u)))); ++ if (v_code_len != 0u) { ++ v_histogram[v_code_len] += 1u; ++ v_n_used_symbols += 1u; ++ v_last_used_symbol = v_symbol; ++ } ++ v_symbol += 1u; ++ } ++ if (v_n_used_symbols < 1u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ } else if (v_n_used_symbols == 1u) { ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_last_used_symbol | 32768u))); ++ return wuffs_base__make_status(NULL); + } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel); +- v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- 0u, +- 0u, +- v_dst_bytes_per_row1, +- ((uint64_t)(v_tab.height))); ++ v_subscription_weight = 16384u; ++ v_code_len = 1u; ++ while (true) { ++ v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u)); ++ v_next_codes[(v_code_len + 1u)] = v_curr_code; ++ v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len])); ++ v_subscription_weight >>= 1u; ++ if (v_code_len >= 15u) { ++ break; ++ } ++ v_code_len += 1u; ++ } ++ if (v_subscription_total > 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed); ++ } else if (v_subscription_total < 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed); ++ } ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = 0u; ++ v_symbol = 0u; ++ while (v_symbol < self->private_impl.f_ht_n_symbols) { ++ v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u)))); ++ if (v_code_len != 0u) { ++ v_code_bits = v_next_codes[v_code_len]; ++ v_next_codes[v_code_len] += 1u; ++ v_code_bits <<= (32u - v_code_len); ++ v_h = v_base_offset; ++ while (v_code_len > 0u) { ++ v_node = self->private_data.f_huffman_nodes[a_hg][v_h]; ++ if (v_node == 0u) { ++ v_children = ((uint32_t)(v_base_offset + ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches)))))); ++ v_children = wuffs_base__u32__min(v_children, 6265u); ++ self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)(v_children)); ++ self->private_data.f_huffman_nodes[a_hg][(v_children + 0u)] = 0u; ++ self->private_data.f_huffman_nodes[a_hg][(v_children + 1u)] = 0u; ++ v_h = (v_children + (v_code_bits >> 31u)); ++ v_n_branches += 1u; ++ } else { ++ v_children = ((uint32_t)(v_node)); ++ v_h = (wuffs_base__u32__min(v_children, 6265u) + (v_code_bits >> 31u)); ++ } ++ v_code_bits <<= 1u; ++ v_code_len -= 1u; ++ } ++ self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)((v_symbol | 32768u))); ++ } ++ v_symbol += 1u; + } +- if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- v_dst_bytes_per_row0, +- 0u, +- ((uint64_t)(v_tab.width)), +- ((uint64_t)(v_tab.height))); +- } else { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- 0u, +- 0u, +- 0u, +- 0u); ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func webp.decoder.build_code_lengths ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_length = 0; ++ uint32_t v_length_n_bits = 0; ++ uint32_t v_length = 0; ++ uint16_t v_prev_code_length = 0; ++ uint32_t v_h = 0; ++ uint32_t v_s = 0; ++ uint32_t v_s_max = 0; ++ uint16_t v_node = 0; ++ uint32_t v_symbol = 0; ++ uint16_t v_repeat_value = 0; ++ uint32_t v_repeat_n_bits = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- v_y = self->private_impl.f_frame_rect_y0; +- while (v_y < self->private_impl.f_frame_rect_y1) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (1u > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ ++ uint32_t coro_susp_point = self->private_impl.p_build_code_lengths; ++ if (coro_susp_point) { ++ v_length_n_bits = self->private_data.s_build_code_lengths.v_length_n_bits; ++ v_prev_code_length = self->private_data.s_build_code_lengths.v_prev_code_length; ++ v_s = self->private_data.s_build_code_lengths.v_s; ++ v_s_max = self->private_data.s_build_code_lengths.v_s_max; ++ v_node = self->private_data.s_build_code_lengths.v_node; ++ v_repeat_value = self->private_data.s_build_code_lengths.v_repeat_value; ++ v_repeat_n_bits = self->private_data.s_build_code_lengths.v_repeat_n_bits; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } +- v_filter = a_workbuf.ptr[0u]; +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); +- if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ v_use_length = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_ht_code_lengths_remaining = self->private_impl.f_ht_n_symbols; ++ if (v_use_length != 0u) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_length_n_bits = (((self->private_impl.f_bits & 7u) * 2u) + 2u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ while (self->private_impl.f_n_bits < v_length_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (self->private_impl.f_n_bits >= v_length_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_length = ((self->private_impl.f_bits & ((((uint32_t)(1u)) << v_length_n_bits) - 1u)) + 2u); ++ self->private_impl.f_bits >>= v_length_n_bits; ++ self->private_impl.f_n_bits -= v_length_n_bits; ++ if (v_length > self->private_impl.f_ht_n_symbols) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ goto exit; ++ } ++ self->private_impl.f_ht_code_lengths_remaining = v_length; + } +- v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- if (v_filter == 0u) { +- } else if (v_filter == 1u) { +- wuffs_png__decoder__filter_1(self, v_curr_row); +- } else if (v_filter == 2u) { +- wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); +- } else if (v_filter == 3u) { +- wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); +- } else if (v_filter == 4u) { +- wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); +- } else { +- return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ v_prev_code_length = 8u; ++ while (v_s < self->private_impl.f_ht_n_symbols) { ++ if (self->private_impl.f_ht_code_lengths_remaining <= 0u) { ++ while (v_s < self->private_impl.f_ht_n_symbols) { ++ self->private_data.f_code_lengths[v_s] = 0u; ++ v_s += 1u; ++ } ++ break; ++ } ++ self->private_impl.f_ht_code_lengths_remaining -= 1u; ++ v_h = 0u; ++ while (true) { ++ v_node = self->private_data.f_code_lengths_huffman_nodes[v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } else if (v_node > 35u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_symbol = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_symbol == 0u) { ++ self->private_data.f_code_lengths[v_s] = 0u; ++ v_s += 1u; ++ continue; ++ } else if (v_symbol < 16u) { ++ v_prev_code_length = ((uint16_t)(v_symbol)); ++ self->private_data.f_code_lengths[v_s] = v_prev_code_length; ++ v_s += 1u; ++ continue; ++ } else if (v_symbol == 16u) { ++ v_repeat_value = v_prev_code_length; ++ } else { ++ v_repeat_value = 0u; ++ } ++ v_repeat_n_bits = ((uint32_t)(WUFFS_WEBP__REPEAT_N_BITS[(v_symbol & 3u)])); ++ v_s_max = ((uint32_t)(((uint32_t)(WUFFS_WEBP__REPEAT_COUNTS[(v_symbol & 3u)])) + v_s)); ++ if (self->private_impl.f_n_bits < v_repeat_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (self->private_impl.f_n_bits >= v_repeat_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_s_max += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_repeat_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_repeat_n_bits; ++ self->private_impl.f_n_bits -= v_repeat_n_bits; ++ if (v_s_max > self->private_impl.f_ht_n_symbols) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ goto exit; ++ } ++ while (v_s < v_s_max) { ++ self->private_data.f_code_lengths[v_s] = v_repeat_value; ++ v_s += 1u; ++ } + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row); +- v_prev_row = v_curr_row; +- v_y += 1u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_build_code_lengths = 0; ++ goto exit; + } +- return wuffs_base__make_status(NULL); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_build_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_build_code_lengths.v_length_n_bits = v_length_n_bits; ++ self->private_data.s_build_code_lengths.v_prev_code_length = v_prev_code_length; ++ self->private_data.s_build_code_lengths.v_s = v_s; ++ self->private_data.s_build_code_lengths.v_s_max = v_s_max; ++ self->private_data.s_build_code_lengths.v_node = v_node; ++ self->private_data.s_build_code_lengths.v_repeat_value = v_repeat_value; ++ self->private_data.s_build_code_lengths.v_repeat_n_bits = v_repeat_n_bits; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.filter_and_swizzle_tricky ++// -------- func webp.decoder.decode_pixels_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle_tricky( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row1 = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- uint64_t v_src_bytes_per_pixel = 0; ++wuffs_webp__decoder__decode_pixels_slow( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint64_t v_p = 0; ++ uint64_t v_p_max = 0; ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_width_in_tiles = 0; + uint32_t v_x = 0; + uint32_t v_y = 0; +- uint64_t v_i = 0; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_filter = 0; +- wuffs_base__slice_u8 v_s = {0}; +- wuffs_base__slice_u8 v_curr_row = {0}; +- wuffs_base__slice_u8 v_prev_row = {0}; +- uint8_t v_bits_unpacked[8] = {0}; +- uint8_t v_bits_packed = 0; +- uint8_t v_packs_remaining = 0; +- uint8_t v_multiplier = 0; +- uint8_t v_shift = 0; ++ uint32_t v_i = 0; ++ uint32_t v_hg = 0; ++ uint32_t v_h = 0; ++ uint16_t v_node = 0; ++ uint32_t v_pixel_g = 0; ++ uint32_t v_color = 0; ++ wuffs_base__slice_u8 v_dst_pixel = {0}; ++ uint32_t v_back_ref_len_n_bits = 0; ++ uint32_t v_back_ref_len_minus_1 = 0; ++ uint32_t v_back_ref_dist_n_bits = 0; ++ uint32_t v_back_ref_dist_sym = 0; ++ uint32_t v_back_ref_dist_premap_minus_1 = 0; ++ uint32_t v_back_ref_dist_minus_1 = 0; ++ uint32_t v_dm = 0; ++ uint32_t v_dx = 0; ++ uint32_t v_dy = 0; ++ uint64_t v_p_end = 0; ++ uint64_t v_dist4 = 0; ++ uint64_t v_q = 0; ++ wuffs_base__slice_u8 v_color_cache_pixels = {0}; ++ uint64_t v_color_cache_p = 0; ++ uint32_t v_color_cache_shift = 0; + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +- } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_src_bytes_per_pixel = 1u; +- if (self->private_impl.f_depth >= 8u) { +- v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)((self->private_impl.f_depth >> 3u)))); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u])); +- } else { +- v_y = self->private_impl.f_frame_rect_y0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_pixels_slow; ++ if (coro_susp_point) { ++ v_p = self->private_data.s_decode_pixels_slow.v_p; ++ v_p_max = self->private_data.s_decode_pixels_slow.v_p_max; ++ v_tile_size_log2 = self->private_data.s_decode_pixels_slow.v_tile_size_log2; ++ v_width_in_tiles = self->private_data.s_decode_pixels_slow.v_width_in_tiles; ++ v_x = self->private_data.s_decode_pixels_slow.v_x; ++ v_y = self->private_data.s_decode_pixels_slow.v_y; ++ v_hg = self->private_data.s_decode_pixels_slow.v_hg; ++ v_node = self->private_data.s_decode_pixels_slow.v_node; ++ v_color = self->private_data.s_decode_pixels_slow.v_color; ++ v_back_ref_len_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits; ++ v_back_ref_len_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1; ++ v_back_ref_dist_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits; ++ v_back_ref_dist_premap_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1; ++ v_color_cache_p = self->private_data.s_decode_pixels_slow.v_color_cache_p; + } +- while (v_y < self->private_impl.f_frame_rect_y1) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1); +- } +- if (1u > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); +- } +- v_filter = a_workbuf.ptr[0u]; +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); +- if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); +- } +- v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- if (v_filter == 0u) { +- } else if (v_filter == 1u) { +- wuffs_png__decoder__filter_1(self, v_curr_row); +- } else if (v_filter == 2u) { +- wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); +- } else if (v_filter == 3u) { +- wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); +- } else if (v_filter == 4u) { +- wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); +- } else { +- return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_p_max = ((uint64_t)((4u * a_width * a_height))); ++ if (((uint64_t)(a_dst.len)) < v_p_max) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; + } +- v_s = v_curr_row; +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u])); ++ if (a_tile_size_log2 != 0u) { ++ v_tile_size_log2 = a_tile_size_log2; ++ v_width_in_tiles = ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); + } else { +- v_x = self->private_impl.f_frame_rect_x0; ++ v_tile_size_log2 = 31u; ++ v_width_in_tiles = 1u; + } +- if (self->private_impl.f_depth == 8u) { +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_color_type == 4u) { +- if (2u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[0u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = v_s.ptr[1u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); +- } +- } else if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { +- if (self->private_impl.f_color_type == 0u) { +- if (1u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[0u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ while (v_p < v_p_max) { ++ v_i = ((uint32_t)(((uint32_t)(((uint32_t)(((uint32_t)((v_y >> v_tile_size_log2) * v_width_in_tiles)) + (v_x >> v_tile_size_log2))) * 4u)) + 1u)); ++ if (((uint64_t)(v_i)) < ((uint64_t)(a_tile_data.len))) { ++ v_hg = ((uint32_t)(a_tile_data.ptr[((uint64_t)(v_i))])); ++ } ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[0u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } else if (v_node > 6265u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_pixel_g = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_pixel_g < 256u) { ++ v_color = (v_pixel_g << 8u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[1u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } else { +- if (3u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[2u]; +- v_bits_unpacked[1u] = v_s.ptr[1u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 16u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[2u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel)); +- v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); +- } +- } else if (self->private_impl.f_depth < 8u) { +- v_multiplier = 1u; +- if (self->private_impl.f_color_type == 0u) { +- v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth]; +- } +- v_shift = ((8u - self->private_impl.f_depth) & 7u); +- v_packs_remaining = 0u; +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) { +- v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth]; +- v_bits_packed = v_s.ptr[0u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 0u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[3u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; + } +- v_bits_unpacked[0u] = ((uint8_t)((v_bits_packed >> v_shift) * v_multiplier)); +- v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth)); +- v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u)); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { +- v_bits_unpacked[1u] = v_bits_unpacked[0u]; +- v_bits_unpacked[2u] = v_bits_unpacked[0u]; +- v_bits_unpacked[3u] = 255u; +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); +- } else { +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1)); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); +- } +- } else { +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_color_type == 0u) { +- if (2u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[1u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[1u]; +- v_bits_unpacked[3u] = v_s.ptr[0u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = 255u; +- v_bits_unpacked[7u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); +- if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint64_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint64_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint64_t)(v_bits_unpacked[3u])) << 24u) | +- (((uint64_t)(v_bits_unpacked[4u])) << 32u) | +- (((uint64_t)(v_bits_unpacked[5u])) << 40u) | +- (((uint64_t)(v_bits_unpacked[6u])) << 48u) | +- (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- v_bits_unpacked[4u] = 0u; +- v_bits_unpacked[5u] = 0u; +- v_bits_unpacked[6u] = 0u; +- v_bits_unpacked[7u] = 0u; ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 24u); ++ } else if (v_pixel_g < 280u) { ++ if (v_pixel_g < 260u) { ++ v_back_ref_len_minus_1 = (v_pixel_g - 256u); ++ } else { ++ v_back_ref_len_n_bits = ((v_pixel_g - 258u) >> 1u); ++ v_back_ref_len_minus_1 = ((((uint32_t)(2u)) + (v_pixel_g & 1u)) << v_back_ref_len_n_bits); ++ while (self->private_impl.f_n_bits < v_back_ref_len_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; + } +- } else if (self->private_impl.f_color_type == 2u) { +- if (6u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[5u]; +- v_bits_unpacked[1u] = v_s.ptr[4u]; +- v_bits_unpacked[2u] = v_s.ptr[3u]; +- v_bits_unpacked[3u] = v_s.ptr[2u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = 255u; +- v_bits_unpacked[7u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); +- if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint64_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint64_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint64_t)(v_bits_unpacked[3u])) << 24u) | +- (((uint64_t)(v_bits_unpacked[4u])) << 32u) | +- (((uint64_t)(v_bits_unpacked[5u])) << 40u) | +- (((uint64_t)(v_bits_unpacked[6u])) << 48u) | +- (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- v_bits_unpacked[4u] = 0u; +- v_bits_unpacked[5u] = 0u; +- v_bits_unpacked[6u] = 0u; +- v_bits_unpacked[7u] = 0u; ++ if (self->private_impl.f_n_bits >= v_back_ref_len_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_back_ref_len_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_len_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_back_ref_len_n_bits; ++ self->private_impl.f_n_bits -= v_back_ref_len_n_bits; ++ } ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[4u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- } else if (self->private_impl.f_color_type == 4u) { +- if (4u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[1u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[1u]; +- v_bits_unpacked[3u] = v_s.ptr[0u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = v_s.ptr[3u]; +- v_bits_unpacked[7u] = v_s.ptr[2u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_back_ref_dist_sym = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_back_ref_dist_sym < 4u) { ++ v_back_ref_dist_premap_minus_1 = v_back_ref_dist_sym; ++ } else if (v_back_ref_dist_sym < 40u) { ++ v_back_ref_dist_n_bits = ((v_back_ref_dist_sym - 2u) >> 1u); ++ v_back_ref_dist_premap_minus_1 = ((((uint32_t)(2u)) + (v_back_ref_dist_sym & 1u)) << v_back_ref_dist_n_bits); ++ while (self->private_impl.f_n_bits < v_back_ref_dist_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- } else { +- if (8u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[5u]; +- v_bits_unpacked[1u] = v_s.ptr[4u]; +- v_bits_unpacked[2u] = v_s.ptr[3u]; +- v_bits_unpacked[3u] = v_s.ptr[2u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = v_s.ptr[7u]; +- v_bits_unpacked[7u] = v_s.ptr[6u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ if (self->private_impl.f_n_bits >= v_back_ref_dist_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; + } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8)); ++ v_back_ref_dist_premap_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_dist_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_back_ref_dist_n_bits; ++ self->private_impl.f_n_bits -= v_back_ref_dist_n_bits; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); ++ if (v_back_ref_dist_premap_minus_1 >= 120u) { ++ v_back_ref_dist_minus_1 = (v_back_ref_dist_premap_minus_1 - 120u); ++ } else { ++ v_dm = ((uint32_t)(WUFFS_WEBP__DISTANCE_MAP[v_back_ref_dist_premap_minus_1])); ++ v_dy = (v_dm >> 4u); ++ v_dx = ((uint32_t)(7u - (v_dm & 15u))); ++ v_back_ref_dist_minus_1 = ((uint32_t)((a_width * v_dy) + v_dx)); ++ } ++ v_p_end = (v_p + ((uint64_t)(((v_back_ref_len_minus_1 + 1u) * 4u)))); ++ v_dist4 = ((((uint64_t)(v_back_ref_dist_minus_1)) * 4u) + 4u); ++ if ((v_p_end > v_p_max) || (v_p_end > ((uint64_t)(a_dst.len))) || (v_p < v_dist4)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_back_reference); ++ goto exit; ++ } ++ v_q = (v_p - v_dist4); ++ while ((v_q < v_p) && (v_p < v_p_end)) { ++ a_dst.ptr[v_p] = a_dst.ptr[v_q]; ++ v_p += 1u; ++ v_q += 1u; ++ } ++ v_x += (v_back_ref_len_minus_1 + 1u); ++ while (v_x >= a_width) { ++ v_x -= a_width; ++ v_y += 1u; ++ } ++ continue; ++ } else { ++ if ((v_color_cache_p > v_p) || (v_p > ((uint64_t)(a_dst.len)))) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ v_color_cache_pixels = wuffs_base__slice_u8__subslice_ij(a_dst, v_color_cache_p, v_p); ++ v_color_cache_p = v_p; ++ v_color_cache_shift = ((32u - self->private_impl.f_color_cache_bits) & 31u); ++ while (((uint64_t)(v_color_cache_pixels.len)) >= 4u) { ++ v_color = wuffs_base__peek_u32le__no_bounds_check(v_color_cache_pixels.ptr); ++ self->private_data.f_color_cache[((((uint32_t)(v_color * 506832829u)) >> v_color_cache_shift) & 2047u)] = v_color; ++ v_color_cache_pixels = wuffs_base__slice_u8__subslice_i(v_color_cache_pixels, 4u); ++ } ++ v_color = self->private_data.f_color_cache[((v_pixel_g - 280u) & 2047u)]; ++ } ++ if (v_p > ((uint64_t)(a_dst.len))) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ v_dst_pixel = wuffs_base__slice_u8__subslice_i(a_dst, v_p); ++ if (((uint64_t)(v_dst_pixel.len)) < 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(v_dst_pixel.ptr, v_color); ++ v_p += 4u; ++ v_x += 1u; ++ if (v_x == a_width) { ++ v_x = 0u; ++ v_y += 1u; + } + } +- v_prev_row = v_curr_row; +- v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]); +- } +- return wuffs_base__make_status(NULL); +-} + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ goto ok; ++ ok: ++ self->private_impl.p_decode_pixels_slow = 0; ++ goto exit; ++ } + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_pixels_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_pixels_slow.v_p = v_p; ++ self->private_data.s_decode_pixels_slow.v_p_max = v_p_max; ++ self->private_data.s_decode_pixels_slow.v_tile_size_log2 = v_tile_size_log2; ++ self->private_data.s_decode_pixels_slow.v_width_in_tiles = v_width_in_tiles; ++ self->private_data.s_decode_pixels_slow.v_x = v_x; ++ self->private_data.s_decode_pixels_slow.v_y = v_y; ++ self->private_data.s_decode_pixels_slow.v_hg = v_hg; ++ self->private_data.s_decode_pixels_slow.v_node = v_node; ++ self->private_data.s_decode_pixels_slow.v_color = v_color; ++ self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits = v_back_ref_len_n_bits; ++ self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1 = v_back_ref_len_minus_1; ++ self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits = v_back_ref_dist_n_bits; ++ self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1 = v_back_ref_dist_premap_minus_1; ++ self->private_data.s_decode_pixels_slow.v_color_cache_p = v_color_cache_p; + +-// ---------------- Status Codes Implementations ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-const char wuffs_tga__error__bad_header[] = "#tga: bad header"; +-const char wuffs_tga__error__bad_run_length_encoding[] = "#tga: bad run length encoding"; +-const char wuffs_tga__error__truncated_input[] = "#tga: truncated input"; +-const char wuffs_tga__error__unsupported_tga_file[] = "#tga: unsupported TGA file"; ++ return status; ++} + +-// ---------------- Private Consts ++// -------- func webp.decoder.apply_transform_predictor + +-// ---------------- Private Initializer Prototypes ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_predictor( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data) { ++ uint64_t v_w4 = 0; ++ wuffs_base__slice_u8 v_prev_row = {0}; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_tiles_per_row = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_y = 0; ++ uint32_t v_x = 0; ++ uint64_t v_t = 0; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ uint8_t v_mode = 0; ++ uint32_t v_l0 = 0; ++ uint32_t v_l1 = 0; ++ uint32_t v_l2 = 0; ++ uint32_t v_l3 = 0; ++ uint32_t v_c0 = 0; ++ uint32_t v_c1 = 0; ++ uint32_t v_c2 = 0; ++ uint32_t v_c3 = 0; ++ uint32_t v_t0 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_t3 = 0; ++ uint32_t v_sum_l = 0; ++ uint32_t v_sum_t = 0; ++ ++ if ((self->private_impl.f_width <= 0u) || (self->private_impl.f_height <= 0u)) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_w4 = ((uint64_t)((self->private_impl.f_width * 4u))); ++ v_curr_row = wuffs_base__utility__empty_slice_u8(); ++ if (v_w4 <= ((uint64_t)(a_pix.len))) { ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_pix, v_w4); ++ } ++ if (((uint64_t)(v_curr_row.len)) >= 4u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[3u] += 255u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ while (((uint64_t)(v_curr_row.len)) >= 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_curr_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_curr_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_curr_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_curr_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u); ++ } ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[0u])); ++ v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); ++ v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_y = 1u; ++ while (v_y < self->private_impl.f_height) { ++ v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row))); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_t <= ((uint64_t)(a_tile_data.len))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t); ++ if (((uint64_t)(v_tile_data.len)) >= 4u) { ++ v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u)); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ } ++ if (v_w4 <= ((uint64_t)(a_pix.len))) { ++ v_prev_row = a_pix; ++ a_pix = wuffs_base__slice_u8__subslice_i(a_pix, v_w4); ++ v_curr_row = a_pix; ++ } ++ if ((((uint64_t)(v_prev_row.len)) >= 4u) && (((uint64_t)(v_curr_row.len)) >= 4u)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[0u] += v_prev_row.ptr[0u]; ++ v_curr_row.ptr[1u] += v_prev_row.ptr[1u]; ++ v_curr_row.ptr[2u] += v_prev_row.ptr[2u]; ++ v_curr_row.ptr[3u] += v_prev_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_x = 1u; ++ while (v_x < self->private_impl.f_width) { ++ if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) { ++ v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u)); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ if ((((uint64_t)(v_prev_row.len)) < 12u) || (((uint64_t)(v_curr_row.len)) < 8u)) { ++ break; ++ } ++ if (v_mode == 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[7u] += 255u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 1u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_curr_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_curr_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_curr_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_curr_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 2u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[4u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[5u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[6u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[7u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 3u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[8u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[9u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[10u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[11u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 4u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 5u) { ++ v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u); ++ v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u); ++ v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u); ++ v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 6u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 7u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 9u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 10u) { ++ v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u); ++ v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u); ++ v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u); ++ v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u); ++ v_t0 = ((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u); ++ v_t1 = ((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u); ++ v_t2 = ((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u); ++ v_t3 = ((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 11u) { ++ v_l0 = ((uint32_t)(v_curr_row.ptr[0u])); ++ v_l1 = ((uint32_t)(v_curr_row.ptr[1u])); ++ v_l2 = ((uint32_t)(v_curr_row.ptr[2u])); ++ v_l3 = ((uint32_t)(v_curr_row.ptr[3u])); ++ v_c0 = ((uint32_t)(v_prev_row.ptr[0u])); ++ v_c1 = ((uint32_t)(v_prev_row.ptr[1u])); ++ v_c2 = ((uint32_t)(v_prev_row.ptr[2u])); ++ v_c3 = ((uint32_t)(v_prev_row.ptr[3u])); ++ v_t0 = ((uint32_t)(v_prev_row.ptr[4u])); ++ v_t1 = ((uint32_t)(v_prev_row.ptr[5u])); ++ v_t2 = ((uint32_t)(v_prev_row.ptr[6u])); ++ v_t3 = ((uint32_t)(v_prev_row.ptr[7u])); ++ v_sum_l = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_t0) + ++ wuffs_webp__decoder__absolute_difference(self, v_c1, v_t1) + ++ wuffs_webp__decoder__absolute_difference(self, v_c2, v_t2) + ++ wuffs_webp__decoder__absolute_difference(self, v_c3, v_t3)); ++ v_sum_t = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_l0) + ++ wuffs_webp__decoder__absolute_difference(self, v_c1, v_l1) + ++ wuffs_webp__decoder__absolute_difference(self, v_c2, v_l2) + ++ wuffs_webp__decoder__absolute_difference(self, v_c3, v_l3)); ++ if (v_sum_l < v_sum_t) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(v_l0)); ++ v_curr_row.ptr[5u] += ((uint8_t)(v_l1)); ++ v_curr_row.ptr[6u] += ((uint8_t)(v_l2)); ++ v_curr_row.ptr[7u] += ((uint8_t)(v_l3)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(v_t0)); ++ v_curr_row.ptr[5u] += ((uint8_t)(v_t1)); ++ v_curr_row.ptr[6u] += ((uint8_t)(v_t2)); ++ v_curr_row.ptr[7u] += ((uint8_t)(v_t3)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } else if (v_mode == 12u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]); ++ v_curr_row.ptr[5u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]); ++ v_curr_row.ptr[6u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]); ++ v_curr_row.ptr[7u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 13u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]); ++ v_curr_row.ptr[5u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]); ++ v_curr_row.ptr[6u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]); ++ v_curr_row.ptr[7u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u); ++ v_prev_row = wuffs_base__slice_u8__subslice_i(v_prev_row, 4u); ++ v_x += 1u; ++ } ++ v_y += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} + +-// ---------------- Private Function Prototypes ++// -------- func webp.decoder.absolute_difference + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_image_config( +- wuffs_tga__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++static uint32_t ++wuffs_webp__decoder__absolute_difference( ++ const wuffs_webp__decoder* self, ++ uint32_t a_a, ++ uint32_t a_b) { ++ if (a_a < a_b) { ++ return (a_b - a_a); ++ } ++ return (a_a - a_b); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame_config( +- wuffs_tga__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++// -------- func webp.decoder.mode12 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame( +- wuffs_tga__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++static uint8_t ++wuffs_webp__decoder__mode12( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl) { ++ uint32_t v_v = 0; + +-// ---------------- VTables ++ v_v = ((uint32_t)((((uint32_t)(a_l)) + ((uint32_t)(a_t))) - ((uint32_t)(a_tl)))); ++ if (v_v < 256u) { ++ return ((uint8_t)(v_v)); ++ } else if (v_v < 512u) { ++ return 255u; ++ } ++ return 0u; ++} + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_tga__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_tga__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_tga__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_tga__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_tga__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_tga__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_tga__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_tga__decoder__workbuf_len), +-}; ++// -------- func webp.decoder.mode13 + +-// ---------------- Initializer Implementations ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode13( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl) { ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ uint32_t v_z = 0; ++ uint32_t v_v = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_tga__decoder__initialize( +- wuffs_tga__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ v_x = ((((uint32_t)(a_l)) + ((uint32_t)(a_t))) / 2u); ++ v_y = ((uint32_t)(a_tl)); ++ v_z = ((uint32_t)(v_x - v_y)); ++ v_v = ((uint32_t)(v_x + wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(v_z + (v_z >> 31u))), 1u))); ++ if (v_v < 256u) { ++ return ((uint8_t)(v_v)); ++ } else if (v_v < 512u) { ++ return 255u; + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ return 0u; ++} ++ ++// -------- func webp.decoder.apply_transform_cross_color ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_cross_color( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data) { ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_tiles_per_row = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_y = 0; ++ uint32_t v_x = 0; ++ uint64_t v_t = 0; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ uint32_t v_g2r = 0; ++ uint32_t v_g2b = 0; ++ uint32_t v_r2b = 0; ++ uint8_t v_b = 0; ++ uint8_t v_g = 0; ++ uint8_t v_r = 0; ++ ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[1u])); ++ v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); ++ v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_y = 0u; ++ while (v_y < self->private_impl.f_height) { ++ v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row))); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_t <= ((uint64_t)(a_tile_data.len))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t); ++ } ++ v_x = 0u; ++ while (v_x < self->private_impl.f_width) { ++ if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) { ++ v_g2r = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[0u]); ++ v_g2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[1u]); ++ v_r2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[2u]); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ if (((uint64_t)(a_pix.len)) >= 4u) { ++ v_b = a_pix.ptr[0u]; ++ v_g = a_pix.ptr[1u]; ++ v_r = a_pix.ptr[2u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_r += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2r)) >> 5u))); ++ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2b)) >> 5u))); ++ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_r) * v_r2b)) >> 5u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ a_pix.ptr[0u] = v_b; ++ a_pix.ptr[2u] = v_r; ++ a_pix = wuffs_base__slice_u8__subslice_i(a_pix, 4u); ++ } ++ v_x += 1u; ++ } ++ v_y += 1u; + } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func webp.decoder.apply_transform_subtract_green ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_subtract_green( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8_t v_g = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) ++ { ++ wuffs_base__slice_u8 i_slice_p = a_pix; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 4; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 4) * 4)); ++ while (v_p.ptr < i_end0_p) { ++ v_g = v_p.ptr[1u]; ++#if defined(__GNUC__) + #pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#pragma GCC diagnostic ignored "-Wconversion" + #endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) ++ v_p.ptr[0u] += v_g; ++ v_p.ptr[2u] += v_g; ++#if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_p.ptr += 4; + } ++ v_p.len = 0; + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-wuffs_tga__decoder* +-wuffs_tga__decoder__alloc(void) { +- wuffs_tga__decoder* x = +- (wuffs_tga__decoder*)(calloc(sizeof(wuffs_tga__decoder), 1)); +- if (!x) { +- return NULL; ++// -------- func webp.decoder.apply_transform_color_indexing ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_color_indexing( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix) { ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_bits_per_pixel = 0; ++ uint32_t v_x_mask = 0; ++ uint32_t v_s_mask = 0; ++ uint64_t v_src_index = 0; ++ uint32_t v_y = 0; ++ uint64_t v_di = 0; ++ uint64_t v_dj = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_x = 0; ++ uint32_t v_s = 0; ++ uint32_t v_p = 0; ++ uint8_t v_p0 = 0; ++ uint8_t v_p1 = 0; ++ uint8_t v_p2 = 0; ++ uint8_t v_p3 = 0; ++ ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u])); ++ if (v_tile_size_log2 == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_dst = a_pix; ++ v_dst.ptr = i_slice_dst.ptr; ++ v_dst.len = 4; ++ const uint8_t* i_end0_dst = wuffs_private_impl__ptr_u8_plus_len(v_dst.ptr, (((i_slice_dst.len - (size_t)(v_dst.ptr - i_slice_dst.ptr)) / 4) * 4)); ++ while (v_dst.ptr < i_end0_dst) { ++ v_p = (((uint32_t)(v_dst.ptr[1u])) * 4u); ++ v_p0 = self->private_data.f_palette[(v_p + 0u)]; ++ v_p1 = self->private_data.f_palette[(v_p + 1u)]; ++ v_p2 = self->private_data.f_palette[(v_p + 2u)]; ++ v_p3 = self->private_data.f_palette[(v_p + 3u)]; ++ v_dst.ptr[0u] = v_p0; ++ v_dst.ptr[1u] = v_p1; ++ v_dst.ptr[2u] = v_p2; ++ v_dst.ptr[3u] = v_p3; ++ v_dst.ptr += 4; ++ } ++ v_dst.len = 0; ++ } ++ return wuffs_base__make_empty_struct(); + } +- if (wuffs_tga__decoder__initialize( +- x, sizeof(wuffs_tga__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2); ++ v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_s_mask = ((((uint32_t)(1u)) << v_bits_per_pixel) - 1u); ++ v_src_index = ((uint64_t)((self->private_impl.f_workbuf_offset_for_color_indexing + 1u))); ++ v_y = 0u; ++ while (v_y < self->private_impl.f_height) { ++ v_di = ((uint64_t)((4u * (v_y + 0u) * self->private_impl.f_width))); ++ v_dj = ((uint64_t)((4u * (v_y + 1u) * self->private_impl.f_width))); ++ if ((v_di > v_dj) || (v_dj > ((uint64_t)(a_pix.len)))) { ++ break; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_ij(a_pix, v_di, v_dj); ++ v_x = 0u; ++ while (((uint64_t)(v_dst.len)) >= 4u) { ++ if (((v_x & v_x_mask) == 0u) && (v_src_index < ((uint64_t)(a_pix.len)))) { ++ v_s = ((uint32_t)(a_pix.ptr[v_src_index])); ++ v_src_index += 4u; ++ } ++ v_p = ((v_s & v_s_mask) * 4u); ++ v_s >>= v_bits_per_pixel; ++ v_p0 = self->private_data.f_palette[(v_p + 0u)]; ++ v_p1 = self->private_data.f_palette[(v_p + 1u)]; ++ v_p2 = self->private_data.f_palette[(v_p + 2u)]; ++ v_p3 = self->private_data.f_palette[(v_p + 3u)]; ++ v_dst.ptr[0u] = v_p0; ++ v_dst.ptr[1u] = v_p1; ++ v_dst.ptr[2u] = v_p2; ++ v_dst.ptr[3u] = v_p3; ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, 4u); ++ v_x += 1u; ++ } ++ v_y += 1u; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_tga__decoder(void) { +- return sizeof(wuffs_tga__decoder); ++ return wuffs_base__make_empty_struct(); + } + +-// ---------------- Function Implementations +- +-// -------- func tga.decoder.get_quirk ++// -------- func webp.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__get_quirk( +- const wuffs_tga__decoder* self, ++wuffs_webp__decoder__get_quirk( ++ const wuffs_webp__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -59162,12 +73627,12 @@ wuffs_tga__decoder__get_quirk( + return 0u; + } + +-// -------- func tga.decoder.set_quirk ++// -------- func webp.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__set_quirk( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__set_quirk( ++ wuffs_webp__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -59183,12 +73648,12 @@ wuffs_tga__decoder__set_quirk( + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func tga.decoder.decode_image_config ++// -------- func webp.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_image_config( ++ wuffs_webp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -59214,17 +73679,17 @@ wuffs_tga__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_image_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -59232,13 +73697,13 @@ wuffs_tga__decoder__decode_image_config( + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; +@@ -59249,19 +73714,19 @@ wuffs_tga__decoder__decode_image_config( + return status; + } + +-// -------- func tga.decoder.do_decode_image_config ++// -------- func webp.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__do_decode_image_config( ++ wuffs_webp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_c = 0; +- uint32_t v_c5 = 0; +- uint32_t v_i = 0; ++ uint32_t v_c32 = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -59274,10 +73739,7 @@ wuffs_tga__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_decode_image_config[0].v_i; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +@@ -59287,411 +73749,446 @@ wuffs_tga__decoder__do_decode_image_config( + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- self->private_impl.f_header_id_length = t_0; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- self->private_impl.f_header_color_map_type = t_1; +- } +- if (self->private_impl.f_header_color_map_type > 1u) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_impl.f_header_image_type = t_2; +- } +- if ((self->private_impl.f_header_image_type == 1u) || +- (self->private_impl.f_header_image_type == 2u) || +- (self->private_impl.f_header_image_type == 3u) || +- (self->private_impl.f_header_image_type == 9u) || +- (self->private_impl.f_header_image_type == 10u) || +- (self->private_impl.f_header_image_type == 11u)) { +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint16_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint16_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); + break; + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_header_color_map_first_entry_index = t_3; ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1179011410u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint16_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint16_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); + break; + } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } +- self->private_impl.f_header_color_map_length = t_4; ++ self->private_impl.f_riff_chunk_length = t_1; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- self->private_impl.f_header_color_map_entry_size = t_5; ++ if ((self->private_impl.f_riff_chunk_length & 1u) != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } +- if (self->private_impl.f_header_color_map_type != 0u) { +- if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; +- } else if ((self->private_impl.f_header_color_map_entry_size != 15u) && +- (self->private_impl.f_header_color_map_entry_size != 16u) && +- (self->private_impl.f_header_color_map_entry_size != 24u) && +- (self->private_impl.f_header_color_map_entry_size != 32u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; ++ while (true) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_riff_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_webp__decoder__do_decode_image_config_limited(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_riff_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } + } +- } else { +- if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length != 0u) || (self->private_impl.f_header_color_map_entry_size != 0u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_riff_chunk_length == 0u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__short_chunk); + goto exit; + } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } +- self->private_data.s_do_decode_image_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ false); + } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_image_config_limited ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); + break; + } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)) << 56; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_width = t_6; ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1346520407u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- uint32_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; +- if (num_bits_7 == 8) { +- t_7 = ((uint32_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); + break; + } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } +- self->private_impl.f_height = t_7; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_8 = *iop_a_src++; +- self->private_impl.f_header_pixel_depth = t_8; ++ v_c32 = t_1; + } +- if ((self->private_impl.f_header_pixel_depth != 1u) && +- (self->private_impl.f_header_pixel_depth != 8u) && +- (self->private_impl.f_header_pixel_depth != 15u) && +- (self->private_impl.f_header_pixel_depth != 16u) && +- (self->private_impl.f_header_pixel_depth != 24u) && +- (self->private_impl.f_header_pixel_depth != 32u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ if (v_c32 == 540561494u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file); + goto exit; +- } +- if ((self->private_impl.f_header_image_type | 8u) == 9u) { +- self->private_impl.f_scratch_bytes_per_pixel = 1u; +- self->private_impl.f_src_bytes_per_pixel = 1u; +- self->private_impl.f_src_pixfmt = 2164523016u; +- self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15u) || (self->private_impl.f_header_color_map_entry_size == 24u)); +- } else if ((self->private_impl.f_header_image_type | 8u) == 10u) { +- if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) { +- self->private_impl.f_scratch_bytes_per_pixel = 4u; +- self->private_impl.f_src_bytes_per_pixel = 0u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else if (self->private_impl.f_header_pixel_depth == 24u) { +- self->private_impl.f_scratch_bytes_per_pixel = 3u; +- self->private_impl.f_src_bytes_per_pixel = 3u; +- self->private_impl.f_src_pixfmt = 2147485832u; +- self->private_impl.f_opaque = true; +- } else if (self->private_impl.f_header_pixel_depth == 32u) { +- self->private_impl.f_scratch_bytes_per_pixel = 4u; +- self->private_impl.f_src_bytes_per_pixel = 4u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; ++ } else if (v_c32 == 1278758998u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_sub_chunk_length = t_2; + } +- } else { +- if (self->private_impl.f_header_pixel_depth == 8u) { +- self->private_impl.f_scratch_bytes_per_pixel = 1u; +- self->private_impl.f_src_bytes_per_pixel = 1u; +- self->private_impl.f_src_pixfmt = 536870920u; +- self->private_impl.f_opaque = true; +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ if (self->private_impl.f_sub_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); + goto exit; + } +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_9 = *iop_a_src++; +- self->private_impl.f_header_image_descriptor = t_9; +- } +- if ((self->private_impl.f_header_image_descriptor & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_header_id_length)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- if (self->private_impl.f_header_color_map_type != 0u) { +- while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) { +- if (self->private_impl.f_header_color_map_entry_size == 24u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); +- uint32_t t_10; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; +- if (num_bits_10 == 16) { +- t_10 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_10 += 8u; +- *scratch |= ((uint64_t)(num_bits_10)) << 56; +- } +- } +- v_c = t_10; ++ self->private_impl.f_sub_chunk_has_padding = ((self->private_impl.f_sub_chunk_length & 1u) != 0u); ++ while (true) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_sub_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; + } +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c >> 8u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c >> 16u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; +- } else if (self->private_impl.f_header_color_map_entry_size == 32u) { ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); +- uint32_t t_11; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; +- if (num_bits_11 == 24) { +- t_11 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_11 += 8u; +- *scratch |= ((uint64_t)(num_bits_11)) << 56; +- } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_c = t_11; +- } +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c >> 8u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c >> 16u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c >> 24u))); +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); +- uint32_t t_12; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; +- if (num_bits_12 == 8) { +- t_12 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_12 += 8u; +- *scratch |= ((uint64_t)(num_bits_12)) << 56; +- } ++ wuffs_base__status t_3 = wuffs_webp__decoder__do_decode_image_config_limited_vp8l(self, a_src); ++ v_status = t_3; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_c = t_12; + } +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_sub_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_sub_chunk_length == 0u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__short_chunk); ++ goto exit; + } +- v_i += 1u; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u; +- v_i += 1u; ++ } else if (v_c32 == 1480085590u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; ++ } ++ ++ ok: ++ self->private_impl.p_do_decode_image_config_limited = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config_limited = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_image_config_limited_vp8l ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited_vp8l( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint32_t v_transform_size = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited_vp8l; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint32_t t_0 = *iop_a_src++; ++ v_c32 = t_0; + } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_src_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_opaque); ++ if (v_c32 != 47u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } +- self->private_impl.f_call_sequence = 32u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config_limited_vp8l.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited_vp8l.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; ++ } ++ self->private_impl.f_width = ((v_c32 & 16383u) + 1u); ++ v_c32 >>= 14u; ++ self->private_impl.f_height = ((v_c32 & 16383u) + 1u); ++ v_c32 >>= 14u; ++ self->private_impl.f_pixfmt = 2415954056u; ++ if ((v_c32 & 1u) != 0u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } ++ v_c32 >>= 1u; ++ if (v_c32 != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; ++ } ++ v_transform_size = (4u * ((self->private_impl.f_width + 3u) >> 2u) * ((self->private_impl.f_height + 3u) >> 2u)); ++ self->private_impl.f_workbuf_offset_for_transform[0u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (0u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[1u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (1u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[2u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (2u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[3u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (3u * v_transform_size)); + + goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_do_decode_image_config_limited_vp8l = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_i = v_i; ++ self->private_impl.p_do_decode_image_config_limited_vp8l = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -59702,12 +74199,12 @@ wuffs_tga__decoder__do_decode_image_config( + return status; + } + +-// -------- func tga.decoder.decode_frame_config ++// -------- func webp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_frame_config( ++ wuffs_webp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -59733,17 +74230,17 @@ wuffs_tga__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -59751,13 +74248,13 @@ wuffs_tga__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; +@@ -59768,12 +74265,12 @@ wuffs_tga__decoder__decode_frame_config( + return status; + } + +-// -------- func tga.decoder.do_decode_frame_config ++// -------- func webp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__do_decode_frame_config( ++ wuffs_webp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); +@@ -59789,7 +74286,7 @@ wuffs_tga__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +@@ -59799,7 +74296,7 @@ wuffs_tga__decoder__do_decode_frame_config( + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_tga__decoder__do_decode_image_config(self, NULL, a_src); ++ status = wuffs_webp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +@@ -59831,20 +74328,20 @@ wuffs_tga__decoder__do_decode_frame_config( + 0u, + self->private_impl.f_frame_config_io_position, + 0u, +- self->private_impl.f_opaque, + false, +- 4278190080u); ++ false, ++ 0u); + } + self->private_impl.f_call_sequence = 64u; + + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -59855,12 +74352,12 @@ wuffs_tga__decoder__do_decode_frame_config( + return status; + } + +-// -------- func tga.decoder.decode_frame ++// -------- func webp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_frame( ++ wuffs_webp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -59889,13 +74386,13 @@ wuffs_tga__decoder__decode_frame( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame(self, ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, +@@ -59904,64 +74401,627 @@ wuffs_tga__decoder__decode_frame( + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_has_more = 0; ++ uint32_t v_width = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__slice_u8 v_pix = {0}; ++ uint32_t v_which = 0; ++ uint32_t v_transform_type = 0; ++ uint64_t v_ti = 0; ++ uint64_t v_tj = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_width = self->private_data.s_do_decode_frame.v_width; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_seen_transform[0u] = false; ++ self->private_impl.f_seen_transform[1u] = false; ++ self->private_impl.f_seen_transform[2u] = false; ++ self->private_impl.f_seen_transform[3u] = false; ++ self->private_impl.f_n_transforms = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_has_more = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_has_more == 0u) { ++ break; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_transform(self, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_width = self->private_impl.f_width; ++ if (self->private_impl.f_seen_transform[3u]) { ++ v_width = self->private_impl.f_color_indexing_width; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_overall_color_cache_bits = self->private_impl.f_color_cache_bits; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ status = wuffs_webp__decoder__decode_hg_table(self, a_src, v_width, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_color_cache_bits = self->private_impl.f_overall_color_cache_bits; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, self->private_impl.f_overall_n_huffman_groups); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ while (true) { ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))); ++ v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_webp__decoder__decode_pixels(self, ++ v_dst, ++ a_src, ++ v_width, ++ self->private_impl.f_height, ++ v_tile_data, ++ self->private_impl.f_overall_tile_size_log2); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ } ++ if (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_pix = wuffs_base__slice_u8__subslice_j(a_workbuf, ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))); ++ v_which = self->private_impl.f_n_transforms; ++ while (v_which > 0u) { ++ v_which -= 1u; ++ v_transform_type = ((uint32_t)(self->private_impl.f_transform_type[v_which])); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_transform_type < 2u) { ++ v_ti = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])); ++ v_tj = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])); ++ if ((v_ti <= v_tj) && (v_tj <= ((uint64_t)(a_workbuf.len)))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, v_ti, v_tj); ++ } ++ } ++ if (v_transform_type == 0u) { ++ wuffs_webp__decoder__apply_transform_predictor(self, v_pix, v_tile_data); ++ } else if (v_transform_type == 1u) { ++ wuffs_webp__decoder__apply_transform_cross_color(self, v_pix, v_tile_data); ++ } else if (v_transform_type == 2u) { ++ wuffs_webp__decoder__apply_transform_subtract_green(self, v_pix); ++ } else { ++ wuffs_webp__decoder__apply_transform_color_indexing(self, v_pix); ++ v_width = self->private_impl.f_width; ++ } ++ } ++ v_status = wuffs_webp__decoder__swizzle(self, a_dst, v_pix, a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_width = v_width; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.decode_transform ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_transform( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint32_t v_transform_type = 0; ++ uint32_t v_tile_size_log2 = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_transform; ++ if (coro_susp_point) { ++ v_transform_type = self->private_data.s_decode_transform.v_transform_type; ++ v_tile_size_log2 = self->private_data.s_decode_transform.v_tile_size_log2; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 2u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_transform_type = (self->private_impl.f_bits & 3u); ++ self->private_impl.f_bits >>= 2u; ++ self->private_impl.f_n_bits -= 2u; ++ if (self->private_impl.f_seen_transform[v_transform_type] || (self->private_impl.f_n_transforms >= 4u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_transform); ++ goto exit; ++ } else if (self->private_impl.f_seen_transform[3u]) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_transform_after_color_indexing_transform); ++ goto exit; ++ } ++ self->private_impl.f_seen_transform[v_transform_type] = true; ++ self->private_impl.f_transform_type[self->private_impl.f_n_transforms] = ((uint8_t)(v_transform_type)); ++ self->private_impl.f_n_transforms += 1u; ++ if (v_transform_type < 2u) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u); ++ self->private_impl.f_transform_tile_size_log2[v_transform_type] = ((uint8_t)(v_tile_size_log2)); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ while (true) { ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))), ++ a_src, ++ ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ } else if (v_transform_type == 2u) { ++ } else { ++ if (self->private_impl.f_n_bits < 8u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (self->private_impl.f_n_bits >= 8u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ self->private_impl.f_color_indexing_palette_size = ((self->private_impl.f_bits & 255u) + 1u); ++ self->private_impl.f_bits >>= 8u; ++ self->private_impl.f_n_bits -= 8u; ++ if (self->private_impl.f_color_indexing_palette_size <= 2u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 7u) / 8u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 3u; ++ } else if (self->private_impl.f_color_indexing_palette_size <= 4u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 3u) / 4u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 2u; ++ } else if (self->private_impl.f_color_indexing_palette_size <= 16u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 1u) / 2u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 1u; ++ } else { ++ self->private_impl.f_color_indexing_width = self->private_impl.f_width; ++ self->private_impl.f_transform_tile_size_log2[3u] = 0u; ++ } ++ if (self->private_impl.f_width >= self->private_impl.f_color_indexing_width) { ++ self->private_impl.f_workbuf_offset_for_color_indexing = (4u * (self->private_impl.f_width - self->private_impl.f_color_indexing_width) * self->private_impl.f_height); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)), ++ a_src, ++ self->private_impl.f_color_indexing_palette_size, ++ 1u, ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ wuffs_private_impl__bulk_memset(&self->private_data.f_palette[(4u * self->private_impl.f_color_indexing_palette_size)], (1024u - (4u * self->private_impl.f_color_indexing_palette_size)), 0u); ++ v_p = wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)); ++ while (((uint64_t)(v_p.len)) >= 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_p.ptr[4u] += v_p.ptr[0u]; ++ v_p.ptr[5u] += v_p.ptr[1u]; ++ v_p.ptr[6u] += v_p.ptr[2u]; ++ v_p.ptr[7u] += v_p.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u); ++ } ++ } ++ ++ ok: ++ self->private_impl.p_decode_transform = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_transform = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_transform.v_transform_type = v_transform_type; ++ self->private_data.s_decode_transform.v_tile_size_log2 = v_tile_size_log2; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.decode_color_cache_parameters ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_color_cache_parameters( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_color_cache = 0; ++ uint32_t v_color_cache_bits = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_color_cache_parameters; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_color_cache = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_color_cache_bits = 0u; ++ if (v_use_color_cache != 0u) { ++ if (self->private_impl.f_n_bits < 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_color_cache_bits = (self->private_impl.f_bits & 15u); ++ self->private_impl.f_bits >>= 4u; ++ self->private_impl.f_n_bits -= 4u; ++ if ((v_color_cache_bits < 1u) || (11u < v_color_cache_bits)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_color_cache); + goto exit; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_impl.f_color_cache_bits = v_color_cache_bits; + } + ++ goto ok; + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_decode_color_cache_parameters = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_decode_color_cache_parameters = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func tga.decoder.do_decode_frame ++// -------- func webp.decoder.decode_hg_table + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame( +- wuffs_tga__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_webp__decoder__decode_hg_table( ++ wuffs_webp__decoder* self, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ uint32_t a_width, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint32_t v_dst_x = 0; +- uint32_t v_dst_y = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_dst_start = 0; +- wuffs_base__slice_u8 v_src_palette = {0}; +- uint64_t v_mark = 0; +- uint64_t v_num_pixels64 = 0; +- uint32_t v_num_pixels32 = 0; +- uint32_t v_lit_length = 0; +- uint32_t v_run_length = 0; +- uint64_t v_num_dst_bytes = 0; +- uint32_t v_num_src_bytes = 0; +- uint32_t v_c = 0; +- uint32_t v_c5 = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_use_hg_table = 0; ++ uint32_t v_tile_size_log2 = 0; ++ wuffs_base__slice_u8 v_hg_pixels = {0}; ++ uint64_t v_n = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_hg_plus_1 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -59974,276 +75034,155 @@ wuffs_tga__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_hg_table; + if (coro_susp_point) { +- v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; +- v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; +- v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; +- v_mark = self->private_data.s_do_decode_frame[0].v_mark; +- v_num_pixels32 = self->private_data.s_do_decode_frame[0].v_num_pixels32; +- v_lit_length = self->private_data.s_do_decode_frame[0].v_lit_length; +- v_run_length = self->private_data.s_do_decode_frame[0].v_run_length; +- v_num_dst_bytes = self->private_data.s_do_decode_frame[0].v_num_dst_bytes; ++ v_tile_size_log2 = self->private_data.s_decode_hg_table.v_tile_size_log2; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_tga__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_hg_table = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_use_hg_table == 0u) { ++ self->private_impl.f_overall_n_huffman_groups = 1u; ++ self->private_impl.f_overall_tile_size_log2 = 0u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ if (((uint64_t)(v_hg_pixels.len)) >= 4u) { ++ v_hg_pixels.ptr[0u] = 0u; ++ v_hg_pixels.ptr[1u] = 0u; ++ v_hg_pixels.ptr[2u] = 0u; ++ v_hg_pixels.ptr[3u] = 0u; + } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ status = wuffs_base__make_status(NULL); + goto ok; + } +- if (self->private_impl.f_header_color_map_type != 0u) { +- v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024); +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- v_src_palette, +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); + goto exit; + } +- goto ok; ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; + } +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; ++ v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ self->private_impl.f_overall_tile_size_log2 = v_tile_size_log2; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- if ((self->private_impl.f_header_image_descriptor & 32u) == 0u) { +- v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- if ((self->private_impl.f_header_image_type & 8u) == 0u) { +- v_lit_length = self->private_impl.f_width; ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } +- label__resume__continue:; + while (true) { +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- while (v_dst_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); +- if (v_dst_start <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- while (v_dst_x < self->private_impl.f_width) { +- if (self->private_impl.f_src_bytes_per_pixel > 0u) { +- if (v_lit_length > 0u) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel))); +- v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length))))); +- v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel); +- v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel); +- self->private_data.s_do_decode_frame[0].scratch = v_num_src_bytes; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- v_dst_x += v_num_pixels32; +- v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u); +- if (v_lit_length > 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__resume__continue; +- } +- } else if (v_run_length > 0u) { +- v_run_length -= 1u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- goto label__resume__continue; +- } +- if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { +- v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); +- iop_a_src += 1u; +- if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } else { +- if (self->private_impl.f_src_bytes_per_pixel == 1u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } else if (self->private_impl.f_src_bytes_per_pixel == 3u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } +- if ((v_run_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } +- } +- } else { +- if (v_lit_length > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__resume__continue; +- } +- v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_scratch[3u] = 255u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, 4)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- v_lit_length -= 1u; +- } else if (v_run_length > 0u) { +- v_run_length -= 1u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__resume__continue; +- } +- if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { +- v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); +- iop_a_src += 1u; +- if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_scratch[3u] = 255u; +- if ((v_run_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } +- } +- } +- } +- v_dst_x = 0u; +- if ((self->private_impl.f_header_image_descriptor & 32u) == 0u) { +- v_dst_y -= 1u; +- } else { +- v_dst_y += 1u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if ((self->private_impl.f_header_image_type & 8u) == 0u) { +- v_lit_length = self->private_impl.f_width; ++ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))), ++ a_src, ++ ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } +- break; ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ self->private_impl.f_overall_n_huffman_groups = 1u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ v_n = ((uint64_t)((((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * 4u))); ++ if (v_n > ((uint64_t)(v_hg_pixels.len))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_p = wuffs_base__slice_u8__subslice_j(v_hg_pixels, v_n); ++ while (((uint64_t)(v_p.len)) >= 4u) { ++ if (v_p.ptr[2u] != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_number_of_huffman_groups); ++ goto exit; ++ } ++ v_hg_plus_1 = (((uint32_t)(v_p.ptr[1u])) + 1u); ++ if (self->private_impl.f_overall_n_huffman_groups < v_hg_plus_1) { ++ self->private_impl.f_overall_n_huffman_groups = v_hg_plus_1; ++ } ++ v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u); + } +- self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_hg_table = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; +- self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; +- self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; +- self->private_data.s_do_decode_frame[0].v_mark = v_mark; +- self->private_data.s_do_decode_frame[0].v_num_pixels32 = v_num_pixels32; +- self->private_data.s_do_decode_frame[0].v_lit_length = v_lit_length; +- self->private_data.s_do_decode_frame[0].v_run_length = v_run_length; +- self->private_data.s_do_decode_frame[0].v_num_dst_bytes = v_num_dst_bytes; ++ self->private_impl.p_decode_hg_table = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_hg_table.v_tile_size_log2 = v_tile_size_log2; + + goto exit; + exit: +@@ -60254,12 +75193,117 @@ wuffs_tga__decoder__do_decode_frame( + return status; + } + +-// -------- func tga.decoder.frame_dirty_rect ++// -------- func webp.decoder.decode_pixels ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_pixels; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_i = 0u; ++ v_n = (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits); ++ while (v_i < v_n) { ++ self->private_data.f_color_cache[v_i] = 0u; ++ v_i += 1u; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__decode_pixels_slow(self, ++ a_dst, ++ a_src, ++ a_width, ++ a_height, ++ a_tile_data, ++ a_tile_size_log2); ++ if (status.repr) { ++ goto suspend; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_pixels = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_pixels = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func webp.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__swizzle( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_src, ++ wuffs_base__pixel_blend a_blend) { ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_src_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_y = 0; ++ ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ return wuffs_private_impl__status__ensure_not_a_suspension(v_status); ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_src_bytes_per_row = ((uint64_t)((self->private_impl.f_width * 4u))); ++ while (v_src_bytes_per_row <= ((uint64_t)(a_src.len))) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(a_src, v_src_bytes_per_row)); ++ a_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_bytes_per_row); ++ v_y += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func webp.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_tga__decoder__frame_dirty_rect( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__frame_dirty_rect( ++ const wuffs_webp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } +@@ -60275,12 +75319,12 @@ wuffs_tga__decoder__frame_dirty_rect( + self->private_impl.f_height); + } + +-// -------- func tga.decoder.num_animation_loops ++// -------- func webp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_tga__decoder__num_animation_loops( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_animation_loops( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60292,12 +75336,12 @@ wuffs_tga__decoder__num_animation_loops( + return 0u; + } + +-// -------- func tga.decoder.num_decoded_frame_configs ++// -------- func webp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frame_configs( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_decoded_frame_configs( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60312,12 +75356,12 @@ wuffs_tga__decoder__num_decoded_frame_configs( + return 0u; + } + +-// -------- func tga.decoder.num_decoded_frames ++// -------- func webp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frames( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_decoded_frames( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60332,12 +75376,12 @@ wuffs_tga__decoder__num_decoded_frames( + return 0u; + } + +-// -------- func tga.decoder.restart_frame ++// -------- func webp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__restart_frame( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__restart_frame( ++ wuffs_webp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { +@@ -60353,31 +75397,30 @@ wuffs_tga__decoder__restart_frame( + if (self->private_impl.f_call_sequence < 32u) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } +- if (a_index != 0u) { ++ if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; + return wuffs_base__make_status(NULL); + } + +-// -------- func tga.decoder.set_report_metadata ++// -------- func webp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_tga__decoder__set_report_metadata( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__set_report_metadata( ++ wuffs_webp__decoder* self, + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__make_empty_struct(); + } + +-// -------- func tga.decoder.tell_me_more ++// -------- func webp.decoder.tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__tell_me_more( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__tell_me_more( ++ wuffs_webp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +@@ -60415,29 +75458,12 @@ wuffs_tga__decoder__tell_me_more( + return status; + } + +-// -------- func tga.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__history_retain_length( +- const wuffs_tga__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func tga.decoder.workbuf_len ++// -------- func webp.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_tga__decoder__workbuf_len( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__workbuf_len( ++ const wuffs_webp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } +@@ -60446,92 +75472,66 @@ wuffs_tga__decoder__workbuf_len( + return wuffs_base__utility__empty_range_ii_u64(); + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__utility__make_range_ii_u64(((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u])), ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u]))); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) + + // ---------------- Status Codes Implementations + +-const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header"; +-const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input"; +- + // ---------------- Private Consts + +-// ---------------- Private Initializer Prototypes ++#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761u + +-// ---------------- Private Function Prototypes ++#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263u ++ ++#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393u ++ ++#define WUFFS_XXHASH32__INITIAL_V0 606290984u ++ ++#define WUFFS_XXHASH32__INITIAL_V1 2246822519u ++ ++#define WUFFS_XXHASH32__INITIAL_V2 0u ++ ++#define WUFFS_XXHASH32__INITIAL_V3 1640531535u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++static wuffs_base__empty_struct ++wuffs_xxhash32__hasher__up( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + + // ---------------- VTables + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect), ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_wbmp__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_wbmp__decoder__restart_frame), ++ uint32_t))(&wuffs_xxhash32__hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_wbmp__decoder__set_quirk), ++ uint64_t))(&wuffs_xxhash32__hasher__set_quirk), + (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_wbmp__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_wbmp__decoder__initialize( +- wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__initialize( ++ wuffs_xxhash32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -60569,22 +75569,22 @@ wuffs_wbmp__decoder__initialize( + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_wbmp__decoder* +-wuffs_wbmp__decoder__alloc(void) { +- wuffs_wbmp__decoder* x = +- (wuffs_wbmp__decoder*)(calloc(sizeof(wuffs_wbmp__decoder), 1)); ++wuffs_xxhash32__hasher* ++wuffs_xxhash32__hasher__alloc(void) { ++ wuffs_xxhash32__hasher* x = ++ (wuffs_xxhash32__hasher*)(calloc(1, sizeof(wuffs_xxhash32__hasher))); + if (!x) { + return NULL; + } +- if (wuffs_wbmp__decoder__initialize( +- x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_xxhash32__hasher__initialize( ++ x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -60592,18 +75592,18 @@ wuffs_wbmp__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_wbmp__decoder(void) { +- return sizeof(wuffs_wbmp__decoder); ++sizeof__wuffs_xxhash32__hasher(void) { ++ return sizeof(wuffs_xxhash32__hasher); + } + + // ---------------- Function Implementations + +-// -------- func wbmp.decoder.get_quirk ++// -------- func xxhash32.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__get_quirk( +- const wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__get_quirk( ++ const wuffs_xxhash32__hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -60616,12 +75616,12 @@ wuffs_wbmp__decoder__get_quirk( + return 0u; + } + +-// -------- func wbmp.decoder.set_quirk ++// -------- func xxhash32.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__set_quirk( +- wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__set_quirk( ++ wuffs_xxhash32__hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -60637,627 +75637,387 @@ wuffs_wbmp__decoder__set_quirk( + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func wbmp.decoder.decode_image_config ++// -------- func xxhash32.hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash32__hasher__update( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_empty_struct(); + } +- return status; +-} +- +-// -------- func wbmp.decoder.do_decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_p = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__slice_u8 v_remaining = {0}; + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_decode_image_config[0].v_i; +- v_p = self->private_data.s_do_decode_image_config[0].v_p; ++ if ((self->private_impl.f_length_modulo_u32 == 0u) && ! self->private_impl.f_length_overflows_u32) { ++ self->private_impl.f_v0 = 606290984u; ++ self->private_impl.f_v1 = 2246822519u; ++ self->private_impl.f_v2 = 0u; ++ self->private_impl.f_v3 = 1640531535u; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- v_i = 0u; +- while (v_i < 2u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); +- goto exit; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 2u) { +- v_p = 0u; +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_p |= ((uint32_t)((v_c & 127u))); +- if ((v_c >> 7u) == 0u) { +- break; +- } else if (v_p > 131071u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- v_p <<= 7u; +- } +- if (v_i == 0u) { +- self->private_impl.f_width = v_p; +- } else { +- self->private_impl.f_height = v_p; +- } +- v_i += 1u; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- 2198077448u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- true); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 16777216u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u); + } +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_i = v_i; +- self->private_data.s_do_decode_image_config[0].v_p = v_p; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ wuffs_xxhash32__hasher__up(self, a_x); ++ a_x = v_remaining; + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.decode_frame_config ++// -------- func xxhash32.hasher.update_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__update_u32( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ return 0; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ wuffs_xxhash32__hasher__update(self, a_x); ++ return wuffs_xxhash32__hasher__checksum_u32(self); + } + +-// -------- func wbmp.decoder.do_decode_frame_config ++// -------- func xxhash32.hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static wuffs_base__empty_struct ++wuffs_xxhash32__hasher__up( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_new_lmu = 0; ++ uint32_t v_buf_u32 = 0; ++ uint32_t v_buf_len = 0; ++ uint32_t v_v0 = 0; ++ uint32_t v_v1 = 0; ++ uint32_t v_v2 = 0; ++ uint32_t v_v3 = 0; ++ wuffs_base__slice_u8 v_p = {0}; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len)))))); ++ self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32); ++ self->private_impl.f_length_modulo_u32 = v_new_lmu; ++ while (true) { ++ if (self->private_impl.f_buf_len >= 16u) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); ++ v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); ++ self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); ++ v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); ++ self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); ++ v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); ++ self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u)); ++ v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); ++ self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u)); ++ self->private_impl.f_buf_len = 0u; ++ break; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_buf_len += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_buf_len = ((uint32_t)(((uint8_t)(self->private_impl.f_buf_len & 15u)))); ++ v_v0 = self->private_impl.f_v0; ++ v_v1 = self->private_impl.f_v1; ++ v_v2 = self->private_impl.f_v2; ++ v_v3 = self->private_impl.f_v3; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 16; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16)); ++ while (v_p.ptr < i_end0_p) { ++ v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); ++ v_v0 = ((uint32_t)(v_v0 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) | ++ (((uint32_t)(v_p.ptr[5u])) << 8u) | ++ (((uint32_t)(v_p.ptr[6u])) << 16u) | ++ (((uint32_t)(v_p.ptr[7u])) << 24u)); ++ v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); ++ v_v1 = ((uint32_t)(v_v1 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) | ++ (((uint32_t)(v_p.ptr[9u])) << 8u) | ++ (((uint32_t)(v_p.ptr[10u])) << 16u) | ++ (((uint32_t)(v_p.ptr[11u])) << 24u)); ++ v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); ++ v_v2 = ((uint32_t)(v_v2 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) | ++ (((uint32_t)(v_p.ptr[13u])) << 8u) | ++ (((uint32_t)(v_p.ptr[14u])) << 16u) | ++ (((uint32_t)(v_p.ptr[15u])) << 24u)); ++ v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); ++ v_v3 = ((uint32_t)(v_v3 * 2654435761u)); ++ v_p.ptr += 16; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 15u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- +- return status; ++ self->private_impl.f_buf_len = ((uint8_t)(v_buf_len)); ++ self->private_impl.f_v0 = v_v0; ++ self->private_impl.f_v1 = v_v1; ++ self->private_impl.f_v2 = v_v2; ++ self->private_impl.f_v3 = v_v3; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.decode_frame ++// -------- func xxhash32.hasher.checksum_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__checksum_u32( ++ const wuffs_xxhash32__hasher* self) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_ret = 0; ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ uint32_t v_buf_u32 = 0; ++ ++ if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) { ++ v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u)); ++ v_ret += self->private_impl.f_length_modulo_u32; ++ } else { ++ v_ret += 374761393u; ++ v_ret += self->private_impl.f_length_modulo_u32; ++ } ++ v_n = 16u; ++ v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len))); ++ if (4u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 4u; ++ } ++ if (8u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 8u; + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (12u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 12u; + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ while (v_i < v_n) { ++ v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u)); ++ v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u)); ++ v_ret *= 2654435761u; ++ v_i += 1u; + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ v_ret ^= (v_ret >> 15u); ++ v_ret *= 2246822519u; ++ v_ret ^= (v_ret >> 13u); ++ v_ret *= 3266489917u; ++ v_ret ^= (v_ret >> 16u); ++ return v_ret; ++} + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++// ---------------- Status Codes Implementations + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++// ---------------- Private Consts + +-// -------- func wbmp.decoder.do_decode_frame ++#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727u + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_x_in_bytes = 0; +- uint32_t v_dst_x = 0; +- uint32_t v_dst_y = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_src[1] = {0}; +- uint8_t v_c = 0; ++#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161u + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579u + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- if (coro_susp_point) { +- v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; +- v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; +- v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; +- memcpy(v_src, self->private_data.s_do_decode_frame[0].v_src, sizeof(v_src)); +- v_c = self->private_data.s_do_decode_frame[0].v_c; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261u + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(536870920u), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- if (self->private_impl.f_width > 0u) { +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (v_dst_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_x = 0u; +- while (v_dst_x < self->private_impl.f_width) { +- if ((v_dst_x & 7u) == 0u) { +- while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); +- if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes); +- } +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } +- if ((v_c & 128u) == 0u) { +- v_src[0u] = 0u; +- } else { +- v_src[0u] = 255u; +- } +- v_c = ((uint8_t)((((uint32_t)(v_c)) << 1u))); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } +- v_dst_y += 1u; +- } +- } +- self->private_impl.f_call_sequence = 96u; ++#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902u + +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; +- } ++#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727u + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; +- self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; +- self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; +- memcpy(self->private_data.s_do_decode_frame[0].v_src, v_src, sizeof(v_src)); +- self->private_data.s_do_decode_frame[0].v_c = v_c; ++#define WUFFS_XXHASH64__INITIAL_V2 0u + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825u + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func wbmp.decoder.frame_dirty_rect ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_wbmp__decoder__frame_dirty_rect( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } ++static wuffs_base__empty_struct ++wuffs_xxhash64__hasher__up( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} ++// ---------------- VTables + +-// -------- func wbmp.decoder.num_animation_loops ++const wuffs_base__hasher_u64__func_ptrs ++wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = { ++ (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_xxhash64__hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_xxhash64__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update), ++ (uint64_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64), ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_wbmp__decoder__num_animation_loops( +- const wuffs_wbmp__decoder* self) { ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash64__hasher__initialize( ++ wuffs_xxhash64__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { +- return 0; ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- return 0u; +-} ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } + +-// -------- func wbmp.decoder.num_decoded_frame_configs ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = ++ wuffs_base__hasher_u64__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = ++ (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64); ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frame_configs( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return 0; ++wuffs_xxhash64__hasher* ++wuffs_xxhash64__hasher__alloc(void) { ++ wuffs_xxhash64__hasher* x = ++ (wuffs_xxhash64__hasher*)(calloc(1, sizeof(wuffs_xxhash64__hasher))); ++ if (!x) { ++ return NULL; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (wuffs_xxhash64__hasher__initialize( ++ x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; ++size_t ++sizeof__wuffs_xxhash64__hasher(void) { ++ return sizeof(wuffs_xxhash64__hasher); + } + +-// -------- func wbmp.decoder.num_decoded_frames ++// ---------------- Function Implementations ++ ++// -------- func xxhash64.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frames( +- const wuffs_wbmp__decoder* self) { ++wuffs_xxhash64__hasher__get_quirk( ++ const wuffs_xxhash64__hasher* self, ++ uint32_t a_key) { + if (!self) { + return 0; + } +@@ -61266,20 +76026,17 @@ wuffs_wbmp__decoder__num_decoded_frames( + return 0; + } + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } + return 0u; + } + +-// -------- func wbmp.decoder.restart_frame ++// -------- func xxhash64.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__restart_frame( +- wuffs_wbmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { ++wuffs_xxhash64__hasher__set_quirk( ++ wuffs_xxhash64__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -61290,77 +76047,206 @@ wuffs_wbmp__decoder__restart_frame( + : wuffs_base__error__initialize_not_called); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func wbmp.decoder.set_report_metadata ++// -------- func xxhash64.hasher.update + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_wbmp__decoder__set_report_metadata( +- wuffs_wbmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { ++wuffs_xxhash64__hasher__update( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { ++ self->private_impl.f_v0 = 6983438078262162902u; ++ self->private_impl.f_v1 = 14029467366897019727u; ++ self->private_impl.f_v2 = 0u; ++ self->private_impl.f_v3 = 7046029288634856825u; ++ } ++ wuffs_xxhash64__hasher__up(self, a_x); + return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.tell_me_more ++// -------- func xxhash64.hasher.update_u64 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__tell_me_more( +- wuffs_wbmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__update_u64( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return 0; + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ wuffs_xxhash64__hasher__update(self, a_x); ++ return wuffs_xxhash64__hasher__checksum_u64(self); ++} + +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++// -------- func xxhash64.hasher.up ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_xxhash64__hasher__up( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_new_lmu = 0; ++ uint64_t v_buf_u64 = 0; ++ uint32_t v_buf_len = 0; ++ uint64_t v_v0 = 0; ++ uint64_t v_v1 = 0; ++ uint64_t v_v2 = 0; ++ uint64_t v_v3 = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); ++ self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); ++ self->private_impl.f_length_modulo_u64 = v_new_lmu; ++ while (true) { ++ if (self->private_impl.f_buf_len >= 32u) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); ++ v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); ++ v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); ++ v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u)); ++ v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); ++ self->private_impl.f_buf_len = 0u; ++ break; ++ } ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ self->private_impl.f_buf_len += 1u; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ v_buf_len = (self->private_impl.f_buf_len & 31u); ++ v_v0 = self->private_impl.f_v0; ++ v_v1 = self->private_impl.f_v1; ++ v_v2 = self->private_impl.f_v2; ++ v_v3 = self->private_impl.f_v3; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) | ++ (((uint64_t)(v_p.ptr[1u])) << 8u) | ++ (((uint64_t)(v_p.ptr[2u])) << 16u) | ++ (((uint64_t)(v_p.ptr[3u])) << 24u) | ++ (((uint64_t)(v_p.ptr[4u])) << 32u) | ++ (((uint64_t)(v_p.ptr[5u])) << 40u) | ++ (((uint64_t)(v_p.ptr[6u])) << 48u) | ++ (((uint64_t)(v_p.ptr[7u])) << 56u)); ++ v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) | ++ (((uint64_t)(v_p.ptr[9u])) << 8u) | ++ (((uint64_t)(v_p.ptr[10u])) << 16u) | ++ (((uint64_t)(v_p.ptr[11u])) << 24u) | ++ (((uint64_t)(v_p.ptr[12u])) << 32u) | ++ (((uint64_t)(v_p.ptr[13u])) << 40u) | ++ (((uint64_t)(v_p.ptr[14u])) << 48u) | ++ (((uint64_t)(v_p.ptr[15u])) << 56u)); ++ v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) | ++ (((uint64_t)(v_p.ptr[17u])) << 8u) | ++ (((uint64_t)(v_p.ptr[18u])) << 16u) | ++ (((uint64_t)(v_p.ptr[19u])) << 24u) | ++ (((uint64_t)(v_p.ptr[20u])) << 32u) | ++ (((uint64_t)(v_p.ptr[21u])) << 40u) | ++ (((uint64_t)(v_p.ptr[22u])) << 48u) | ++ (((uint64_t)(v_p.ptr[23u])) << 56u)); ++ v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) | ++ (((uint64_t)(v_p.ptr[25u])) << 8u) | ++ (((uint64_t)(v_p.ptr[26u])) << 16u) | ++ (((uint64_t)(v_p.ptr[27u])) << 24u) | ++ (((uint64_t)(v_p.ptr[28u])) << 32u) | ++ (((uint64_t)(v_p.ptr[29u])) << 40u) | ++ (((uint64_t)(v_p.ptr[30u])) << 48u) | ++ (((uint64_t)(v_p.ptr[31u])) << 56u)); ++ v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); ++ v_p.ptr += 32; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 31u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- return status; ++ self->private_impl.f_buf_len = v_buf_len; ++ self->private_impl.f_v0 = v_v0; ++ self->private_impl.f_v1 = v_v1; ++ self->private_impl.f_v2 = v_v2; ++ self->private_impl.f_v3 = v_v3; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.history_retain_length ++// -------- func xxhash64.hasher.checksum_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__history_retain_length( +- const wuffs_wbmp__decoder* self) { ++wuffs_xxhash64__hasher__checksum_u64( ++ const wuffs_xxhash64__hasher* self) { + if (!self) { + return 0; + } +@@ -61369,83 +76255,307 @@ wuffs_wbmp__decoder__history_retain_length( + return 0; + } + +- return 0u; +-} +- +-// -------- func wbmp.decoder.workbuf_len ++ uint64_t v_ret = 0; ++ uint64_t v_v0 = 0; ++ uint64_t v_v1 = 0; ++ uint64_t v_v2 = 0; ++ uint64_t v_v3 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_i8 = 0; ++ uint32_t v_n = 0; ++ uint32_t v_buf_u32 = 0; ++ uint64_t v_buf_u64 = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_wbmp__decoder__workbuf_len( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) { ++ v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u)); ++ v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u)); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ v_v0 *= 11400714785074694791u; ++ v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u)); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ v_v1 *= 11400714785074694791u; ++ v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u)); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ v_v2 *= 11400714785074694791u; ++ v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u)); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ v_v3 *= 11400714785074694791u; ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret += self->private_impl.f_length_modulo_u64; ++ } else { ++ v_ret += 2870177450012600261u; ++ v_ret += self->private_impl.f_length_modulo_u64; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ v_n = 32u; ++ v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len); ++ if (8u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 8u; + } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ if (16u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 16u; ++ } ++ if (24u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 24u; ++ } ++ if ((v_n & 4u) != 0u) { ++ v_i8 = (v_i & 24u); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u)); ++ v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u)); ++ v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u)); ++ v_ret *= 14029467366897019727u; ++ v_ret += 1609587929392839161u; ++ v_i = (v_i8 + 4u); ++ } ++ while (v_i < v_n) { ++ v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u)); ++ v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u)); ++ v_ret *= 11400714785074694791u; ++ v_i += 1u; ++ } ++ v_ret ^= (v_ret >> 33u); ++ v_ret *= 14029467366897019727u; ++ v_ret ^= (v_ret >> 29u); ++ v_ret *= 1609587929392839161u; ++ v_ret ^= (v_ret >> 32u); ++ return ((uint64_t)(v_ret)); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) + + // ---------------- Status Codes Implementations + +-// ---------------- Private Consts ++const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset"; ++const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header"; ++const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum"; ++const char wuffs_xz__error__bad_filter[] = "#xz: bad filter"; ++const char wuffs_xz__error__bad_footer[] = "#xz: bad footer"; ++const char wuffs_xz__error__bad_header[] = "#xz: bad header"; ++const char wuffs_xz__error__bad_header_concatenated_stream[] = "#xz: bad header (concatenated stream)"; ++const char wuffs_xz__error__bad_index[] = "#xz: bad index"; ++const char wuffs_xz__error__bad_padding[] = "#xz: bad padding"; ++const char wuffs_xz__error__truncated_input[] = "#xz: truncated input"; ++const char wuffs_xz__error__unsupported_checksum_algorithm[] = "#xz: unsupported checksum algorithm"; ++const char wuffs_xz__error__unsupported_filter[] = "#xz: unsupported filter"; ++const char wuffs_xz__error__unsupported_filter_combination[] = "#xz: unsupported filter combination"; ++const char wuffs_xz__error__internal_error_inconsistent_bcj_filter_state[] = "#xz: internal error: inconsistent BCJ filter state"; + +-#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761 ++// ---------------- Private Consts + +-#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519 ++static const bool ++WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 1u, 1u, 0u, 1u, 0u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917 ++static const uint8_t ++WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 2u, 3u, 3u, 3u, 3u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263 ++static const uint32_t ++WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 4294967295u, 16777215u, 65535u, 65535u, 255u, 255u, 255u, 255u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393 ++static const uint8_t ++WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 4u, 4u, 6u, 6u, 0u, 0u, 7u, 7u, ++ 4u, 4u, 0u, 0u, 4u, 4u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V0 606290984 ++#define WUFFS_XZ__QUIRKS_BASE 2021322752u + +-#define WUFFS_XXHASH32__INITIAL_V1 2246822519 ++static const uint8_t ++WUFFS_XZ__CHECKSUM_LENGTH[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 4u, 8u, 32u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V2 0 ++static const uint8_t ++WUFFS_XZ__ZEROES[3] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V3 1640531535 ++static const uint8_t ++WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u, ++ 2u, 4u, 4u, 2u, ++}; + + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash32__hasher__up( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters__choosy_default( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_04_x86( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_05_powerpc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_06_ia64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_07_arm( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_08_armthumb( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_09_sparc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0a_arm64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0b_riscv( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__do_transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_with_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_sans_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__verify_index( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__verify_footer( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); + + // ---------------- VTables + +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32), ++const wuffs_base__io_transformer__func_ptrs ++wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_xz__decoder__dst_history_retain_length), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_xxhash32__hasher__get_quirk), ++ uint32_t))(&wuffs_xz__decoder__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_xxhash32__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32), ++ uint64_t))(&wuffs_xz__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_xz__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_xz__decoder__workbuf_len), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash32__hasher__initialize( +- wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__initialize( ++ wuffs_xz__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -61482,23 +76592,53 @@ wuffs_xxhash32__hasher__initialize( + } + } + ++ self->private_impl.choosy_apply_non_final_filters = &wuffs_xz__decoder__apply_non_final_filters__choosy_default; ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_crc64__ecma_hasher__initialize( ++ &self->private_data.f_crc64, sizeof(self->private_data.f_crc64), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_sha256__hasher__initialize( ++ &self->private_data.f_sha256, sizeof(self->private_data.f_sha256), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_lzma__decoder__initialize( ++ &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32); ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); + } + +-wuffs_xxhash32__hasher* +-wuffs_xxhash32__hasher__alloc(void) { +- wuffs_xxhash32__hasher* x = +- (wuffs_xxhash32__hasher*)(calloc(sizeof(wuffs_xxhash32__hasher), 1)); ++wuffs_xz__decoder* ++wuffs_xz__decoder__alloc(void) { ++ wuffs_xz__decoder* x = ++ (wuffs_xz__decoder*)(calloc(1, sizeof(wuffs_xz__decoder))); + if (!x) { + return NULL; + } +- if (wuffs_xxhash32__hasher__initialize( +- x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_xz__decoder__initialize( ++ x, sizeof(wuffs_xz__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -61506,18 +76646,511 @@ wuffs_xxhash32__hasher__alloc(void) { + } + + size_t +-sizeof__wuffs_xxhash32__hasher(void) { +- return sizeof(wuffs_xxhash32__hasher); ++sizeof__wuffs_xz__decoder(void) { ++ return sizeof(wuffs_xz__decoder); + } + + // ---------------- Function Implementations + +-// -------- func xxhash32.hasher.get_quirk ++// -------- func xz.decoder.apply_non_final_filters ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ return (*self->private_impl.choosy_apply_non_final_filters)(self, a_dst_slice); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters__choosy_default( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ uint32_t v_f = 0; ++ uint64_t v_i = 0; ++ uint32_t v_filter_id = 0; ++ uint32_t v_delta_dist = 0; ++ uint32_t v_delta_pos = 0; ++ uint8_t v_c8 = 0; ++ ++ if (self->private_impl.f_num_non_final_filters <= 0u) { ++ return 0u; ++ } ++ v_f = (self->private_impl.f_num_non_final_filters - 1u); ++ while (true) { ++ v_filter_id = (self->private_impl.f_filters[v_f] & 127u); ++ if (v_filter_id == 3u) { ++ v_delta_dist = (((self->private_impl.f_filters[v_f] >> 8u) & 255u) + 1u); ++ v_delta_pos = (self->private_impl.f_filters[v_f] >> 24u); ++ v_i = 0u; ++ while (v_i < ((uint64_t)(a_dst_slice.len))) { ++ v_c8 = a_dst_slice.ptr[v_i]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_c8 += self->private_data.f_filter_data[v_f][(((uint32_t)(v_delta_dist + v_delta_pos)) & 255u)]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_filter_data[v_f][(v_delta_pos & 255u)] = v_c8; ++ v_delta_pos -= 1u; ++ a_dst_slice.ptr[v_i] = v_c8; ++ v_i += 1u; ++ } ++ self->private_impl.f_filters[v_f] &= 65535u; ++ self->private_impl.f_filters[v_f] |= ((uint32_t)(v_delta_pos << 24u)); ++ } ++ if (v_f <= 0u) { ++ break; ++ } ++ v_f -= 1u; ++ } ++ return 0u; ++} ++ ++// -------- func xz.decoder.apply_filter_04_x86 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_04_x86( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint64_t v_i = 0; ++ uint64_t v_prev_pos = 0; ++ uint32_t v_prev_mask = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_src = 0; ++ uint32_t v_dst = 0; ++ uint32_t v_bit_num = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 5u)); ++ v_prev_pos = 18446744073709551615u; ++ v_prev_mask = self->private_impl.f_bcj_x86_prev_mask; ++ while (((uint64_t)(v_s.len)) >= 5u) { ++ if (((uint8_t)(v_s.ptr[0u] & 254u)) != 232u) { ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ v_prev_pos = ((uint64_t)(v_i - v_prev_pos)); ++ if (v_prev_pos > 3u) { ++ v_prev_mask = 0u; ++ } else if (v_prev_pos > 0u) { ++ v_prev_mask = (((uint32_t)(v_prev_mask << (v_prev_pos - 1u))) & 7u); ++ if (v_prev_mask != 0u) { ++ v_c8 = v_s.ptr[((uint8_t)(4u - WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]))]; ++ if ( ! WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[(v_prev_mask & 7u)] || (v_c8 == 0u) || (v_c8 == 255u)) { ++ v_prev_pos = v_i; ++ v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u); ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ } ++ } ++ v_prev_pos = v_i; ++ v_c8 = v_s.ptr[4u]; ++ if ((v_c8 != 0u) && (v_c8 != 255u)) { ++ v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u); ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ v_src = ((((uint32_t)(v_s.ptr[1u])) << 0u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 16u) | ++ (((uint32_t)(v_s.ptr[4u])) << 24u)); ++ while (true) { ++ v_dst = ((uint32_t)(v_src - v_p)); ++ if (v_prev_mask == 0u) { ++ break; ++ } ++ v_bit_num = ((uint32_t)(WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)])); ++ v_c8 = ((uint8_t)((v_dst >> (24u - (v_bit_num * 8u))))); ++ if ((v_c8 != 0u) && (v_c8 != 255u)) { ++ break; ++ } ++ v_src = (v_dst ^ WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[(v_prev_mask & 7u)]); ++ } ++ v_dst &= 33554431u; ++ v_dst |= ((uint32_t)(0u - (v_dst & 16777216u))); ++ v_s.ptr[1u] = ((uint8_t)((v_dst >> 0u))); ++ v_s.ptr[2u] = ((uint8_t)((v_dst >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_dst >> 16u))); ++ v_s.ptr[4u] = ((uint8_t)((v_dst >> 24u))); ++ v_i += 5u; ++ v_p += 5u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 5u); ++ } ++ v_prev_pos = ((uint64_t)(v_i - v_prev_pos)); ++ if (v_prev_pos > 3u) { ++ self->private_impl.f_bcj_x86_prev_mask = 0u; ++ } else if (v_prev_pos > 0u) { ++ self->private_impl.f_bcj_x86_prev_mask = ((uint32_t)(v_prev_mask << (v_prev_pos - 1u))); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 5u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_05_powerpc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_05_powerpc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) | ++ (((uint32_t)(v_s.ptr[1u])) << 16u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 0u)); ++ if ((v_x & 4227858435u) == 1207959553u) { ++ v_x = ((((uint32_t)((v_x & 67108860u) - v_p)) & 67108860u) | 1207959553u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 0u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_06_ia64 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_06_ia64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_bit_pos = 0; ++ uint32_t v_byte_pos = 0; ++ uint32_t v_bit_res = 0; ++ uint64_t v_x = 0; ++ uint32_t v_j = 0; ++ uint64_t v_norm = 0; ++ uint32_t v_addr = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 16u) { ++ v_mask = ((uint32_t)(WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[((uint8_t)(v_s.ptr[0u] & 31u))])); ++ v_slot = 0u; ++ while (true) { ++ do { ++ if (((v_mask >> v_slot) & 1u) == 0u) { ++ break; ++ } ++ v_bit_pos = ((v_slot * 41u) + 5u); ++ v_byte_pos = (v_bit_pos >> 3u); ++ v_bit_res = (v_bit_pos & 7u); ++ v_x = 0u; ++ v_j = 0u; ++ while (v_j < 6u) { ++ v_x |= (((uint64_t)(v_s.ptr[(v_j + v_byte_pos)])) << (8u * v_j)); ++ v_j += 1u; ++ } ++ v_norm = (v_x >> v_bit_res); ++ if ((((v_norm >> 37u) & 15u) != 5u) || (((v_norm >> 9u) & 7u) != 0u)) { ++ break; ++ } ++ v_addr = ((uint32_t)(((v_norm >> 13u) & 1048575u))); ++ v_addr |= (((uint32_t)(((v_norm >> 36u) & 1u))) << 20u); ++ v_addr <<= 4u; ++ v_addr -= v_p; ++ v_addr >>= 4u; ++ v_norm &= 18446743996400148479u; ++ v_norm |= (((uint64_t)((v_addr & 1048575u))) << 13u); ++ v_norm |= (((uint64_t)((v_addr & 1048576u))) << 16u); ++ v_x &= ((((uint64_t)(1u)) << v_bit_res) - 1u); ++ v_x |= ((uint64_t)(v_norm << v_bit_res)); ++ v_j = 0u; ++ while (v_j < 6u) { ++ v_s.ptr[(v_j + v_byte_pos)] = ((uint8_t)((v_x >> (8u * v_j)))); ++ v_j += 1u; ++ } ++ } while (0); ++ if (v_slot >= 2u) { ++ break; ++ } ++ v_slot += 1u; ++ } ++ v_p += 16u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 16u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_07_arm ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_07_arm( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 8u)); ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ if (v_s.ptr[3u] == 235u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ v_x = (((uint32_t)(((v_x & 16777215u) << 2u) - v_p)) >> 2u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 8u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_08_armthumb ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_08_armthumb( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 4u)); ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x & 4160813056u) != 4160811008u) { ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ continue; ++ } ++ v_y = ((((uint32_t)(((uint8_t)(v_s.ptr[0u] & 255u)))) << 11u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[1u] & 7u)))) << 19u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[2u] & 255u)))) << 0u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[3u] & 7u)))) << 8u)); ++ v_y = (((uint32_t)(((uint32_t)(v_y << 1u)) - v_p)) >> 1u); ++ v_s.ptr[0u] = ((uint8_t)((v_y >> 11u))); ++ v_s.ptr[1u] = ((uint8_t)((((v_y >> 19u) & 7u) | 240u))); ++ v_s.ptr[2u] = ((uint8_t)((v_y >> 0u))); ++ v_s.ptr[3u] = ((uint8_t)((((v_y >> 8u) & 7u) | 248u))); ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 4u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_09_sparc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_09_sparc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) | ++ (((uint32_t)(v_s.ptr[1u])) << 16u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 0u)); ++ if (((v_x >> 22u) == 256u) || ((v_x >> 22u) == 511u)) { ++ v_x = (((uint32_t)(((uint32_t)(v_x << 2u)) - v_p)) >> 2u); ++ v_x = ((1073741824u - (v_x & 4194304u)) | 1073741824u | (v_x & 4194303u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 0u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_0a_arm64 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0a_arm64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x >> 26u) == 37u) { ++ v_y = ((uint32_t)(v_x - (v_p >> 2u))); ++ v_x = (2483027968u | (v_y & 67108863u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ } else if ((v_x & 2667577344u) == 2415919104u) { ++ v_y = (((v_x >> 29u) & 3u) | ((v_x >> 3u) & 2097148u)); ++ if ((((uint32_t)(v_y + 131072u)) & 1835008u) == 0u) { ++ v_y -= (v_p >> 12u); ++ v_x &= 2415919135u; ++ v_x |= ((v_y & 3u) << 29u); ++ v_x |= ((v_y & 262140u) << 3u); ++ v_x |= (((uint32_t)(0u - (v_y & 131072u))) & 14680064u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ } ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_0b_riscv ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0b_riscv( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_x27 = 0; ++ uint32_t v_y = 0; ++ uint32_t v_addr = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 8u) { ++ if (v_s.ptr[0u] == 239u) { ++ if (((uint8_t)(v_s.ptr[1u] & 13u)) != 0u) { ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ continue; ++ } ++ v_addr = ((((uint32_t)(((uint8_t)(v_s.ptr[1u] & 240u)))) << 13u) | (((uint32_t)(v_s.ptr[2u])) << 9u) | (((uint32_t)(v_s.ptr[3u])) << 1u)); ++ v_addr -= v_p; ++ v_s.ptr[1u] = ((uint8_t)(((uint8_t)(v_s.ptr[1u] & 15u)) | ((uint8_t)(((v_addr >> 8u) & 240u))))); ++ v_s.ptr[2u] = ((uint8_t)((((v_addr >> 16u) & 15u) | ((v_addr >> 7u) & 16u) | (((uint32_t)(v_addr << 4u)) & 224u)))); ++ v_s.ptr[3u] = ((uint8_t)((((v_addr >> 4u) & 127u) | ((v_addr >> 13u) & 128u)))); ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ continue; ++ } else if (((uint8_t)(v_s.ptr[0u] & 127u)) == 23u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x & 3712u) != 0u) { ++ v_y = ((((uint32_t)(v_s.ptr[4u])) << 0u) | ++ (((uint32_t)(v_s.ptr[5u])) << 8u) | ++ (((uint32_t)(v_s.ptr[6u])) << 16u) | ++ (((uint32_t)(v_s.ptr[7u])) << 24u)); ++ if (((((uint32_t)(v_x << 8u)) ^ ((uint32_t)(v_y - 3u))) & 1015811u) != 0u) { ++ v_p += 6u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); ++ continue; ++ } ++ v_addr = ((v_x & 4294963200u) | (v_y >> 20u)); ++ v_x = (279u | ((uint32_t)(v_y << 12u))); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[4u] = ((uint8_t)((v_addr >> 0u))); ++ v_s.ptr[5u] = ((uint8_t)((v_addr >> 8u))); ++ v_s.ptr[6u] = ((uint8_t)((v_addr >> 16u))); ++ v_s.ptr[7u] = ((uint8_t)((v_addr >> 24u))); ++ v_p += 8u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ continue; ++ } ++ v_x27 = (v_x >> 27u); ++ if (((uint32_t)(((uint32_t)(v_x - 12567u)) << 18u)) >= (v_x27 & 29u)) { ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ continue; ++ } ++ v_addr = ((((uint32_t)(v_s.ptr[4u])) << 24u) | ++ (((uint32_t)(v_s.ptr[5u])) << 16u) | ++ (((uint32_t)(v_s.ptr[6u])) << 8u) | ++ (((uint32_t)(v_s.ptr[7u])) << 0u)); ++ v_addr -= v_p; ++ v_y = ((v_x >> 12u) | ((uint32_t)(v_addr << 20u))); ++ v_x = (23u | (v_x27 << 7u) | (((uint32_t)(v_addr + 2048u)) & 4294963200u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[4u] = ((uint8_t)((v_y >> 0u))); ++ v_s.ptr[5u] = ((uint8_t)((v_y >> 8u))); ++ v_s.ptr[6u] = ((uint8_t)((v_y >> 16u))); ++ v_s.ptr[7u] = ((uint8_t)((v_y >> 24u))); ++ v_p += 8u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ continue; ++ } ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash32__hasher__get_quirk( +- const wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__get_quirk( ++ const wuffs_xz__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -61527,15 +77160,24 @@ wuffs_xxhash32__hasher__get_quirk( + return 0; + } + ++ if (a_key == 1u) { ++ if (self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ } else if (a_key == 2021322752u) { ++ if (self->private_impl.f_standalone_format) { ++ return 1u; ++ } ++ } + return 0u; + } + +-// -------- func xxhash32.hasher.set_quirk ++// -------- func xz.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash32__hasher__set_quirk( +- wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__set_quirk( ++ wuffs_xz__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -61548,747 +77190,1667 @@ wuffs_xxhash32__hasher__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key == 2021322752u) { ++ self->private_impl.f_standalone_format = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func xxhash32.hasher.update ++// -------- func xz.decoder.dst_history_retain_length + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash32__hasher__update( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_xz__decoder__dst_history_retain_length( ++ const wuffs_xz__decoder* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma); ++} ++ ++// -------- func xz.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_xz__decoder__workbuf_len( ++ const wuffs_xz__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma); ++} ++ ++// -------- func xz.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_xz__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_xz__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; + } + +- wuffs_base__slice_u8 v_remaining = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +- if ((self->private_impl.f_length_modulo_u32 == 0u) && ! self->private_impl.f_length_overflows_u32) { +- self->private_impl.f_v0 = 606290984u; +- self->private_impl.f_v1 = 2246822519u; +- self->private_impl.f_v2 = 0u; +- self->private_impl.f_v3 = 1640531535u; +- } +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 16777216u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u); +- } +- wuffs_xxhash32__hasher__up(self, a_x); +- a_x = v_remaining; ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func xxhash32.hasher.update_u32 ++// -------- func xz.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__update_u32( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++static wuffs_base__status ++wuffs_xz__decoder__do_transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_xxhash32__hasher__update(self, a_x); +- return wuffs_xxhash32__hasher__checksum_u32(self); +-} ++ uint64_t v_header_magic = 0; ++ uint64_t v_dmark = 0; ++ uint64_t v_smark = 0; ++ uint8_t v_i8 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum32_have = 0; ++ uint32_t v_checksum32_want = 0; ++ uint64_t v_checksum64_have = 0; ++ uint64_t v_checksum64_want = 0; ++ wuffs_base__bitvec256 v_checksum256_have = {0}; ++ uint64_t v_compressed_size = 0; ++ uint64_t v_uncompressed_size = 0; ++ uint32_t v_hash = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint16_t v_footer_magic = 0; + +-// -------- func xxhash32.hasher.up ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash32__hasher__up( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_new_lmu = 0; +- uint32_t v_buf_u32 = 0; +- uint32_t v_buf_len = 0; +- uint32_t v_v0 = 0; +- uint32_t v_v1 = 0; +- uint32_t v_v2 = 0; +- uint32_t v_v3 = 0; +- wuffs_base__slice_u8 v_p = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_checksum32_have = self->private_data.s_do_transform_io.v_checksum32_have; ++ v_checksum32_want = self->private_data.s_do_transform_io.v_checksum32_want; ++ v_checksum256_have = self->private_data.s_do_transform_io.v_checksum256_have; ++ v_compressed_size = self->private_data.s_do_transform_io.v_compressed_size; ++ v_uncompressed_size = self->private_data.s_do_transform_io.v_uncompressed_size; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len)))))); +- self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32); +- self->private_impl.f_length_modulo_u32 = v_new_lmu; +- while (true) { +- if (self->private_impl.f_buf_len >= 16u) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | +- (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); +- v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); +- self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | +- (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); +- v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); +- self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | +- (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); +- v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); +- self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) | +- (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u)); +- v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); +- self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u)); +- self->private_impl.f_buf_len = 0u; +- break; +- } +- if (((uint64_t)(a_x.len)) <= 0u) { +- return wuffs_base__make_empty_struct(); +- } +- self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 40) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_header_magic = t_0; ++ } ++ if (v_header_magic != 388031461373u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 40) { ++ t_1 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_header_magic = t_1; ++ } ++ if (v_header_magic == 72400582410240u) { ++ self->private_impl.f_checksummer = 0u; ++ } else if (v_header_magic == 60327687946496u) { ++ self->private_impl.f_checksummer = 1u; ++ } else if (v_header_magic == 77742513456128u) { ++ self->private_impl.f_checksummer = 2u; ++ } else if (v_header_magic == 177077137508864u) { ++ self->private_impl.f_checksummer = 3u; ++ } else if ((v_header_magic & 61695u) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header); ++ goto exit; ++ } else { ++ v_header_magic = (15u & (v_header_magic >> 8u)); ++ if ((v_header_magic != 0u) && ++ (v_header_magic != 1u) && ++ (v_header_magic != 4u) && ++ (v_header_magic != 10u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_checksum_algorithm); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_flags = ((uint16_t)(v_header_magic)); ++ self->private_impl.f_num_actual_blocks = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) { ++ break; ++ } ++ self->private_impl.f_num_actual_blocks += 1u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ self->private_impl.f_compressed_size_for_index = 4u; ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_xz__decoder__decode_block_header_with_padding(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum32_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_checksum32_want = t_3; ++ } ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (v_checksum32_have != v_checksum32_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } else { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_crc64__ecma_hasher__initialize(&self->private_data.f_crc64, ++ sizeof (wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_sha256__hasher__initialize(&self->private_data.f_sha256, ++ sizeof (wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ v_compressed_size = 0u; ++ v_uncompressed_size = 0u; ++ while (true) { ++ if (((uint64_t)(self->private_impl.f_bcj_undo_index)) > ((uint64_t)(io2_a_dst - iop_a_dst))) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ continue; ++ } ++ v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ if (self->private_impl.f_num_non_final_filters == 0u) { ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_4 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_4; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ } else { ++ if (self->private_impl.f_bcj_undo_index > 0u) { ++ wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,wuffs_base__make_slice_u8(self->private_data.f_filter_data[0u], self->private_impl.f_bcj_undo_index)); ++ self->private_impl.f_bcj_undo_index = 0u; ++ } ++ { ++ uint8_t* o_0_io0_a_dst = io0_a_dst; ++ uint8_t* o_0_io1_a_dst = io1_a_dst; ++ io0_a_dst = iop_a_dst; ++ io1_a_dst = iop_a_dst; ++ wuffs_base__io_buffer o_0_a_dst; ++ if (a_dst) { ++ memcpy(&o_0_a_dst, a_dst, sizeof(*a_dst)); ++ size_t wi0 = a_dst->meta.wi; ++ a_dst->data.ptr += wi0; ++ a_dst->data.len -= wi0; ++ a_dst->meta.ri = 0; ++ a_dst->meta.wi = 0; ++ a_dst->meta.pos = wuffs_base__u64__sat_add(a_dst->meta.pos, wi0); ++ } ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_5 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_5; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (a_dst) { ++ memcpy(a_dst, &o_0_a_dst, sizeof(*a_dst)); ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ io0_a_dst = o_0_io0_a_dst; ++ io1_a_dst = o_0_io1_a_dst; ++ } ++ } ++ self->private_impl.f_bcj_undo_index = wuffs_xz__decoder__apply_non_final_filters(self, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ if ((self->private_impl.f_bcj_undo_index > 0u) && ! wuffs_base__status__is_ok(&v_status)) { ++ v_i8 = ((uint8_t)(self->private_impl.f_bcj_undo_index - 1u)); ++ while (true) { ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_xz__error__internal_error_inconsistent_bcj_filter_state); ++ goto exit; ++ } ++ self->private_data.f_filter_data[0u][v_i8] = iop_a_dst[-1]; ++ iop_a_dst--; ++ if (v_i8 <= 0u) { ++ break; ++ } + #if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wconversion" + #endif +- self->private_impl.f_buf_len += 1u; ++ v_i8 -= 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_buf_len = ((uint32_t)((self->private_impl.f_buf_len & 15u))); +- v_v0 = self->private_impl.f_v0; +- v_v1 = self->private_impl.f_v1; +- v_v2 = self->private_impl.f_v2; +- v_v3 = self->private_impl.f_v3; +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 16; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16); +- while (v_p.ptr < i_end0_p) { +- v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); +- v_v0 = ((uint32_t)(v_v0 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) | +- (((uint32_t)(v_p.ptr[5u])) << 8u) | +- (((uint32_t)(v_p.ptr[6u])) << 16u) | +- (((uint32_t)(v_p.ptr[7u])) << 24u)); +- v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); +- v_v1 = ((uint32_t)(v_v1 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) | +- (((uint32_t)(v_p.ptr[9u])) << 8u) | +- (((uint32_t)(v_p.ptr[10u])) << 16u) | +- (((uint32_t)(v_p.ptr[11u])) << 24u)); +- v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); +- v_v2 = ((uint32_t)(v_v2 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) | +- (((uint32_t)(v_p.ptr[13u])) << 8u) | +- (((uint32_t)(v_p.ptr[14u])) << 16u) | +- (((uint32_t)(v_p.ptr[15u])) << 24u)); +- v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); +- v_v3 = ((uint32_t)(v_v3 * 2654435761u)); +- v_p.ptr += 16; +- } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; +- v_buf_len = ((v_buf_len + 1u) & 15u); +- v_p.ptr += 1; ++ } ++ } ++ } ++ v_compressed_size += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))); ++ v_uncompressed_size += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst))); ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (self->private_impl.f_checksummer == 1u) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } else if (self->private_impl.f_checksummer == 2u) { ++ wuffs_crc64__ecma_hasher__update(&self->private_data.f_crc64, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } else if (self->private_impl.f_checksummer == 3u) { ++ wuffs_sha256__hasher__update(&self->private_data.f_sha256, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ } ++ if ((self->private_impl.f_block_has_compressed_size && (self->private_impl.f_block_compressed_size != v_compressed_size)) || (self->private_impl.f_block_has_uncompressed_size && (self->private_impl.f_block_uncompressed_size != v_uncompressed_size))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, v_compressed_size); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, ((uint64_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer]))); ++ self->private_impl.f_verification_have_total_sizes[0u] += self->private_impl.f_compressed_size_for_index; ++ v_hash = ((uint32_t)((self->private_impl.f_compressed_size_for_index ^ (self->private_impl.f_compressed_size_for_index >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_have_hashed_sizes[0u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_have_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ self->private_impl.f_verification_have_total_sizes[1u] += v_uncompressed_size; ++ v_hash = ((uint32_t)((v_uncompressed_size ^ (v_uncompressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_have_hashed_sizes[1u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_have_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ while ((v_compressed_size & 3u) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_padding); ++ goto exit; ++ } ++ v_compressed_size += 1u; ++ } ++ self->private_impl.f_lzma_needs_reset = true; ++ if (self->private_impl.f_ignore_checksum) { ++ self->private_data.s_do_transform_io.scratch = ((uint32_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer])); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } else if (self->private_impl.f_checksummer == 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } ++ } ++ v_checksum32_want = t_7; ++ } ++ v_checksum32_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32); ++ if (v_checksum32_have != v_checksum32_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } else if (self->private_impl.f_checksummer == 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint64_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_8 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 56) { ++ t_8 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_checksum64_want = t_8; ++ } ++ v_checksum64_have = wuffs_crc64__ecma_hasher__checksum_u64(&self->private_data.f_crc64); ++ if (v_checksum64_have != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } else if (self->private_impl.f_checksummer == 3u) { ++ v_checksum256_have = wuffs_sha256__hasher__checksum_bitvec256(&self->private_data.f_sha256); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ uint64_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_9 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9); ++ if (num_bits_9 == 56) { ++ t_9 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)); ++ } ++ } ++ v_checksum64_want = t_9; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 3u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint64_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_10 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_10); ++ if (num_bits_10 == 56) { ++ t_10 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)); ++ } ++ } ++ v_checksum64_want = t_10; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 2u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ uint64_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_11 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_11); ++ if (num_bits_11 == 56) { ++ t_11 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)); ++ } ++ } ++ v_checksum64_want = t_11; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 1u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ uint64_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_12 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_12); ++ if (num_bits_12 == 56) { ++ t_12 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)); ++ } ++ } ++ v_checksum64_want = t_12; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 0u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } ++ } ++ self->private_impl.f_backwards_size = 0u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_13 = wuffs_xz__decoder__verify_index(self, a_src); ++ v_status = t_13; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_backwards_size, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(25); ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_XZ__ZEROES), (3u & ((uint64_t)(0u - (3u & self->private_impl.f_backwards_size)))))); ++ } ++ while ((self->private_impl.f_backwards_size & 3u) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_14 = *iop_a_src++; ++ v_c8 = t_14; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_backwards_size += 1u; ++ } ++ self->private_impl.f_backwards_size >>= 2u; ++ if ((self->private_impl.f_backwards_size == 0u) || (self->private_impl.f_backwards_size > 4294967295u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ uint32_t t_15; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; ++ if (num_bits_15 == 24) { ++ t_15 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_15 += 8u; ++ *scratch |= ((uint64_t)(num_bits_15)) << 56; ++ } ++ } ++ v_checksum32_want = t_15; ++ } ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } else { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ uint32_t t_16; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; ++ if (num_bits_16 == 24) { ++ t_16 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_16 += 8u; ++ *scratch |= ((uint64_t)(num_bits_16)) << 56; ++ } ++ } ++ v_checksum32_want = t_16; ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_17 = wuffs_xz__decoder__verify_footer(self, a_src); ++ v_status = t_17; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(31); ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ uint16_t t_18; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_18 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; ++ if (num_bits_18 == 8) { ++ t_18 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_18 += 8u; ++ *scratch |= ((uint64_t)(num_bits_18)) << 56; ++ } ++ } ++ v_footer_magic = t_18; ++ } ++ if (v_footer_magic != 23129u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; ++ } ++ if ( ! self->private_impl.f_standalone_format) { ++ break; ++ } ++ while (true) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { ++ goto label__streams__break; ++ } else { ++ status = wuffs_base__make_status(wuffs_xz__error__truncated_input); ++ goto exit; ++ } ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34); ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (v_c32 == 1484404733u) { ++ break; ++ } else if (v_c32 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header_concatenated_stream); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ } ++ self->private_impl.f_started_verify_index = false; + } +- v_p.len = 0; +- } +- self->private_impl.f_buf_len = ((uint8_t)(v_buf_len)); +- self->private_impl.f_v0 = v_v0; +- self->private_impl.f_v1 = v_v1; +- self->private_impl.f_v2 = v_v2; +- self->private_impl.f_v3 = v_v3; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func xxhash32.hasher.checksum_u32 ++ label__streams__break:; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__checksum_u32( +- const wuffs_xxhash32__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; + } + +- uint32_t v_ret = 0; +- uint32_t v_i = 0; +- uint32_t v_n = 0; +- uint32_t v_buf_u32 = 0; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_checksum32_have = v_checksum32_have; ++ self->private_data.s_do_transform_io.v_checksum32_want = v_checksum32_want; ++ self->private_data.s_do_transform_io.v_checksum256_have = v_checksum256_have; ++ self->private_data.s_do_transform_io.v_compressed_size = v_compressed_size; ++ self->private_data.s_do_transform_io.v_uncompressed_size = v_uncompressed_size; + +- if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) { +- v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u)); +- v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u)); +- v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u)); +- v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u)); +- v_ret += self->private_impl.f_length_modulo_u32; +- } else { +- v_ret += 374761393u; +- v_ret += self->private_impl.f_length_modulo_u32; +- } +- v_n = 16u; +- v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len))); +- if (4u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | +- (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 4u; +- } +- if (8u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | +- (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 8u; +- } +- if (12u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | +- (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 12u; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- while (v_i < v_n) { +- v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u)); +- v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u)); +- v_ret *= 2654435761u; +- v_i += 1u; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_ret ^= (v_ret >> 15u); +- v_ret *= 2246822519u; +- v_ret ^= (v_ret >> 13u); +- v_ret *= 3266489917u; +- v_ret ^= (v_ret >> 16u); +- return v_ret; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) +- +-// ---------------- Status Codes Implementations + +-// ---------------- Private Consts ++ return status; ++} + +-#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791 ++// -------- func xz.decoder.decode_block_header_with_padding + +-#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727 ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_with_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161 ++ uint8_t v_c8 = 0; ++ uint64_t v_padded_size_have = 0; ++ uint64_t v_padded_size_want = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579 ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261 ++ uint32_t coro_susp_point = self->private_impl.p_decode_block_header_with_padding; ++ if (coro_susp_point) { ++ v_padded_size_have = self->private_data.s_decode_block_header_with_padding.v_padded_size_have; ++ v_padded_size_want = self->private_data.s_decode_block_header_with_padding.v_padded_size_want; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902 ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ v_padded_size_want = ((uint64_t)((((uint64_t)(v_c8)) * 4u) - 1u)); ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_xz__decoder__decode_block_header_sans_padding(self, a_src); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&v_padded_size_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ if (v_padded_size_have > v_padded_size_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ while (v_padded_size_have < v_padded_size_want) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ v_padded_size_have += 1u; ++ } + +-#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727 ++ ok: ++ self->private_impl.p_decode_block_header_with_padding = 0; ++ goto exit; ++ } + +-#define WUFFS_XXHASH64__INITIAL_V2 0 ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_block_header_with_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_block_header_with_padding.v_padded_size_have = v_padded_size_have; ++ self->private_data.s_decode_block_header_with_padding.v_padded_size_want = v_padded_size_want; + +-#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825 ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-// ---------------- Private Initializer Prototypes ++ return status; ++} + +-// ---------------- Private Function Prototypes ++// -------- func xz.decoder.decode_block_header_sans_padding + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash64__hasher__up( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-// ---------------- VTables +- +-const wuffs_base__hasher_u64__func_ptrs +-wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = { +- (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_xxhash64__hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_xxhash64__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update), +- (uint64_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64), +-}; ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_sans_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_alignment = 0; ++ uint8_t v_flags = 0; ++ uint8_t v_filter_id = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_shift = 0; ++ uint32_t v_f = 0; ++ uint32_t v_k = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash64__hasher__initialize( +- wuffs_xxhash64__hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding; ++ if (coro_susp_point) { ++ v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags; ++ v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id; ++ v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift; ++ v_f = self->private_data.s_decode_block_header_sans_padding.v_f; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ self->private_impl.f_num_non_final_filters = ((uint32_t)(((uint8_t)(v_flags & 3u)))); ++ if (((uint8_t)(v_flags & 60u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_has_compressed_size = (((uint8_t)(v_flags & 64u)) != 0u); ++ if (self->private_impl.f_block_has_compressed_size) { ++ self->private_impl.f_block_compressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_compressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ } ++ self->private_impl.f_block_has_uncompressed_size = (((uint8_t)(v_flags & 128u)) != 0u); ++ if (self->private_impl.f_block_has_uncompressed_size) { ++ self->private_impl.f_block_uncompressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_uncompressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ } ++ self->private_impl.f_bcj_x86_prev_mask = 0u; ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_non_final_filters__choosy_default); ++ v_f = 0u; ++ while (v_f < self->private_impl.f_num_non_final_filters) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_filter_id = t_3; ++ } ++ if (v_filter_id == 33u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } else if (v_filter_id == 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ self->private_impl.f_filters[v_f] = ((((uint32_t)(v_c8)) << 8u) | 3u); ++ v_k = 0u; ++ while (v_k < 256u) { ++ self->private_data.f_filter_data[v_f][v_k] = 0u; ++ v_k += 1u; ++ } ++ } else if ((v_filter_id < 3u) || (11u < v_filter_id)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; ++ } else if (v_f != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter_combination); ++ goto exit; ++ } else { ++ self->private_impl.f_filters[v_f] = ((uint32_t)(v_filter_id)); ++ if (v_filter_id == 4u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_04_x86); ++ } else if (v_filter_id == 5u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_05_powerpc); ++ } else if (v_filter_id == 6u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_06_ia64); ++ } else if (v_filter_id == 7u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_07_arm); ++ } else if (v_filter_id == 8u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_08_armthumb); ++ } else if (v_filter_id == 9u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_09_sparc); ++ } else if (v_filter_id == 10u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_0a_arm64); ++ } else { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_0b_riscv); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 == 0u) { ++ self->private_impl.f_bcj_pos = 0u; ++ } else if (v_c8 == 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_block_header_sans_padding.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_block_header_sans_padding.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } ++ } ++ v_c32 = t_7; ++ } ++ v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id])); ++ if (v_alignment > 0u) { ++ if ((v_c32 % v_alignment) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset); ++ goto exit; ++ } ++ } ++ self->private_impl.f_bcj_pos = v_c32; ++ } else { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; ++ } ++ } ++ v_f += 1u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_filter_id = t_8; ++ } ++ if (v_filter_id == 33u) { ++ if (self->private_impl.f_lzma_needs_reset) { ++ wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma, ++ sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001793u, (2u | (((uint64_t)(v_c8)) << 8u))); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ } else if ((v_filter_id < 3u) || (11u < v_filter_id)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; + } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; + } +- } + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = +- wuffs_base__hasher_u64__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = +- (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_xxhash64__hasher* +-wuffs_xxhash64__hasher__alloc(void) { +- wuffs_xxhash64__hasher* x = +- (wuffs_xxhash64__hasher*)(calloc(sizeof(wuffs_xxhash64__hasher), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_xxhash64__hasher__initialize( +- x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_block_header_sans_padding = 0; ++ goto exit; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_xxhash64__hasher(void) { +- return sizeof(wuffs_xxhash64__hasher); +-} + +-// ---------------- Function Implementations +- +-// -------- func xxhash64.hasher.get_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags; ++ self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id; ++ self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift; ++ self->private_data.s_decode_block_header_sans_padding.v_f = v_f; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__get_quirk( +- const wuffs_xxhash64__hasher* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return 0u; ++ return status; + } + +-// -------- func xxhash64.hasher.set_quirk ++// -------- func xz.decoder.verify_index + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash64__hasher__set_quirk( +- wuffs_xxhash64__hasher* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} ++static wuffs_base__status ++wuffs_xz__decoder__verify_index( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// -------- func xxhash64.hasher.update ++ uint8_t v_c8 = 0; ++ uint32_t v_shift = 0; ++ uint32_t v_hash = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash64__hasher__update( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { +- self->private_impl.f_v0 = 6983438078262162902u; +- self->private_impl.f_v1 = 14029467366897019727u; +- self->private_impl.f_v2 = 0u; +- self->private_impl.f_v3 = 7046029288634856825u; ++ uint32_t coro_susp_point = self->private_impl.p_verify_index; ++ if (coro_susp_point) { ++ v_shift = self->private_data.s_verify_index.v_shift; + } +- wuffs_xxhash64__hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); +-} ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// -------- func xxhash64.hasher.update_u64 ++ if ( ! self->private_impl.f_started_verify_index) { ++ self->private_impl.f_started_verify_index = true; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_num_index_blocks = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_num_index_blocks |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_num_index_blocks |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ if (self->private_impl.f_num_index_blocks != self->private_impl.f_num_actual_blocks) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ } ++ while (self->private_impl.f_num_index_blocks > 0u) { ++ self->private_impl.f_num_index_blocks -= 1u; ++ self->private_impl.f_index_block_compressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_index_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_index_block_compressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ self->private_impl.f_index_block_uncompressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ self->private_impl.f_verification_want_total_sizes[0u] += self->private_impl.f_index_block_compressed_size; ++ v_hash = ((uint32_t)((self->private_impl.f_index_block_compressed_size ^ (self->private_impl.f_index_block_compressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_want_hashed_sizes[0u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_want_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ self->private_impl.f_verification_want_total_sizes[1u] += self->private_impl.f_index_block_uncompressed_size; ++ v_hash = ((uint32_t)((self->private_impl.f_index_block_uncompressed_size ^ (self->private_impl.f_index_block_uncompressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_want_hashed_sizes[1u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_want_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ } ++ if ((self->private_impl.f_verification_have_hashed_sizes[0u] != self->private_impl.f_verification_want_hashed_sizes[0u]) || ++ (self->private_impl.f_verification_have_hashed_sizes[1u] != self->private_impl.f_verification_want_hashed_sizes[1u]) || ++ (self->private_impl.f_verification_have_total_sizes[0u] != self->private_impl.f_verification_want_total_sizes[0u]) || ++ (self->private_impl.f_verification_have_total_sizes[1u] != self->private_impl.f_verification_want_total_sizes[1u])) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__update_u64( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_verify_index = 0; ++ goto exit; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_verify_index = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_verify_index.v_shift = v_shift; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- wuffs_xxhash64__hasher__update(self, a_x); +- return wuffs_xxhash64__hasher__checksum_u64(self); ++ return status; + } + +-// -------- func xxhash64.hasher.up ++// -------- func xz.decoder.verify_footer + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash64__hasher__up( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint64_t v_new_lmu = 0; +- uint64_t v_buf_u64 = 0; +- uint32_t v_buf_len = 0; +- uint64_t v_v0 = 0; +- uint64_t v_v1 = 0; +- uint64_t v_v2 = 0; +- uint64_t v_v3 = 0; +- wuffs_base__slice_u8 v_p = {0}; ++static wuffs_base__status ++wuffs_xz__decoder__verify_footer( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); +- self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); +- self->private_impl.f_length_modulo_u64 = v_new_lmu; +- while (true) { +- if (self->private_impl.f_buf_len >= 32u) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | +- (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); +- v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | +- (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); +- v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | +- (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); +- v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) | +- (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u)); +- v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); +- self->private_impl.f_buf_len = 0u; +- break; ++ uint32_t v_c32 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_verify_footer; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_verify_footer.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_verify_footer.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c32 = t_0; + } +- if (((uint64_t)(a_x.len)) <= 0u) { +- return wuffs_base__make_empty_struct(); ++ if (v_c32 != ((uint32_t)(self->private_impl.f_backwards_size))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; + } +- self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; +- self->private_impl.f_buf_len += 1u; +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_buf_len = (self->private_impl.f_buf_len & 31u); +- v_v0 = self->private_impl.f_v0; +- v_v1 = self->private_impl.f_v1; +- v_v2 = self->private_impl.f_v2; +- v_v3 = self->private_impl.f_v3; +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) | +- (((uint64_t)(v_p.ptr[1u])) << 8u) | +- (((uint64_t)(v_p.ptr[2u])) << 16u) | +- (((uint64_t)(v_p.ptr[3u])) << 24u) | +- (((uint64_t)(v_p.ptr[4u])) << 32u) | +- (((uint64_t)(v_p.ptr[5u])) << 40u) | +- (((uint64_t)(v_p.ptr[6u])) << 48u) | +- (((uint64_t)(v_p.ptr[7u])) << 56u)); +- v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) | +- (((uint64_t)(v_p.ptr[9u])) << 8u) | +- (((uint64_t)(v_p.ptr[10u])) << 16u) | +- (((uint64_t)(v_p.ptr[11u])) << 24u) | +- (((uint64_t)(v_p.ptr[12u])) << 32u) | +- (((uint64_t)(v_p.ptr[13u])) << 40u) | +- (((uint64_t)(v_p.ptr[14u])) << 48u) | +- (((uint64_t)(v_p.ptr[15u])) << 56u)); +- v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) | +- (((uint64_t)(v_p.ptr[17u])) << 8u) | +- (((uint64_t)(v_p.ptr[18u])) << 16u) | +- (((uint64_t)(v_p.ptr[19u])) << 24u) | +- (((uint64_t)(v_p.ptr[20u])) << 32u) | +- (((uint64_t)(v_p.ptr[21u])) << 40u) | +- (((uint64_t)(v_p.ptr[22u])) << 48u) | +- (((uint64_t)(v_p.ptr[23u])) << 56u)); +- v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) | +- (((uint64_t)(v_p.ptr[25u])) << 8u) | +- (((uint64_t)(v_p.ptr[26u])) << 16u) | +- (((uint64_t)(v_p.ptr[27u])) << 24u) | +- (((uint64_t)(v_p.ptr[28u])) << 32u) | +- (((uint64_t)(v_p.ptr[29u])) << 40u) | +- (((uint64_t)(v_p.ptr[30u])) << 48u) | +- (((uint64_t)(v_p.ptr[31u])) << 56u)); +- v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); +- v_p.ptr += 32; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_verify_footer.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_verify_footer.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; + } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; +- v_buf_len = ((v_buf_len + 1u) & 31u); +- v_p.ptr += 1; ++ if (v_c32 != ((uint32_t)(self->private_impl.f_flags))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; + } +- v_p.len = 0; +- } +- self->private_impl.f_buf_len = v_buf_len; +- self->private_impl.f_v0 = v_v0; +- self->private_impl.f_v1 = v_v1; +- self->private_impl.f_v2 = v_v2; +- self->private_impl.f_v3 = v_v3; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func xxhash64.hasher.checksum_u64 + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__checksum_u64( +- const wuffs_xxhash64__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_verify_footer = 0; ++ goto exit; + } + +- uint64_t v_ret = 0; +- uint64_t v_v0 = 0; +- uint64_t v_v1 = 0; +- uint64_t v_v2 = 0; +- uint64_t v_v3 = 0; +- uint32_t v_i = 0; +- uint32_t v_i8 = 0; +- uint32_t v_n = 0; +- uint32_t v_buf_u32 = 0; +- uint64_t v_buf_u64 = 0; ++ goto suspend; ++ suspend: ++ self->private_impl.p_verify_footer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) { +- v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u)); +- v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u)); +- v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u)); +- v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u)); +- v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u)); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- v_v0 *= 11400714785074694791u; +- v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u)); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- v_v1 *= 11400714785074694791u; +- v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u)); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- v_v2 *= 11400714785074694791u; +- v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u)); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- v_v3 *= 11400714785074694791u; +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret += self->private_impl.f_length_modulo_u64; +- } else { +- v_ret += 2870177450012600261u; +- v_ret += self->private_impl.f_length_modulo_u64; +- } +- v_n = 32u; +- v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len); +- if (8u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | +- (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 8u; +- } +- if (16u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | +- (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 16u; +- } +- if (24u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | +- (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 24u; +- } +- if ((v_n & 4u) != 0u) { +- v_i8 = (v_i & 24u); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u)); +- v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u)); +- v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u)); +- v_ret *= 14029467366897019727u; +- v_ret += 1609587929392839161u; +- v_i = (v_i8 + 4u); +- } +- while (v_i < v_n) { +- v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u)); +- v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u)); +- v_ret *= 11400714785074694791u; +- v_i += 1u; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_ret ^= (v_ret >> 33u); +- v_ret *= 14029467366897019727u; +- v_ret ^= (v_ret >> 29u); +- v_ret *= 1609587929392839161u; +- v_ret ^= (v_ret >> 32u); +- return ((uint64_t)(v_ret)); ++ ++ return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) + + #if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -62309,16 +78871,12 @@ DynIOBuffer::DynIOBuffer(uint64_t max_incl) + : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {} + + DynIOBuffer::~DynIOBuffer() { +- if (m_buf.data.ptr) { +- free(m_buf.data.ptr); +- } ++ free(m_buf.data.ptr); + } + + void // + DynIOBuffer::drop() { +- if (m_buf.data.ptr) { +- free(m_buf.data.ptr); +- } ++ free(m_buf.data.ptr); + m_buf = wuffs_base__empty_io_buffer(); + } + +@@ -62329,13 +78887,16 @@ DynIOBuffer::grow(uint64_t min_incl) { + return ((min_incl == 0) && (m_max_incl == 0)) + ? DynIOBuffer::GrowResult::OK + : DynIOBuffer::GrowResult::FailedMaxInclExceeded; ++ } else if (n > SIZE_MAX) { ++ return DynIOBuffer::GrowResult::FailedOutOfMemory; + } else if (n > m_buf.data.len) { +- uint8_t* ptr = static_cast(realloc(m_buf.data.ptr, n)); ++ uint8_t* ptr = ++ static_cast(realloc(m_buf.data.ptr, static_cast(n))); + if (!ptr) { + return DynIOBuffer::GrowResult::FailedOutOfMemory; + } + m_buf.data.ptr = ptr; +- m_buf.data.len = n; ++ m_buf.data.len = static_cast(n); + } + return DynIOBuffer::GrowResult::OK; + } +@@ -62382,7 +78943,7 @@ Input::BringsItsOwnIOBuffer() { + FileInput::FileInput(FILE* f) : m_f(f) {} + + std::string // +-FileInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { ++FileInput::CopyIn(IOBuffer* dst) { + if (!m_f) { + return "wuffs_aux::sync_io::FileInput: nullptr file"; + } else if (!dst) { +@@ -62390,7 +78951,7 @@ FileInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { + } else if (dst->meta.closed) { + return "wuffs_aux::sync_io::FileInput: end of file"; + } else { +- dst->compact_retaining(history_retain_length); ++ dst->compact(); + size_t n = fread(dst->writer_pointer(), 1, dst->writer_length(), m_f); + dst->meta.wi += n; + dst->meta.closed = feof(m_f); +@@ -62418,7 +78979,7 @@ MemoryInput::BringsItsOwnIOBuffer() { + } + + std::string // +-MemoryInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { ++MemoryInput::CopyIn(IOBuffer* dst) { + if (!dst) { + return "wuffs_aux::sync_io::MemoryInput: nullptr IOBuffer"; + } else if (dst->meta.closed) { +@@ -62428,7 +78989,7 @@ MemoryInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { + // to it. + return "wuffs_aux::sync_io::MemoryInput: overlapping buffers"; + } else { +- dst->compact_retaining(history_retain_length); ++ dst->compact(); + size_t nd = dst->writer_length(); + size_t ns = m_io.reader_length(); + size_t n = (nd < ns) ? nd : ns; +@@ -62483,7 +79044,7 @@ AdvanceIOBufferTo(const ErrorMessages& error_messages, + if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } +@@ -62566,7 +79127,7 @@ HandleMetadata( + } else if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } +@@ -62627,15 +79188,13 @@ DecodeCborCallbacks::Done(DecodeCborResult& result, + sync_io::Input& input, + IOBuffer& buffer) {} + +-DecodeCborArgQuirks::DecodeCborArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeCborArgQuirks::DecodeCborArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeCborArgQuirks::DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeCborArgQuirks // + DecodeCborArgQuirks::DefaultValue() { +- return DecodeCborArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeCborArgQuirks(nullptr, 0); + } + + DecodeCborResult // +@@ -62664,8 +79223,8 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + ret_error_message = "wuffs_aux::DecodeCbor: out of memory"; + goto done; + } +- for (size_t i = 0; i < quirks.repr.len; i++) { +- dec->set_quirk(quirks.repr.ptr[i], 1); ++ for (size_t i = 0; i < quirks.len; i++) { ++ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second); + } + + // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB. +@@ -62710,14 +79269,14 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + "wuffs_aux::DecodeCbor: internal error: io_buf is closed"; + goto done; + } +- io_buf->compact_retaining(dec->history_retain_length()); ++ io_buf->compact(); + if (io_buf->meta.wi >= io_buf->data.len) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: io_buf is full"; + goto done; + } + cursor_index = io_buf->meta.ri; +- io_error_message = input.CopyIn(io_buf, dec->history_retain_length()); ++ io_error_message = input.CopyIn(io_buf); + } else { + ret_error_message = tok_status.message(); + goto done; +@@ -62796,7 +79355,7 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + goto done; + } + depth++; +- if (depth > WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) { ++ if (depth > (int32_t)WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad depth"; + goto done; +@@ -63052,6 +79611,11 @@ DecodeImageCallbacks::SelectDecoder(uint32_t fourcc, + } + #endif + ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ case WUFFS_BASE__FOURCC__QOI: ++ return wuffs_qoi__decoder::alloc_as__wuffs_base__image_decoder(); ++#endif ++ + #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + case WUFFS_BASE__FOURCC__TGA: + return wuffs_tga__decoder::alloc_as__wuffs_base__image_decoder(); +@@ -63061,6 +79625,11 @@ DecodeImageCallbacks::SelectDecoder(uint32_t fourcc, + case WUFFS_BASE__FOURCC__WBMP: + return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder(); + #endif ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) ++ case WUFFS_BASE__FOURCC__WEBP: ++ return wuffs_webp__decoder::alloc_as__wuffs_base__image_decoder(); ++#endif + } + + return wuffs_base__image_decoder::unique_ptr(nullptr); +@@ -63091,7 +79660,7 @@ DecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config, + return AllocPixbufResult(DecodeImage_UnsupportedPixelConfiguration); + } + void* ptr = +- allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); ++ allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len); + if (!ptr) { + return AllocPixbufResult(DecodeImage_OutOfMemory); + } +@@ -63116,7 +79685,7 @@ DecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range, + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } + void* ptr = +- allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); ++ allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len); + if (!ptr) { + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } +@@ -63153,15 +79722,13 @@ const char DecodeImage_UnsupportedPixelConfiguration[] = // + const char DecodeImage_UnsupportedPixelFormat[] = // + "wuffs_aux::DecodeImage: unsupported pixel format"; + +-DecodeImageArgQuirks::DecodeImageArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeImageArgQuirks::DecodeImageArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeImageArgQuirks::DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeImageArgQuirks // + DecodeImageArgQuirks::DefaultValue() { +- return DecodeImageArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeImageArgQuirks(nullptr, 0); + } + + DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {} +@@ -63259,7 +79826,8 @@ DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder, + DecodeImageCallbacks& callbacks, + sync_io::Input& input, + wuffs_base__io_buffer& io_buf, +- wuffs_base__slice_u32 quirks, ++ const QuirkKeyValuePair* quirks_ptr, ++ const size_t quirks_len, + uint64_t flags, + wuffs_base__pixel_blend pixel_blend, + wuffs_base__color_u32_argb_premul background_color, +@@ -63301,7 +79869,7 @@ redirect: + fourcc = 0; + break; + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63342,8 +79910,8 @@ redirect: + } + + // Apply quirks. +- for (size_t i = 0; i < quirks.len; i++) { +- image_decoder->set_quirk(quirks.ptr[i], 1); ++ for (size_t i = 0; i < quirks_len; i++) { ++ image_decoder->set_quirk(quirks_ptr[i].first, quirks_ptr[i].second); + } + + // Apply flags. +@@ -63397,8 +79965,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63480,8 +80047,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63510,8 +80076,7 @@ redirect: + message = DecodeImage_UnexpectedEndOfFile; + break; + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + message = std::move(error_message); + break; +@@ -63539,8 +80104,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63574,10 +80138,10 @@ DecodeImage(DecodeImageCallbacks& callbacks, + } + + wuffs_base__image_decoder::unique_ptr image_decoder(nullptr); +- DecodeImageResult result = +- DecodeImage0(image_decoder, callbacks, input, *io_buf, quirks.repr, +- flags.repr, pixel_blend.repr, background_color.repr, +- max_incl_dimension.repr, max_incl_metadata_length.repr); ++ DecodeImageResult result = DecodeImage0( ++ image_decoder, callbacks, input, *io_buf, quirks.ptr, quirks.len, ++ flags.repr, pixel_blend.repr, background_color.repr, ++ max_incl_dimension.repr, max_incl_metadata_length.repr); + callbacks.Done(result, input, *io_buf, std::move(image_decoder)); + return result; + } +@@ -63612,15 +80176,13 @@ const char DecodeJson_BadJsonPointer[] = // + const char DecodeJson_NoMatch[] = // + "wuffs_aux::DecodeJson: no match"; + +-DecodeJsonArgQuirks::DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeJsonArgQuirks::DecodeJsonArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeJsonArgQuirks::DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeJsonArgQuirks // + DecodeJsonArgQuirks::DefaultValue() { +- return DecodeJsonArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeJsonArgQuirks(nullptr, 0); + } + + DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0) +@@ -63633,58 +80195,58 @@ DecodeJsonArgJsonPointer::DefaultValue() { + + // -------- + +-#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN \ +- while (tok_buf.meta.ri >= tok_buf.meta.wi) { \ +- if (tok_status.repr == nullptr) { \ +- goto done; \ +- } else if (tok_status.repr == wuffs_base__suspension__short_write) { \ +- tok_buf.compact(); \ +- } else if (tok_status.repr == wuffs_base__suspension__short_read) { \ +- if (!io_error_message.empty()) { \ +- ret_error_message = std::move(io_error_message); \ +- goto done; \ +- } else if (cursor_index != io_buf->meta.ri) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad cursor_index"; \ +- goto done; \ +- } else if (io_buf->meta.closed) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: io_buf is closed"; \ +- goto done; \ +- } \ +- io_buf->compact_retaining(dec->history_retain_length()); \ +- if (io_buf->meta.wi >= io_buf->data.len) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: io_buf is full"; \ +- goto done; \ +- } \ +- cursor_index = io_buf->meta.ri; \ +- io_error_message = input.CopyIn(io_buf, dec->history_retain_length()); \ +- } else { \ +- ret_error_message = tok_status.message(); \ +- goto done; \ +- } \ +- tok_status = \ +- dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \ +- if ((tok_buf.meta.ri > tok_buf.meta.wi) || \ +- (tok_buf.meta.wi > tok_buf.data.len) || \ +- (io_buf->meta.ri > io_buf->meta.wi) || \ +- (io_buf->meta.wi > io_buf->data.len)) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad buffer indexes"; \ +- goto done; \ +- } \ +- } \ +- wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; \ +- uint64_t token_len = token.length(); \ +- if ((io_buf->meta.ri < cursor_index) || \ +- ((io_buf->meta.ri - cursor_index) < token_len)) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad token indexes"; \ +- goto done; \ +- } \ +- uint8_t* token_ptr = io_buf->data.ptr + cursor_index; \ +- (void)(token_ptr); \ ++#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN \ ++ while (tok_buf.meta.ri >= tok_buf.meta.wi) { \ ++ if (tok_status.repr == nullptr) { \ ++ goto done; \ ++ } else if (tok_status.repr == wuffs_base__suspension__short_write) { \ ++ tok_buf.compact(); \ ++ } else if (tok_status.repr == wuffs_base__suspension__short_read) { \ ++ if (!io_error_message.empty()) { \ ++ ret_error_message = std::move(io_error_message); \ ++ goto done; \ ++ } else if (cursor_index != io_buf->meta.ri) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad cursor_index"; \ ++ goto done; \ ++ } else if (io_buf->meta.closed) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: io_buf is closed"; \ ++ goto done; \ ++ } \ ++ io_buf->compact(); \ ++ if (io_buf->meta.wi >= io_buf->data.len) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: io_buf is full"; \ ++ goto done; \ ++ } \ ++ cursor_index = io_buf->meta.ri; \ ++ io_error_message = input.CopyIn(io_buf); \ ++ } else { \ ++ ret_error_message = tok_status.message(); \ ++ goto done; \ ++ } \ ++ tok_status = \ ++ dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \ ++ if ((tok_buf.meta.ri > tok_buf.meta.wi) || \ ++ (tok_buf.meta.wi > tok_buf.data.len) || \ ++ (io_buf->meta.ri > io_buf->meta.wi) || \ ++ (io_buf->meta.wi > io_buf->data.len)) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad buffer indexes"; \ ++ goto done; \ ++ } \ ++ } \ ++ wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; \ ++ uint64_t token_len = token.length(); \ ++ if ((io_buf->meta.ri < cursor_index) || \ ++ ((io_buf->meta.ri - cursor_index) < token_len)) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad token indexes"; \ ++ goto done; \ ++ } \ ++ uint8_t* token_ptr = io_buf->data.ptr + cursor_index; \ ++ (void)(token_ptr); \ + cursor_index += static_cast(token_len) + + // -------- +@@ -63965,11 +80527,11 @@ DecodeJson(DecodeJsonCallbacks& callbacks, + goto done; + } + bool allow_tilde_n_tilde_r_tilde_t = false; +- for (size_t i = 0; i < quirks.repr.len; i++) { +- dec->set_quirk(quirks.repr.ptr[i], 1); +- if (quirks.repr.ptr[i] == ++ for (size_t i = 0; i < quirks.len; i++) { ++ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second); ++ if (quirks.ptr[i].first == + WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) { +- allow_tilde_n_tilde_r_tilde_t = true; ++ allow_tilde_n_tilde_r_tilde_t = (quirks.ptr[i].second != 0); + } + } + +@@ -64025,7 +80587,7 @@ DecodeJson(DecodeJsonCallbacks& callbacks, + goto done; + } + depth++; +- if (depth > WUFFS_JSON__DECODER_DEPTH_MAX_INCL) { ++ if (depth > (int32_t)WUFFS_JSON__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeJson: internal error: bad depth"; + goto done; +-- +2.39.2 + diff --git a/patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch b/patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch new file mode 100644 index 000000000..fa1310628 --- /dev/null +++ b/patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch @@ -0,0 +1,91 @@ +From efad423f8472c1b9c130842e3d92625500f82d5d Mon Sep 17 00:00:00 2001 +From: Nigel Tao +Date: Tue, 13 Aug 2024 22:29:21 +1000 +Subject: [PATCH] lib/jpeg: avoid calling malloc and free + +Since commit 1d029b40c9de ("lib/jpeg: Replace decoder with Wuffs' +implementation"), a relatively large heap allocation is needed to decode +many JPEGs for use as work area. The prior decoder did not need this, +but also had many limitations in the JPEGs it could decode, was not as +memory-safe and quickly crashed under fuzzing. + +This commit keeps using Wuffs' JPEG decoder, but it no longer requires +any heap allocation (and thus configuring the heap size depending on how +big a bootsplash image you want to support). + +Change-Id: Ie4c52520cbce498539517c4898ff765365a6beba +Signed-off-by: Nigel Tao +Reviewed-on: https://review.coreboot.org/c/coreboot/+/83895 +Tested-by: build bot (Jenkins) +Reviewed-by: Nico Huber +Reviewed-by: Felix Singer +Reviewed-by: Jonathon Hall +--- + src/lib/jpeg.c | 36 +++++++++++++++++++++--------------- + 1 file changed, 21 insertions(+), 15 deletions(-) + +diff --git a/src/lib/jpeg.c b/src/lib/jpeg.c +index 242cf0ca8e..617ab0b22a 100644 +--- a/src/lib/jpeg.c ++++ b/src/lib/jpeg.c +@@ -1,9 +1,7 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ + + /* +- * Provide a simple API around the Wuffs JPEG decoder +- * Uses the heap (and lots of it) for the image-size specific +- * work buffer, so ramstage-only. ++ * Provide a simple API around the Wuffs JPEG decoder. + */ + + #include +@@ -85,6 +83,24 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, + return JPEG_DECODE_FAILED; + } + ++ /* Opting in to lower quality means that we can pass an empty slice as the ++ * "work buffer" argument to wuffs_jpeg__decoder__decode_frame below. ++ * ++ * Decoding progressive (not sequential) JPEGs would still require dynamic ++ * memory allocation (and the amount of work buffer required depends on the ++ * image dimensions), but we choose to just reject progressive JPEGs. It is ++ * simpler than sometimes calling malloc (which can fail, especially for ++ * large allocations) and free. ++ * ++ * More commentary about these quirks is at ++ * https://github.com/google/wuffs/blob/beaf45650085a16780b5f708b72daaeb1aa865c8/std/jpeg/decode_quirks.wuffs ++ */ ++ wuffs_jpeg__decoder__set_quirk( ++ &dec, WUFFS_BASE__QUIRK_QUALITY, ++ WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY); ++ wuffs_jpeg__decoder__set_quirk( ++ &dec, WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS, 1); ++ + wuffs_base__image_config imgcfg; + wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(filedata, filesize, true); + status = wuffs_jpeg__decoder__decode_image_config(&dec, &imgcfg, &src); +@@ -104,19 +120,9 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, + return JPEG_DECODE_FAILED; + } + +- uint64_t workbuf_len_min_incl = wuffs_jpeg__decoder__workbuf_len(&dec).min_incl; +- uint8_t *workbuf_array = malloc(workbuf_len_min_incl); +- if ((workbuf_array == NULL) && workbuf_len_min_incl) { +- return JPEG_DECODE_FAILED; +- } +- +- wuffs_base__slice_u8 workbuf = +- wuffs_base__make_slice_u8(workbuf_array, workbuf_len_min_incl); + status = wuffs_jpeg__decoder__decode_frame(&dec, &pixbuf, &src, +- WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL); +- +- free(workbuf_array); +- ++ WUFFS_BASE__PIXEL_BLEND__SRC, ++ wuffs_base__empty_slice_u8(), NULL); + if (status.repr) { + return JPEG_DECODE_FAILED; + } +-- +2.39.2 + diff --git a/patches/coreboot-24.02.01/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch b/patches/coreboot-24.02.01/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch new file mode 100644 index 000000000..4b48903fa --- /dev/null +++ b/patches/coreboot-24.02.01/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch @@ -0,0 +1,130 @@ +From a2180b33351e63187b6de834d3a3fd30ea8b500c Mon Sep 17 00:00:00 2001 +From: Arthur Heymans +Date: Thu, 25 Jan 2024 16:40:50 +0100 +Subject: [PATCH] nb/intel/*: Match ACPI with resource allocation + +Currently resource allocation starts top down from the default value +0xfe000000. This does not match what ACPI reports, so adapt +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT to reflect that. + +Signed-off-by: Arthur Heymans +Change-Id: I2ba0e96a7ab18d65b7fbbb38b1a979ea2ec6d1be +Reviewed-on: https://review.coreboot.org/c/coreboot/+/80207 +Tested-by: build bot (Jenkins) +Reviewed-by: Nico Huber +--- + src/northbridge/intel/gm45/Kconfig | 4 ++++ + src/northbridge/intel/haswell/Kconfig | 4 ++++ + src/northbridge/intel/i945/Kconfig | 4 ++++ + src/northbridge/intel/ironlake/Kconfig | 4 ++++ + src/northbridge/intel/pineview/Kconfig | 4 ++++ + src/northbridge/intel/sandybridge/Kconfig | 4 ++++ + src/northbridge/intel/x4x/Kconfig | 4 ++++ + 7 files changed, 28 insertions(+) + +diff --git a/src/northbridge/intel/gm45/Kconfig b/src/northbridge/intel/gm45/Kconfig +index 8059e7ee80..fef0d735b3 100644 +--- a/src/northbridge/intel/gm45/Kconfig ++++ b/src/northbridge/intel/gm45/Kconfig +@@ -31,6 +31,10 @@ config ECAM_MMCONF_BUS_NUMBER + int + default 64 + ++# This number must be equal or lower than what's reported in ACPI PCI _CRS ++config DOMAIN_RESOURCE_32BIT_LIMIT ++ default 0xfec00000 ++ + config SMM_RESERVED_SIZE + hex + default 0x100000 +diff --git a/src/northbridge/intel/haswell/Kconfig b/src/northbridge/intel/haswell/Kconfig +index 4b83a25bc1..35403373e7 100644 +--- a/src/northbridge/intel/haswell/Kconfig ++++ b/src/northbridge/intel/haswell/Kconfig +@@ -60,6 +60,10 @@ config ECAM_MMCONF_BUS_NUMBER + int + default 64 + ++# This number must be equal or lower than what's reported in ACPI PCI _CRS ++config DOMAIN_RESOURCE_32BIT_LIMIT ++ default ECAM_MMCONF_BASE_ADDRESS ++ + config DCACHE_RAM_BASE + hex + default 0xff7c0000 +diff --git a/src/northbridge/intel/i945/Kconfig b/src/northbridge/intel/i945/Kconfig +index ef925e17e7..32eff1a611 100644 +--- a/src/northbridge/intel/i945/Kconfig ++++ b/src/northbridge/intel/i945/Kconfig +@@ -41,6 +41,10 @@ config ECAM_MMCONF_BUS_NUMBER + int + default 64 + ++# This number must be equal or lower than what's reported in ACPI PCI _CRS ++config DOMAIN_RESOURCE_32BIT_LIMIT ++ default 0xfec00000 ++ + config OVERRIDE_CLOCK_DISABLE + bool + default n +diff --git a/src/northbridge/intel/ironlake/Kconfig b/src/northbridge/intel/ironlake/Kconfig +index ce705dcf53..2bafebf92e 100644 +--- a/src/northbridge/intel/ironlake/Kconfig ++++ b/src/northbridge/intel/ironlake/Kconfig +@@ -47,6 +47,10 @@ config ECAM_MMCONF_BASE_ADDRESS + config ECAM_MMCONF_BUS_NUMBER + default 256 + ++# This number must be equal or lower than what's reported in ACPI PCI _CRS ++config DOMAIN_RESOURCE_32BIT_LIMIT ++ default 0xfec00000 ++ + config INTEL_GMA_BCLV_OFFSET + default 0x48254 + +diff --git a/src/northbridge/intel/pineview/Kconfig b/src/northbridge/intel/pineview/Kconfig +index 877812643a..59cfcd5e0a 100644 +--- a/src/northbridge/intel/pineview/Kconfig ++++ b/src/northbridge/intel/pineview/Kconfig +@@ -38,4 +38,8 @@ config FIXED_DMIBAR_MMIO_BASE + config FIXED_EPBAR_MMIO_BASE + default 0xfed19000 + ++# This number must be equal or lower than what's reported in ACPI PCI _CRS ++config DOMAIN_RESOURCE_32BIT_LIMIT ++ default 0xfec00000 ++ + endif +diff --git a/src/northbridge/intel/sandybridge/Kconfig b/src/northbridge/intel/sandybridge/Kconfig +index f7d56c7503..fa40b0668d 100644 +--- a/src/northbridge/intel/sandybridge/Kconfig ++++ b/src/northbridge/intel/sandybridge/Kconfig +@@ -104,6 +104,10 @@ config ECAM_MMCONF_BUS_NUMBER + int + default 64 + ++# This number must be equal or lower than what's reported in ACPI PCI _CRS ++config DOMAIN_RESOURCE_32BIT_LIMIT ++ default ECAM_MMCONF_BASE_ADDRESS ++ + config DCACHE_RAM_BASE + hex + default 0xfefe0000 +diff --git a/src/northbridge/intel/x4x/Kconfig b/src/northbridge/intel/x4x/Kconfig +index 9af063819b..097e11126c 100644 +--- a/src/northbridge/intel/x4x/Kconfig ++++ b/src/northbridge/intel/x4x/Kconfig +@@ -28,6 +28,10 @@ config ECAM_MMCONF_BUS_NUMBER + int + default 256 + ++# This number must be equal or lower than what's reported in ACPI PCI _CRS ++config DOMAIN_RESOURCE_32BIT_LIMIT ++ default 0xfec00000 ++ + config SMM_RESERVED_SIZE + hex + default 0x100000 +-- +2.39.2 + diff --git a/patches/coreboot-24.02.01/0004-cbmem_tpm-clear_whole_log_on_creation.patch b/patches/coreboot-24.02.01/0004-cbmem_tpm-clear_whole_log_on_creation.patch new file mode 100644 index 000000000..adb939789 --- /dev/null +++ b/patches/coreboot-24.02.01/0004-cbmem_tpm-clear_whole_log_on_creation.patch @@ -0,0 +1,37 @@ +From b83a7607203d285b76e94ffd2013c55b184f5d42 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= +Date: Wed, 30 Oct 2024 10:50:37 +0100 +Subject: [PATCH] security/tpm/tspi/log-tpm1.c: Clear whole log area on + creation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The log area was not entirely cleared on creation resulting in +garbage after the last valid lgo entry. It caused the cbmem utility +to parse invalid events and access data outside the log area. +In the TPM2 log sources, the entire area is being cleared, thus the +issue has not been observed. + +Change-Id: I7c780b62b1c6507e1dd1806b20b0270e364cde3d +Signed-off-by: Michał Żygowski +--- + src/security/tpm/tspi/log-tpm1.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/security/tpm/tspi/log-tpm1.c b/src/security/tpm/tspi/log-tpm1.c +index 481b569cd5..453e74b4e8 100644 +--- a/src/security/tpm/tspi/log-tpm1.c ++++ b/src/security/tpm/tspi/log-tpm1.c +@@ -33,7 +33,7 @@ void *tpm1_log_cbmem_init(void) + if (!tclt) + return NULL; + +- memset(tclt, 0, sizeof(*tclt)); ++ memset(tclt, 0, tpm_log_len); + hdr = &tclt->spec_id; + + /* Fill in first "header" entry. */ +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0001-soc-intel-skylake-configure-usb-acpi.patch b/patches/coreboot-24.12/0001-soc-intel-skylake-configure-usb-acpi.patch new file mode 100644 index 000000000..215a4e6de --- /dev/null +++ b/patches/coreboot-24.12/0001-soc-intel-skylake-configure-usb-acpi.patch @@ -0,0 +1,94 @@ +From 0a28ea805e3dddfaa89e6c4255506a390bc7ce04 Mon Sep 17 00:00:00 2001 +From: Felix Singer +Date: Wed, 26 Jun 2024 04:24:31 +0200 +Subject: [PATCH 01/11] soc/intel/skylake: configure usb acpi + +Change-Id: I53fc73046e4b107064fa8c3c617ba6d9b807b71d +Signed-off-by: Felix Singer +--- + src/soc/intel/skylake/Kconfig | 1 + + src/soc/intel/skylake/chipset.cb | 56 +++++++++++++++++++++++++++++++- + 2 files changed, 56 insertions(+), 1 deletion(-) + +diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig +index 22017c848b..c24df2ef75 100644 +--- a/src/soc/intel/skylake/Kconfig ++++ b/src/soc/intel/skylake/Kconfig +@@ -10,6 +10,7 @@ config SOC_INTEL_COMMON_SKYLAKE_BASE + select CPU_INTEL_COMMON + select CPU_INTEL_FIRMWARE_INTERFACE_TABLE + select CPU_SUPPORTS_PM_TIMER_EMULATION ++ select DRIVERS_USB_ACPI + select EDK2_CPU_TIMER_LIB if PAYLOAD_EDK2 + select FSP_COMPRESS_FSP_S_LZ4 + select FSP_M_XIP +diff --git a/src/soc/intel/skylake/chipset.cb b/src/soc/intel/skylake/chipset.cb +index 6538a1475b..dfb81d496e 100644 +--- a/src/soc/intel/skylake/chipset.cb ++++ b/src/soc/intel/skylake/chipset.cb +@@ -13,7 +13,61 @@ chip soc/intel/skylake + device pci 07.0 alias chap off end + device pci 08.0 alias gmm off end # Gaussian Mixture Model + device pci 13.0 alias ish off end # SensorHub +- device pci 14.0 alias south_xhci off ops usb_xhci_ops end ++ device pci 14.0 alias south_xhci off ops usb_xhci_ops ++ chip drivers/usb/acpi ++ register "type" = "UPC_TYPE_HUB" ++ device usb 0.0 alias xhci_root_hub off ++ chip drivers/usb/acpi ++ device usb 2.0 alias usb2_port1 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.1 alias usb2_port2 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.2 alias usb2_port3 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.3 alias usb2_port4 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.4 alias usb2_port5 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.5 alias usb2_port6 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.6 alias usb2_port7 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.7 alias usb2_port8 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.8 alias usb2_port9 off end ++ end ++ chip drivers/usb/acpi ++ device usb 2.9 alias usb2_port10 off end ++ end ++ chip drivers/usb/acpi ++ device usb 3.0 alias usb3_port1 off end ++ end ++ chip drivers/usb/acpi ++ device usb 3.1 alias usb3_port2 off end ++ end ++ chip drivers/usb/acpi ++ device usb 3.2 alias usb3_port3 off end ++ end ++ chip drivers/usb/acpi ++ device usb 3.3 alias usb3_port4 off end ++ end ++ chip drivers/usb/acpi ++ device usb 3.4 alias usb3_port5 off end ++ end ++ chip drivers/usb/acpi ++ device usb 3.5 alias usb3_port6 off end ++ end ++ end ++ end ++ end + device pci 14.1 alias south_xdci off ops usb_xdci_ops end + device pci 14.2 alias thermal off end + device pci 14.3 alias cio off end +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch b/patches/coreboot-24.12/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch new file mode 100644 index 000000000..f60aa74a3 --- /dev/null +++ b/patches/coreboot-24.12/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch @@ -0,0 +1,30 @@ +From aa6dd7aa4693bd9ce1fe7f35b9532e5411fc1098 Mon Sep 17 00:00:00 2001 +From: Mate Kukri +Date: Fri, 22 Nov 2024 21:26:48 +0000 +Subject: [PATCH 02/11] soc/intel/skylake: Enable 4E/4F PNP I/O ports in + bootblock + +Change-Id: I57c9d8a9513a268e2ca6a0abd1306cd038598173 +Signed-off-by: Mate Kukri +--- + src/soc/intel/skylake/bootblock/pch.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/soc/intel/skylake/bootblock/pch.c b/src/soc/intel/skylake/bootblock/pch.c +index df00bb85a9..beaece960b 100644 +--- a/src/soc/intel/skylake/bootblock/pch.c ++++ b/src/soc/intel/skylake/bootblock/pch.c +@@ -100,8 +100,8 @@ static void soc_config_pwrmbase(void) + + void pch_early_iorange_init(void) + { +- uint16_t io_enables = LPC_IOE_SUPERIO_2E_2F | LPC_IOE_KBC_60_64 | +- LPC_IOE_EC_62_66; ++ uint16_t io_enables = LPC_IOE_EC_4E_4F | LPC_IOE_SUPERIO_2E_2F | ++ LPC_IOE_KBC_60_64 | LPC_IOE_EC_62_66; + + const config_t *config = config_of_soc(); + +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch b/patches/coreboot-24.12/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch new file mode 100644 index 000000000..108f688db --- /dev/null +++ b/patches/coreboot-24.12/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch @@ -0,0 +1,2237 @@ +From 1652c22825d3001e77159aa539dfa49d2389c775 Mon Sep 17 00:00:00 2001 +From: Mate Kukri +Date: Tue, 31 Dec 2024 22:49:15 +0000 +Subject: [PATCH 03/11] mb/lenovo: Add ThinkPad T480 and ThinkPad T480s + +These machine have BootGuard fused and requires deguard to +boot coreboot. + +Known issues: +- Alpine Ridge Thunderbolt 3 controller does not work +- Some Fn+F{1-12} keys aren't handled correctly +- Nvidia dGPU is finicky + - Needs option ROM + - Power enable code is buggy + - Nouveau only works on linux 6.8-6.9 +- Headphone jack isn't detected as plugged in despite correct verbs + +Thanks to Leah Rowe for helping with the T480s. + +Signed-off-by: Mate Kukri +Change-Id: I19d421412c771c1f242f6ff39453f824fa866163 +--- + src/device/pci_rom.c | 4 +- + src/ec/lenovo/h8/acpi/ec.asl | 2 +- + src/ec/lenovo/h8/bluetooth.c | 6 +- + src/ec/lenovo/h8/wwan.c | 6 +- + src/mainboard/lenovo/sklkbl_thinkpad/Kconfig | 57 +++++ + .../lenovo/sklkbl_thinkpad/Kconfig.name | 7 + + .../lenovo/sklkbl_thinkpad/Makefile.mk | 73 +++++++ + .../lenovo/sklkbl_thinkpad/acpi/ec.asl | 12 ++ + .../lenovo/sklkbl_thinkpad/acpi/superio.asl | 3 + + .../lenovo/sklkbl_thinkpad/bootblock.c | 60 ++++++ + .../lenovo/sklkbl_thinkpad/devicetree.cb | 71 ++++++ + src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl | 33 +++ + src/mainboard/lenovo/sklkbl_thinkpad/ec.c | 153 +++++++++++++ + src/mainboard/lenovo/sklkbl_thinkpad/ec.h | 99 +++++++++ + src/mainboard/lenovo/sklkbl_thinkpad/gpio.h | 8 + + .../lenovo/sklkbl_thinkpad/ramstage.c | 105 +++++++++ + .../sklkbl_thinkpad/variants/t480/data.vbt | Bin 0 -> 4106 bytes + .../variants/t480/gma-mainboard.ads | 19 ++ + .../sklkbl_thinkpad/variants/t480/gpio.c | 203 ++++++++++++++++++ + .../sklkbl_thinkpad/variants/t480/hda_verb.c | 90 ++++++++ + .../variants/t480/memory_init_params.c | 20 ++ + .../variants/t480/overridetree.cb | 103 +++++++++ + .../sklkbl_thinkpad/variants/t480s/data.vbt | Bin 0 -> 4106 bytes + .../variants/t480s/gma-mainboard.ads | 19 ++ + .../sklkbl_thinkpad/variants/t480s/gpio.c | 199 +++++++++++++++++ + .../sklkbl_thinkpad/variants/t480s/hda_verb.c | 90 ++++++++ + .../variants/t480s/memory_init_params.c | 44 ++++ + .../variants/t480s/overridetree.cb | 103 +++++++++ + .../variants/t480s/spd/spd_0.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_1.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_10.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_11.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_12.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_13.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_14.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_15.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_16.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_17.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_18.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_19.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_2.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_20.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_3.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_4.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_5.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_6.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_7.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_8.bin | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_9.bin | Bin 0 -> 512 bytes + 49 files changed, 1583 insertions(+), 6 deletions(-) + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/Kconfig + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/ec.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/ec.h + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/gpio.h + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gma-mainboard.ads + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_12.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_13.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_18.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_20.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_3.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_9.bin + +diff --git a/src/device/pci_rom.c b/src/device/pci_rom.c +index d60720eb49..cc6b9b068a 100644 +--- a/src/device/pci_rom.c ++++ b/src/device/pci_rom.c +@@ -304,11 +304,13 @@ void pci_rom_ssdt(const struct device *device) + return; + } + ++#if 0 + const char *scope = acpi_device_path(device); + if (!scope) { + printk(BIOS_ERR, "%s: Missing ACPI scope\n", dev_path(device)); + return; + } ++#endif + + /* Supports up to four devices. */ + if ((CBMEM_ID_ROM0 + ngfx) > CBMEM_ID_ROM3) { +@@ -336,7 +338,7 @@ void pci_rom_ssdt(const struct device *device) + memcpy(cbrom, rom, cbrom_length); + + /* write _ROM method */ +- acpigen_write_scope(scope); ++ acpigen_write_scope("\\_SB.PCI0.RP01.PEGP"); + acpigen_write_rom(cbrom, cbrom_length); + acpigen_pop_len(); /* pop scope */ + } +diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl +index bc54d3b422..8f4a8e1986 100644 +--- a/src/ec/lenovo/h8/acpi/ec.asl ++++ b/src/ec/lenovo/h8/acpi/ec.asl +@@ -331,7 +331,7 @@ Device(EC) + #include "sleepbutton.asl" + #include "lid.asl" + #include "beep.asl" +-#include "thermal.asl" ++//#include "thermal.asl" + #include "systemstatus.asl" + #include "thinkpad.asl" + } +diff --git a/src/ec/lenovo/h8/bluetooth.c b/src/ec/lenovo/h8/bluetooth.c +index 16fc8dce39..be71a24ced 100644 +--- a/src/ec/lenovo/h8/bluetooth.c ++++ b/src/ec/lenovo/h8/bluetooth.c +@@ -1,6 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ + +-#include ++// #include + #include + #include + #include +@@ -28,16 +28,18 @@ bool h8_has_bdc(const struct device *dev) + { + struct ec_lenovo_h8_config *conf = dev->chip_info; + +- if (!conf->has_bdc_detection) { ++ if (1 || !conf->has_bdc_detection) { + printk(BIOS_INFO, "H8: BDC detection not implemented. " + "Assuming BDC installed\n"); + return true; + } + ++#if 0 + if (get_gpio(conf->bdc_gpio_num) == conf->bdc_gpio_lvl) { + printk(BIOS_INFO, "H8: BDC installed\n"); + return true; + } ++#endif + + printk(BIOS_INFO, "H8: BDC not installed\n"); + return false; +diff --git a/src/ec/lenovo/h8/wwan.c b/src/ec/lenovo/h8/wwan.c +index 685886fcce..5cdcf77406 100644 +--- a/src/ec/lenovo/h8/wwan.c ++++ b/src/ec/lenovo/h8/wwan.c +@@ -1,6 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ + +-#include ++// #include + #include + #include + #include +@@ -26,16 +26,18 @@ bool h8_has_wwan(const struct device *dev) + { + struct ec_lenovo_h8_config *conf = dev->chip_info; + +- if (!conf->has_wwan_detection) { ++ if (1 || !conf->has_wwan_detection) { + printk(BIOS_INFO, "H8: WWAN detection not implemented. " + "Assuming WWAN installed\n"); + return true; + } + ++#if 0 + if (get_gpio(conf->wwan_gpio_num) == conf->wwan_gpio_lvl) { + printk(BIOS_INFO, "H8: WWAN installed\n"); + return true; + } ++#endif + + printk(BIOS_INFO, "H8: WWAN not installed\n"); + return false; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig +new file mode 100644 +index 0000000000..4998672943 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig +@@ -0,0 +1,57 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ bool ++ select BOARD_ROMSIZE_KB_16384 ++ select EC_LENOVO_H8 ++ select EC_LENOVO_PMH7 ++ select H8_HAS_BAT_THRESHOLDS_IMPL ++ select H8_HAS_LEDLOGO ++ select H8_HAS_PRIMARY_FN_KEYS ++ select HAVE_ACPI_RESUME ++ select HAVE_ACPI_TABLES ++ select INTEL_GMA_HAVE_VBT ++ select INTEL_INT15 ++ select MAINBOARD_HAS_LIBGFXINIT ++ select MAINBOARD_HAS_TPM2 ++ select MAINBOARD_USES_IFD_GBE_REGION ++ select MEMORY_MAPPED_TPM ++ select SOC_INTEL_COMMON_BLOCK_HDA_VERB ++ select SOC_INTEL_KABYLAKE ++ select SPD_READ_BY_WORD ++ select SYSTEM_TYPE_LAPTOP ++ ++config BOARD_LENOVO_T480 ++ bool ++ select BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ ++config BOARD_LENOVO_T480S ++ bool ++ select BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ ++if BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ ++config MAINBOARD_DIR ++ default "lenovo/sklkbl_thinkpad" ++ ++config VARIANT_DIR ++ default "t480" if BOARD_LENOVO_T480 ++ default "t480s" if BOARD_LENOVO_T480S ++ ++config OVERRIDE_DEVICETREE ++ default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" ++ ++config MAINBOARD_PART_NUMBER ++ default "T480" if BOARD_LENOVO_T480 ++ default "T480s" if BOARD_LENOVO_T480S ++ ++config CBFS_SIZE ++ default 0x900000 ++ ++config DIMM_MAX ++ default 2 ++ ++config DIMM_SPD_SIZE ++ default 512 # DDR4 ++ ++endif +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name +new file mode 100644 +index 0000000000..abc273f387 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name +@@ -0,0 +1,7 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_LENOVO_T480 ++ bool "ThinkPad T480" ++ ++config BOARD_LENOVO_T480S ++ bool "ThinkPad T480s" +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk b/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk +new file mode 100644 +index 0000000000..c308239177 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk +@@ -0,0 +1,73 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++bootblock-y += bootblock.c ec.c ++ ++romstage-y += variants/$(VARIANT_DIR)/memory_init_params.c ++ ++ramstage-y += ramstage.c ec.c ++ramstage-y += variants/$(VARIANT_DIR)/gpio.c variants/$(VARIANT_DIR)/hda_verb.c ++ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += variants/$(VARIANT_DIR)/gma-mainboard.ads ++ ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_0.bin ++spd_0.bin-file := variants/$(VARIANT_DIR)/spd/spd_0.bin ++spd_0.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_1.bin ++spd_1.bin-file := variants/$(VARIANT_DIR)/spd/spd_1.bin ++spd_1.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_2.bin ++spd_2.bin-file := variants/$(VARIANT_DIR)/spd/spd_2.bin ++spd_2.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_3.bin ++spd_3.bin-file := variants/$(VARIANT_DIR)/spd/spd_3.bin ++spd_3.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_4.bin ++spd_4.bin-file := variants/$(VARIANT_DIR)/spd/spd_4.bin ++spd_4.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_5.bin ++spd_5.bin-file := variants/$(VARIANT_DIR)/spd/spd_5.bin ++spd_5.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_6.bin ++spd_6.bin-file := variants/$(VARIANT_DIR)/spd/spd_6.bin ++spd_6.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_7.bin ++spd_7.bin-file := variants/$(VARIANT_DIR)/spd/spd_7.bin ++spd_7.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_8.bin ++spd_8.bin-file := variants/$(VARIANT_DIR)/spd/spd_8.bin ++spd_8.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_9.bin ++spd_9.bin-file := variants/$(VARIANT_DIR)/spd/spd_9.bin ++spd_9.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_10.bin ++spd_10.bin-file := variants/$(VARIANT_DIR)/spd/spd_10.bin ++spd_10.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_11.bin ++spd_11.bin-file := variants/$(VARIANT_DIR)/spd/spd_11.bin ++spd_11.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_12.bin ++spd_12.bin-file := variants/$(VARIANT_DIR)/spd/spd_12.bin ++spd_12.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_13.bin ++spd_13.bin-file := variants/$(VARIANT_DIR)/spd/spd_13.bin ++spd_13.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_14.bin ++spd_14.bin-file := variants/$(VARIANT_DIR)/spd/spd_14.bin ++spd_14.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_15.bin ++spd_15.bin-file := variants/$(VARIANT_DIR)/spd/spd_15.bin ++spd_15.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_16.bin ++spd_16.bin-file := variants/$(VARIANT_DIR)/spd/spd_16.bin ++spd_16.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_17.bin ++spd_17.bin-file := variants/$(VARIANT_DIR)/spd/spd_17.bin ++spd_17.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_18.bin ++spd_18.bin-file := variants/$(VARIANT_DIR)/spd/spd_18.bin ++spd_18.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_19.bin ++spd_19.bin-file := variants/$(VARIANT_DIR)/spd/spd_19.bin ++spd_19.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_20.bin ++spd_20.bin-file := variants/$(VARIANT_DIR)/spd/spd_20.bin ++spd_20.bin-type := raw +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl +new file mode 100644 +index 0000000000..3a949a2fca +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl +@@ -0,0 +1,12 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#define BRIGHTNESS_UP \_SB.PCI0.GFX0.INCB ++#define BRIGHTNESS_DOWN \_SB.PCI0.GFX0.DECB ++#define THINKPAD_EC_GPE 22 ++ ++Name(\TCRT, 100) ++Name(\TPSV, 90) ++Name(\FLVL, 0) ++ ++#include ++#include +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl +new file mode 100644 +index 0000000000..55b1db5b11 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl +@@ -0,0 +1,3 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c b/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c +new file mode 100644 +index 0000000000..fb660dbdfa +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c +@@ -0,0 +1,60 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include ++#include ++#include ++#include "ec.h" ++ ++static void configure_uart(uint16_t port, uint16_t iobase, uint8_t irqno) ++{ ++ microchip_pnp_enter_conf_state(port); ++ ++ // Select LPC I/F LDN ++ pnp_write(port, PNP_LDN_SELECT, LDN_LPCIF); ++ // Write UART BAR ++ pnp_write_le32(port, LPCIF_BAR_UART, (uint32_t) iobase << 16 | 0x8707); ++ // Set SIRQ4 to UART ++ pnp_write(port, LPCIF_SIRQ(irqno), LDN_UART); ++ ++ // Configure UART LDN ++ pnp_write(port, PNP_LDN_SELECT, LDN_UART); ++ pnp_write(port, UART_ACTIVATE, 0x01); ++ pnp_write(port, UART_CONFIG_SELECT, 0x00); ++ ++ microchip_pnp_exit_conf_state(port); ++ ++#ifdef CONFIG_BOARD_LENOVO_T480 ++ // Supply debug unlock key ++ debug_write_key(DEBUG_RW_KEY_IDX, debug_rw_key); ++ ++ // Use debug writes to set UART_TX and UART_RX GPIOs ++ debug_write_dword(0xf0c400 + 0x110, 0x00001000); ++ debug_write_dword(0xf0c400 + 0x114, 0x00001000); ++#endif ++} ++ ++ ++#define UART_PORT 0x3f8 ++#define UART_IRQ 4 ++ ++void bootblock_mainboard_early_init(void) ++{ ++ // Tell EC via BIOS Debug Port 1 that the world isn't on fire ++ ++ // Let the EC know that BIOS code is running ++ outb(0x11, 0x86); ++ outb(0x6e, 0x86); ++ ++ // Enable accesses to EC1 interface ++ ec0_write(0, ec0_read(0) | 0x20); ++ ++ // Reset LEDs to power on state ++ // (Without this warm reboot leaves LEDs off) ++ ec0_write(0x0c, 0x80); ++ ec0_write(0x0c, 0x07); ++ ec0_write(0x0c, 0x8a); ++ ++ // Setup debug UART ++ configure_uart(EC_CFG_PORT, UART_PORT, UART_IRQ); ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb b/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb +new file mode 100644 +index 0000000000..c07d4d53ca +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb +@@ -0,0 +1,71 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++chip soc/intel/skylake ++ # IGD Displays ++ register "gfx" = "GMA_STATIC_DISPLAYS(0)" ++ ++ register "panel_cfg" = "{ ++ .up_delay_ms = 200, ++ .down_delay_ms = 50, ++ .cycle_delay_ms = 600, ++ .backlight_on_delay_ms = 1, ++ .backlight_off_delay_ms = 200, ++ .backlight_pwm_hz = 200, ++ }" ++ ++ # Power ++ register "PmConfigSlpS3MinAssert" = "2" # 50ms ++ register "PmConfigSlpS4MinAssert" = "1" # 1s ++ register "PmConfigSlpSusMinAssert" = "3" # 500ms ++ register "PmConfigSlpAMinAssert" = "3" # 2s ++ ++ device domain 0 on ++ device ref igpu on end ++ device ref sa_thermal on end ++ device ref thermal on end ++ device ref south_xhci on end ++ device ref lpc_espi on ++ register "serirq_mode" = "SERIRQ_CONTINUOUS" ++ ++ register "gen1_dec" = "0x007c1601" ++ register "gen2_dec" = "0x000c15e1" ++ ++ chip ec/lenovo/pmh7 ++ register "backlight_enable" = "true" ++ register "dock_event_enable" = "true" ++ device pnp ff.1 on end # dummy ++ end ++ ++ chip ec/lenovo/h8 ++ register "beepmask0" = "0x00" ++ register "beepmask1" = "0x86" ++ register "config0" = "0xa6" ++ register "config1" = "0x0d" ++ register "config2" = "0xa8" ++ register "config3" = "0xc4" ++ register "has_keyboard_backlight" = "1" ++ register "event2_enable" = "0xff" ++ register "event3_enable" = "0xff" ++ register "event4_enable" = "0xd0" ++ register "event5_enable" = "0x3c" ++ register "event7_enable" = "0x01" ++ register "event8_enable" = "0x7b" ++ register "event9_enable" = "0xff" ++ register "eventc_enable" = "0xff" ++ register "eventd_enable" = "0xff" ++ register "evente_enable" = "0x9d" ++ device pnp ff.2 on # dummy ++ io 0x60 = 0x62 ++ io 0x62 = 0x66 ++ io 0x64 = 0x1600 ++ io 0x66 = 0x1604 ++ end ++ end ++ ++ chip drivers/pc80/tpm ++ device pnp 0c31.0 on end ++ end ++ end ++ device ref hda on end ++ end ++end +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl b/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl +new file mode 100644 +index 0000000000..aa4d4de2a6 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl +@@ -0,0 +1,33 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++DefinitionBlock( ++ "dsdt.aml", ++ "DSDT", ++ ACPI_DSDT_REV_2, ++ OEM_ID, ++ ACPI_TABLE_CREATOR, ++ 0x20110725 ++) ++{ ++ #include ++ #include ++ #include ++ ++ Device (\_SB.PCI0) ++ { ++ #include ++ #include ++ #include ++ } ++ ++ Scope (\_SB.PCI0.RP01) ++ { ++ Device (PEGP) ++ { ++ Name (_ADR, Zero) ++ } ++ } ++ ++ #include ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/ec.c b/src/mainboard/lenovo/sklkbl_thinkpad/ec.c +new file mode 100644 +index 0000000000..adb6a60324 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/ec.c +@@ -0,0 +1,153 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include "ec.h" ++ ++#define MICROCHIP_CONFIGURATION_ENTRY_KEY 0x55 ++#define MICROCHIP_CONFIGURATION_EXIT_KEY 0xaa ++ ++void microchip_pnp_enter_conf_state(uint16_t port) ++{ ++ outb(MICROCHIP_CONFIGURATION_ENTRY_KEY, port); ++} ++ ++void microchip_pnp_exit_conf_state(uint16_t port) ++{ ++ outb(MICROCHIP_CONFIGURATION_EXIT_KEY, port); ++} ++ ++uint8_t pnp_read(uint16_t port, uint8_t index) ++{ ++ outb(index, port); ++ return inb(port + 1); ++} ++ ++uint32_t pnp_read_le32(uint16_t port, uint8_t index) ++{ ++ return (uint32_t) pnp_read(port, index) | ++ (uint32_t) pnp_read(port, index + 1) << 8 | ++ (uint32_t) pnp_read(port, index + 2) << 16 | ++ (uint32_t) pnp_read(port, index + 3) << 24; ++} ++ ++void pnp_write(uint16_t port, uint8_t index, uint8_t value) ++{ ++ outb(index, port); ++ outb(value, port + 1); ++} ++ ++void pnp_write_le32(uint16_t port, uint8_t index, uint32_t value) ++{ ++ pnp_write(port, index, value & 0xff); ++ pnp_write(port, index + 1, value >> 8 & 0xff); ++ pnp_write(port, index + 2, value >> 16 & 0xff); ++ pnp_write(port, index + 3, value >> 24 & 0xff); ++} ++ ++static void ecN_clear_out_queue(uint16_t cmd_port, uint16_t data_port) ++{ ++ while (inb(cmd_port) & EC_OBF) ++ inb(data_port); ++} ++ ++static void ecN_wait_to_send(uint16_t cmd_port, uint16_t data_port) ++{ ++ while (inb(cmd_port) & EC_IBF) ++ ; ++} ++ ++static void ecN_wait_to_recv(uint16_t cmd_port, uint16_t data_port) ++{ ++ while (!(inb(cmd_port) & EC_OBF)) ++ ; ++} ++ ++uint8_t ecN_read(uint16_t cmd_port, uint16_t data_port, uint8_t addr) ++{ ++ ecN_clear_out_queue(cmd_port, data_port); ++ ecN_wait_to_send(cmd_port, data_port); ++ outb(EC_READ, cmd_port); ++ ecN_wait_to_send(cmd_port, data_port); ++ outb(addr, data_port); ++ ecN_wait_to_recv(cmd_port, data_port); ++ return inb(data_port); ++} ++ ++void ecN_write(uint16_t cmd_port, uint16_t data_port, uint8_t addr, uint8_t val) ++{ ++ ecN_clear_out_queue(cmd_port, data_port); ++ ecN_wait_to_send(cmd_port, data_port); ++ outb(EC_WRITE, cmd_port); ++ ecN_wait_to_send(cmd_port, data_port); ++ outb(addr, data_port); ++ ecN_wait_to_send(cmd_port, data_port); ++ outb(val, data_port); ++} ++ ++uint8_t eeprom_read(uint16_t addr) ++{ ++ ecN_clear_out_queue(EC2_CMD, EC2_DATA); ++ ecN_wait_to_send(EC2_CMD, EC2_DATA); ++ outl(1, EC2_CMD); ++ ecN_wait_to_send(EC2_CMD, EC2_DATA); ++ outl(addr, EC2_DATA); ++ ecN_wait_to_recv(EC2_CMD, EC2_DATA); ++ return inl(EC2_DATA); ++} ++ ++void eeprom_write(uint16_t addr, uint8_t val) ++{ ++ ecN_clear_out_queue(EC2_CMD, EC2_DATA); ++ ecN_wait_to_send(EC2_CMD, EC2_DATA); ++ outl(2, EC2_CMD); ++ ecN_wait_to_send(EC2_CMD, EC2_DATA); ++ outl((uint32_t) addr | (uint32_t) val << 16, EC2_DATA); ++ ecN_wait_to_recv(EC2_CMD, EC2_DATA); ++ inl(EC2_DATA); ++} ++ ++uint16_t debug_loaded_keys(void) ++{ ++ return (uint16_t) ec0_read(0x87) << 8 | (uint16_t) ec0_read(0x86); ++} ++ ++static void debug_cmd(uint8_t cmd) ++{ ++ ec0_write(EC_DEBUG_CMD, cmd); ++ while (ec0_read(EC_DEBUG_CMD) & 0x80) ++ ; ++} ++ ++void debug_read_key(uint8_t i, uint8_t *key) ++{ ++ debug_cmd(0x80 | (i & 0xf)); ++ for (int j = 0; j < 8; ++j) ++ key[j] = ec0_read(0x3e + j); ++} ++ ++void debug_write_key(uint8_t i, const uint8_t *key) ++{ ++ for (int j = 0; j < 8; ++j) ++ ec0_write(0x3e + j, key[j]); ++ debug_cmd(0xc0 | (i & 0xf)); ++} ++ ++uint32_t debug_read_dword(uint32_t addr) ++{ ++ ecN_clear_out_queue(EC3_CMD, EC3_DATA); ++ ecN_wait_to_send(EC3_CMD, EC3_DATA); ++ outl(addr << 8 | 0xE2, EC3_DATA); ++ ecN_wait_to_recv(EC3_CMD, EC3_DATA); ++ return inl(EC3_DATA); ++} ++ ++void debug_write_dword(uint32_t addr, uint32_t val) ++{ ++ ecN_clear_out_queue(EC3_CMD, EC3_DATA); ++ ecN_wait_to_send(EC3_CMD, EC3_DATA); ++ outl(addr << 8 | 0xEA, EC3_DATA); ++ ecN_wait_to_send(EC3_CMD, EC3_DATA); ++ outl(val, EC3_DATA); ++} ++ ++const uint8_t debug_rw_key[8] = { 0x7a, 0x41, 0xb1, 0x49, 0xfe, 0x21, 0x01, 0xcf }; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/ec.h b/src/mainboard/lenovo/sklkbl_thinkpad/ec.h +new file mode 100644 +index 0000000000..d2963c8962 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/ec.h +@@ -0,0 +1,99 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#ifndef SKLKBL_THINKPAD_EC_H ++#define SKLKBL_THINKPAD_EC_H ++ ++// EC configuration base address ++#define EC_CFG_PORT 0x4e ++ ++// Chip global registers ++#define PNP_LDN_SELECT 0x07 ++# define LDN_UART 0x07 ++# define LDN_LPCIF 0x0c ++#define EC_DEVICE_ID 0x20 ++#define EC_DEVICE_REV 0x21 ++ ++// LPC I/F registers ++#define LPCIF_SIRQ(i) (0x40 + (i)) ++ ++#define LPCIF_BAR_CFG 0x60 ++#define LPCIF_BAR_MAILBOX 0x64 ++#define LPCIF_BAR_8042 0x68 ++#define LPCIF_BAR_ACPI_EC0 0x6c ++#define LPCIF_BAR_ACPI_EC1 0x70 ++#define LPCIF_BAR_ACPI_EC2 0x74 ++#define LPCIF_BAR_ACPI_EC3 0x78 ++#define LPCIF_BAR_ACPI_PM0 0x7c ++#define LPCIF_BAR_UART 0x80 ++#define LPCIF_BAR_FAST_KYBD 0x84 ++#define LPCIF_BAR_EMBED_FLASH 0x88 ++#define LPCIF_BAR_GP_SPI 0x8c ++#define LPCIF_BAR_EMI 0x90 ++#define LPCIF_BAR_PMH7 0x94 ++#define LPCIF_BAR_PORT80_DBG0 0x98 ++#define LPCIF_BAR_PORT80_DBG1 0x9c ++#define LPCIF_BAR_RTC 0xa0 ++ ++// UART registers ++#define UART_ACTIVATE 0x30 ++#define UART_CONFIG_SELECT 0xf0 ++ ++void microchip_pnp_enter_conf_state(uint16_t port); ++void microchip_pnp_exit_conf_state(uint16_t port); ++uint8_t pnp_read(uint16_t port, uint8_t index); ++uint32_t pnp_read_le32(uint16_t port, uint8_t index); ++void pnp_write(uint16_t port, uint8_t index, uint8_t value); ++void pnp_write_le32(uint16_t port, uint8_t index, uint32_t value); ++ ++#define EC0_CMD 0x0066 ++#define EC0_DATA 0x0062 ++#define EC1_CMD 0x1604 ++#define EC1_DATA 0x1600 ++#define EC2_CMD 0x1634 ++#define EC2_DATA 0x1630 ++#define EC3_CMD 0x161c ++#define EC3_DATA 0x1618 ++ ++#define EC_OBF (1 << 0) ++#define EC_IBF (1 << 1) ++ ++#define EC_READ 0x80 ++#define EC_WRITE 0x81 ++ ++uint8_t ecN_read(uint16_t cmd_port, uint16_t data_port, uint8_t addr); ++ ++void ecN_write(uint16_t cmd_port, uint16_t data_port, uint8_t addr, uint8_t val); ++ ++// EC0 and EC1 mostly are useful with the READ/WRITE commands ++#define ec0_read(addr) ecN_read(EC0_CMD, EC0_DATA, addr) ++#define ec0_write(addr, val) ecN_write(EC0_CMD, EC0_DATA, addr, val) ++#define ec1_read(addr) ecN_read(EC1_CMD, EC1_DATA, addr) ++#define ec1_write(addr, val) ecN_write(EC1_CMD, EC1_DATA, addr, val) ++ ++// Read from the emulated EEPROM ++uint8_t eeprom_read(uint16_t addr); ++ ++// Write to the emulated EEPROM ++void eeprom_write(uint16_t addr, uint8_t val); ++ ++// Read loaded debug key mask ++uint16_t debug_loaded_keys(void); ++ ++// The following location (via either EC0 or EC1) can be used to interact with the debug interface ++#define EC_DEBUG_CMD 0x3d ++ ++void debug_read_key(uint8_t i, uint8_t *key); ++ ++void debug_write_key(uint8_t i, const uint8_t *key); ++ ++uint32_t debug_read_dword(uint32_t addr); ++ ++void debug_write_dword(uint32_t addr, uint32_t val); ++ ++// RW unlock key index ++#define DEBUG_RW_KEY_IDX 1 ++ ++// RW unlock key for EC version N24HT37W ++extern const uint8_t debug_rw_key[8]; ++ ++#endif +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h b/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h +new file mode 100644 +index 0000000000..d89ed712d4 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h +@@ -0,0 +1,8 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#ifndef GPIO_H ++#define GPIO_H ++ ++void variant_config_gpios(void); ++ ++#endif +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c b/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c +new file mode 100644 +index 0000000000..44c8578852 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c +@@ -0,0 +1,105 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include ++#include ++#include ++#include ++#include "ec.h" ++#include "gpio.h" ++ ++#define GPIO_GPU_RST GPP_E22 // active low ++#define GPIO_1R8VIDEO_AON_ON GPP_E23 ++ ++#define GPIO_DGFX_PWRGD GPP_F3 ++ ++#define GPIO_DISCRETE_PRESENCE GPP_D9 // active low ++#define GPIO_DGFX_VRAM_ID0 GPP_D11 ++#define GPIO_DGFX_VRAM_ID1 GPP_D12 ++ ++void mainboard_silicon_init_params(FSP_SIL_UPD *params) ++{ ++ static const char * const dgfx_vram_id_str[] = { "1GB", "2GB", "4GB", "N/A" }; ++ ++ int dgfx_vram_id; ++ ++ // Setup GPIOs ++ variant_config_gpios(); ++ ++ // Detect and enable dGPU ++ if (gpio_get(GPIO_DISCRETE_PRESENCE) == 0) { // active low ++ dgfx_vram_id = gpio_get(GPIO_DGFX_VRAM_ID0) | gpio_get(GPIO_DGFX_VRAM_ID1) << 1; ++ printk(BIOS_DEBUG, "Discrete GPU present with %s VRAM\n", dgfx_vram_id_str[dgfx_vram_id]); ++ ++ // NOTE: i pulled this GPU enable sequence from thin air ++ // it sometimes works but is buggy and the GPU disappears in some cases so disabling it by default. ++ // also unrelated to this enable sequence the nouveau driver only works on 6.8-6.9 kernels ++ if (get_uint_option("dgpu_enable", 0)) { ++ printk(BIOS_DEBUG, "Enabling discrete GPU\n"); ++ gpio_set(GPIO_1R8VIDEO_AON_ON, 1); // Enable GPU power rail ++ while (!gpio_get(GPIO_DGFX_PWRGD)) // Wait for power good signal from GPU ++ ; ++ gpio_set(GPIO_GPU_RST, 1); // Release GPU from reset ++ } else { ++ printk(BIOS_DEBUG, "Discrete GPU will remain disabled\n"); ++ } ++ ++ } else { ++ printk(BIOS_DEBUG, "Discrete GPU not present\n"); ++ } ++} ++ ++static void dump_ec_cfg(uint16_t port) ++{ ++ microchip_pnp_enter_conf_state(port); ++ ++ // Device info ++ printk(BIOS_DEBUG, "Device id %02x\n", pnp_read(port, EC_DEVICE_ID)); ++ printk(BIOS_DEBUG, "Device rev %02x\n", pnp_read(port, EC_DEVICE_REV)); ++ ++ // Switch to LPCIF LDN ++ pnp_write(port, PNP_LDN_SELECT, LDN_LPCIF); ++ ++ // Dump SIRQs ++ for (int i = 0; i <= 15; i += 1) ++ printk(BIOS_DEBUG, "SIRQ%d = %02x\n", i, pnp_read(port, LPCIF_SIRQ(i))); ++ ++ // Dump BARs ++ printk(BIOS_DEBUG, "BAR CFG = %08x\n", pnp_read_le32(port, LPCIF_BAR_CFG)); ++ printk(BIOS_DEBUG, "BAR MAILBOX = %08x\n", pnp_read_le32(port, LPCIF_BAR_MAILBOX)); ++ printk(BIOS_DEBUG, "BAR 8042 = %08x\n", pnp_read_le32(port, LPCIF_BAR_8042)); ++ printk(BIOS_DEBUG, "BAR ACPI_EC0 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC0)); ++ printk(BIOS_DEBUG, "BAR ACPI_EC1 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC1)); ++ printk(BIOS_DEBUG, "BAR ACPI_EC2 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC2)); ++ printk(BIOS_DEBUG, "BAR ACPI_EC3 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC3)); ++ printk(BIOS_DEBUG, "BAR ACPI_PM0 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_PM0)); ++ printk(BIOS_DEBUG, "BAR UART = %08x\n", pnp_read_le32(port, LPCIF_BAR_UART)); ++ printk(BIOS_DEBUG, "BAR FAST_KYBD = %08x\n", pnp_read_le32(port, LPCIF_BAR_FAST_KYBD)); ++ printk(BIOS_DEBUG, "BAR EMBED_FLASH = %08x\n", pnp_read_le32(port, LPCIF_BAR_EMBED_FLASH)); ++ printk(BIOS_DEBUG, "BAR GP_SPI = %08x\n", pnp_read_le32(port, LPCIF_BAR_GP_SPI)); ++ printk(BIOS_DEBUG, "BAR EMI = %08x\n", pnp_read_le32(port, LPCIF_BAR_EMI)); ++ printk(BIOS_DEBUG, "BAR PMH7 = %08x\n", pnp_read_le32(port, LPCIF_BAR_PMH7)); ++ printk(BIOS_DEBUG, "BAR PORT80_DBG0 = %08x\n", pnp_read_le32(port, LPCIF_BAR_PORT80_DBG0)); ++ printk(BIOS_DEBUG, "BAR PORT80_DBG1 = %08x\n", pnp_read_le32(port, LPCIF_BAR_PORT80_DBG1)); ++ printk(BIOS_DEBUG, "BAR RTC = %08x\n", pnp_read_le32(port, LPCIF_BAR_RTC)); ++ ++ microchip_pnp_exit_conf_state(port); ++} ++ ++static void mainboard_enable(struct device *dev) ++{ ++ if (CONFIG(VGA_ROM_RUN)) ++ install_intel_vga_int15_handler(GMA_INT15_ACTIVE_LFP_EDP, ++ GMA_INT15_PANEL_FIT_DEFAULT, ++ GMA_INT15_BOOT_DISPLAY_DEFAULT, 0); ++} ++ ++static void mainboard_init(void *chip_info) ++{ ++ dump_ec_cfg(EC_CFG_PORT); ++} ++ ++struct chip_operations mainboard_ops = { ++ .enable_dev = mainboard_enable, ++ .init = mainboard_init, ++}; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..4db4202961d0be67b75f52b28f2111d5655595c3 +GIT binary patch +literal 4106 +zcmeHJU2GIp6h5=FKeKmc=rAo()>4l^U|XP_ZDGYy!|YE>mu}hZ4|PdQy1bV0gipVB&+pHzmFpc`=IXxii}qiqH*)7}PU+ +z?woV)x!<09?wNbfhQa6n_IK}3M!Gw&OgS)sY2Q$LJ4F+z{-JneATkt9refXr6+8sr +zR{e1eASVcGl#mf_O&p%I^1;3af=xDeN0ZnydT=;zHOH-q=O;(UFda)^LXW8| +z-Vsanq!Y==Kq9plQ+*gu^hf&pJ9?tY{h01cbtR&SfsVM!_*!D4W5>papLuo?gRur| +zF$`lX;f2t48Dpd4V@(*z=dq95OkkfiVU53N<(gE+=U)KHEdU4}@R=aMjTTTOcb8-a +zC9IXSxZB*|#u~SlHnpsY25L#Sxy6ljl16gI)H0f>for?qaszCX;ESpG=pqROFWR~Z +zTqQzcH(berra`9K(R~0OJ_eeA=> +z&R-)LYP^U3@%6h}+0)7m-mEOhOM92l32>zpvu-&@ZkPf<>~Bsv&Oy1O(`pbLUf3vt*0HIRk0U3EzI +zIeSaIE9*jps%6qP7$EQo8=K#f^K_mFpy5prkNNSOU;oI@KK0}Ge*G6eyWz+6OyADf +zE`}Db#-81u-uS=OJB*=`v}WPMs@ugdtLtbZo6OEUf}>!QL` +z1zQ!pLt!Zek0|;p3VTDrj}`q(g?+8yuZk|KY?X>TRlP@LPpbH`s-ITbSygS+Jq6cQ +zp|Em=T_#B53Y|R}mtw!K3mUyWRhytxx_wi^(}HurDkx@L%OlKIA%rq@7%bE{p{Wl~ +zJJ%lV6&>fxBjnbA8G(&P?a8o%P#c~Wo$7|%1UE-$r;6jwt1uejOfMLwF-BDgC-Q+N +za!Hx;1S&$9!rlNCTsI*IMZ0#Y5aEO7sjIz#jb`S|q7OpRYx`h&=PK}_YnN#poNF=7 +z3yTO|pc0N&G3cozl21Q6c)l0vjm~0uFL)%2_T5RYR1$~dO~u)4px!jFycZNnchPVA +z!0+Vc_afL{m>rv2PY8{Cma`W{yG~JNJu?;L!#fSLmwRW{8R@gD7Z5~{xvZGpN)U`j +z^I~=;XVmtVzgSv@Na@HC?lC8A1l2+CU Disabled); ++ ++end GMA.Mainboard; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c +new file mode 100644 +index 0000000000..f7c29e1f39 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c +@@ -0,0 +1,203 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include "../../gpio.h" ++ ++/* FIXME: There are multiple GPIOs here that should be locked to prevent "TPM GPIO fail" style ++ * attacks. Unfortunately SKL/KBL GPIO locking *does not* work currently. */ ++ ++static const struct pad_config gpio_table[] = { ++ ++ /* ------- GPIO Community 0 ------- */ ++ ++ /* ------- GPIO Group GPP_A ------- */ ++ PAD_CFG_NF(GPP_A0, NONE, DEEP, NF1), /* -KBRC */ ++ PAD_CFG_NF(GPP_A1, NATIVE, DEEP, NF1), /* LPC_AD0 */ ++ PAD_CFG_NF(GPP_A2, NATIVE, DEEP, NF1), /* LPC_AD1 */ ++ PAD_CFG_NF(GPP_A3, NATIVE, DEEP, NF1), /* LPC_AD2 */ ++ PAD_CFG_NF(GPP_A4, NATIVE, DEEP, NF1), /* LPC_AD3 */ ++ PAD_CFG_NF(GPP_A5, NONE, DEEP, NF1), /* -LPC_FRAME */ ++ PAD_CFG_NF(GPP_A6, NONE, DEEP, NF1), /* IRQSER */ ++ PAD_CFG_NF(GPP_A7, NONE, DEEP, NF1), /* -TPM_IRQ */ ++ PAD_CFG_NF(GPP_A8, NONE, DEEP, NF1), /* -CLKRUN */ ++ PAD_CFG_NF(GPP_A9, NATIVE, DEEP, NF1), /* LPCCLK_EC_24M */ ++ PAD_CFG_NF(GPP_A10, NATIVE, DEEP, NF1), /* LPCCLK_DEBUG_24M */ ++ PAD_NC(GPP_A11, NONE), ++ PAD_NC(GPP_A12, NONE), ++ PAD_CFG_NF(GPP_A13, NATIVE, DEEP, NF1), /* -SUSWARN */ ++ PAD_CFG_NF(GPP_A14, NATIVE, DEEP, NF1), /* -SUS_STAT */ ++ PAD_CFG_NF(GPP_A15, NATIVE, DEEP, NF1), /* -SUSWARN */ ++ PAD_NC(GPP_A16, NONE), ++ PAD_NC(GPP_A17, NONE), ++ PAD_NC(GPP_A18, NONE), ++ PAD_NC(GPP_A19, NONE), ++ PAD_NC(GPP_A20, NONE), ++ PAD_NC(GPP_A21, NONE), ++ PAD_NC(GPP_A22, NONE), ++ PAD_NC(GPP_A23, NONE), ++ ++ /* ------- GPIO Group GPP_B ------- */ ++ PAD_NC(GPP_B0, NONE), ++ PAD_NC(GPP_B1, NONE), ++ PAD_NC(GPP_B2, NONE), ++ PAD_NC(GPP_B3, NONE), ++ PAD_CFG_GPI_SCI(GPP_B4, NONE, DEEP, EDGE_SINGLE, INVERT), /* -TBT_PLUG_EVENT */ ++ PAD_CFG_NF(GPP_B5, NONE, DEEP, NF1), /* -CLKREQ_PCIE0 */ ++ PAD_CFG_NF(GPP_B6, NONE, DEEP, NF1), /* -CLKREQ_PCIE4 */ ++ PAD_CFG_NF(GPP_B7, NONE, DEEP, NF1), /* -CLKREQ_PCIE5 */ ++ PAD_CFG_NF(GPP_B8, NONE, DEEP, NF1), /* -CLKREQ_PCIE6 */ ++ PAD_CFG_NF(GPP_B9, NONE, DEEP, NF1), /* -CLKREQ_PCIE8 */ ++ PAD_CFG_NF(GPP_B10, NONE, DEEP, NF1), /* -CLKREQ_PCIE10 */ ++ PAD_NC(GPP_B11, NONE), ++ PAD_CFG_NF(GPP_B12, NONE, DEEP, NF1), /* -PCH_SLP_S0 */ ++ PAD_CFG_NF(GPP_B13, NONE, DEEP, NF1), /* -PLTRST */ ++ PAD_CFG_NF(GPP_B14, NATIVE, DEEP, NF1), /* PCH_SPKR */ ++ PAD_CFG_GPO(GPP_B15, 1, DEEP), /* NFC_DLREQ */ ++ PAD_NC(GPP_B16, NONE), ++ PAD_NC(GPP_B17, NONE), ++ PAD_NC(GPP_B18, NONE), ++ PAD_NC(GPP_B19, NONE), ++ PAD_NC(GPP_B20, NONE), ++ PAD_NC(GPP_B21, NONE), ++ PAD_NC(GPP_B22, NONE), ++ PAD_NC(GPP_B23, NONE), ++ ++ /* ------- GPIO Community 1 ------- */ ++ ++ /* ------- GPIO Group GPP_C ------- */ ++ PAD_CFG_NF(GPP_C0, NONE, DEEP, NF1), /* SMB_CLK */ ++ PAD_CFG_NF(GPP_C1, NONE, DEEP, NF1), /* SMB_DATA */ ++ PAD_NC(GPP_C2, NONE), ++ PAD_CFG_NF(GPP_C3, NONE, DEEP, NF1), /* SML0_CLK */ ++ PAD_CFG_NF(GPP_C4, NONE, DEEP, NF1), /* SML0_DATA */ ++ PAD_NC(GPP_C5, NONE), ++ PAD_CFG_NF(GPP_C6, NONE, DEEP, NF1), /* EC_SCL2 */ ++ PAD_CFG_NF(GPP_C7, NONE, DEEP, NF1), /* EC_SDA2 */ ++ PAD_NC(GPP_C8, NONE), ++ PAD_NC(GPP_C9, NONE), ++ PAD_NC(GPP_C10, NONE), ++ PAD_NC(GPP_C11, NONE), ++ PAD_NC(GPP_C12, NONE), ++ PAD_NC(GPP_C13, NONE), ++ PAD_NC(GPP_C14, NONE), ++ PAD_NC(GPP_C15, NONE), ++ PAD_CFG_NF(GPP_C16, NONE, DEEP, NF1), /* I2C0_DATA */ ++ PAD_CFG_NF(GPP_C17, NONE, DEEP, NF1), /* I2C0_CLK */ ++ PAD_NC(GPP_C18, NONE), ++ PAD_NC(GPP_C19, NONE), ++ PAD_CFG_GPO(GPP_C20, 0, DEEP), /* EPRIVACY_ON */ ++ PAD_CFG_GPO(GPP_C21, 0, DEEP), /* TBT_FORCE_PWR */ ++ PAD_CFG_GPI_SCI(GPP_C22, NONE, DEEP, EDGE_SINGLE, INVERT), /* -EC_SCI */ ++ PAD_CFG_GPI_SCI(GPP_C23, NONE, DEEP, EDGE_SINGLE, INVERT), /* -EC_WAKE */ ++ ++ /* ------- GPIO Group GPP_D ------- */ ++ PAD_NC(GPP_D0, NONE), ++ PAD_NC(GPP_D1, NONE), ++ PAD_NC(GPP_D2, NONE), ++ PAD_NC(GPP_D3, NONE), ++ PAD_NC(GPP_D4, NONE), ++ PAD_NC(GPP_D5, NONE), ++ PAD_NC(GPP_D6, NONE), ++ PAD_NC(GPP_D7, NONE), ++ PAD_NC(GPP_D8, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_D9, UP_20K, DEEP, OFF, ACPI), /* -DISCRETE_PRESENCE */ ++ PAD_NC(GPP_D10, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_D11, UP_20K, DEEP, OFF, ACPI), /* DGFX_VRAM_ID0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_D12, UP_20K, DEEP, OFF, ACPI), /* DGFX_VRAM_ID1 */ ++ PAD_NC(GPP_D13, NONE), ++ PAD_NC(GPP_D14, NONE), ++ PAD_NC(GPP_D15, NONE), ++ PAD_NC(GPP_D16, NONE), ++ PAD_CFG_GPO(GPP_D17, 0, DEEP), /* DDI_PRIORITY1 */ ++ PAD_NC(GPP_D18, NONE), ++ PAD_NC(GPP_D19, NONE), ++ PAD_NC(GPP_D20, NONE), ++ PAD_NC(GPP_D21, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_D22, UP_20K, DEEP, OFF, ACPI), /* -NFC_DTCT */ ++ PAD_NC(GPP_D23, NONE), ++ ++ /* ------- GPIO Group GPP_E ------- */ ++ PAD_NC(GPP_E0, NONE), ++ PAD_CFG_NF(GPP_E1, NONE, DEEP, NF1), /* -WWAN_SATA_DTCT (always HIGH) */ ++ PAD_CFG_NF(GPP_E2, NONE, DEEP, NF1), /* -PE_DTCT */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_E3, NONE, DEEP, EDGE_SINGLE, ACPI), /* -TBT_PLUG_EVENT */ ++ PAD_CFG_GPO(GPP_E4, 1, DEEP), /* NFC_ON */ ++ PAD_NC(GPP_E5, NONE), ++ PAD_CFG_NF(GPP_E6, NONE, RSMRST, NF1), /* SATA2_DEVSLP */ ++ PAD_NC(GPP_E7, NONE), ++ PAD_NC(GPP_E8, NONE), ++ PAD_CFG_NF(GPP_E9, NONE, DEEP, NF1), /* -USB_PORT0_OC0 (AON port) */ ++ PAD_CFG_NF(GPP_E10, NONE, DEEP, NF1), /* -USB_PORT1_OC1 (regular port) */ ++ PAD_NC(GPP_E11, NONE), ++ PAD_CFG_GPI_APIC_HIGH(GPP_E12, NONE, DEEP), /* NFC_INT */ ++ PAD_CFG_NF(GPP_E13, NONE, DEEP, NF1), /* DDIP1_HPD */ ++ PAD_CFG_NF(GPP_E14, NONE, DEEP, NF1), /* DDIP2_HPD */ ++ PAD_NC(GPP_E15, NONE), ++ PAD_NC(GPP_E16, NONE), ++ PAD_CFG_NF(GPP_E17, NONE, DEEP, NF1), /* EDP_HPD */ ++ PAD_NC(GPP_E18, NONE), ++ PAD_NC(GPP_E19, NONE), ++ PAD_CFG_NF(GPP_E20, NONE, DEEP, NF1), /* DDIP2_CTRLCLK */ ++ PAD_CFG_NF(GPP_E21, NONE, DEEP, NF1), /* DDIP2_CTRLDATA */ ++ PAD_CFG_TERM_GPO(GPP_E22, 0, UP_20K, RSMRST), /* -GPU_RST */ ++ PAD_CFG_TERM_GPO(GPP_E23, 0, UP_20K, RSMRST), /* 1R8VIDEO_AON_ON */ ++ ++ /* ------- GPIO Community 2 ------- */ ++ ++ /* -------- GPIO Group GPD -------- */ ++ PAD_CFG_NF(GPD0, NONE, PWROK, NF1), /* -BATLOW */ ++ PAD_CFG_NF(GPD1, NATIVE, PWROK, NF1), /* AC_PRESENT */ ++ PAD_CFG_NF(GPD2, NATIVE, PWROK, NF1), /* -LANWAKE */ ++ PAD_CFG_NF(GPD3, UP_20K, PWROK, NF1), /* -PWRSW_EC */ ++ PAD_CFG_NF(GPD4, NONE, PWROK, NF1), /* -PCH_SLP_S3 */ ++ PAD_CFG_NF(GPD5, NONE, PWROK, NF1), /* -PCH_SLP_S4 */ ++ PAD_CFG_NF(GPD6, NONE, PWROK, NF1), /* -PCH_SLP_M */ ++ PAD_NC(GPD7, NONE), ++ PAD_CFG_NF(GPD8, NONE, PWROK, NF1), /* SUSCLK_32K */ ++ PAD_CFG_NF(GPD9, NONE, PWROK, NF1), /* -PCH_SLP_WLAN */ ++ PAD_CFG_NF(GPD10, NONE, PWROK, NF1), /* -PCH_SLP_S5 */ ++ PAD_CFG_NF(GPD11, NONE, PWROK, NF1), /* LANPHYPC */ ++ ++ /* ------- GPIO Community 3 ------- */ ++ ++ /* ------- GPIO Group GPP_F ------- */ ++ PAD_NC(GPP_F0, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_F1, NONE, DEEP, OFF, ACPI), /* GC6_FB_EN */ ++ PAD_CFG_GPO(GPP_F2, 1, DEEP), /* -GPU_EVENT */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F3, NONE, DEEP, OFF, ACPI), /* DGFX_PWRGD */ ++ PAD_CFG_GPO(GPP_F4, 1, DEEP), /* -WWAN_RESET */ ++ PAD_NC(GPP_F5, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_F6, UP_20K, DEEP, OFF, ACPI), /* -MIC_HW_EN (R961 to GND) */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F7, UP_20K, DEEP, OFF, ACPI), /* -INT_MIC_DTCT */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F8, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F9, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG1 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F10, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG2 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F11, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG3 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F12, UP_20K, DEEP, OFF, ACPI), /* PLANARID0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F13, UP_20K, DEEP, OFF, ACPI), /* PLANARID1 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F14, UP_20K, DEEP, OFF, ACPI), /* PLANARID2 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F15, UP_20K, DEEP, OFF, ACPI), /* PLANARID3 */ ++ PAD_NC(GPP_F16, NONE), ++ PAD_NC(GPP_F17, NONE), ++ PAD_NC(GPP_F18, NONE), ++ PAD_NC(GPP_F19, NONE), ++ PAD_NC(GPP_F20, NONE), ++ PAD_NC(GPP_F21, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_F22, UP_20K, DEEP, OFF, ACPI), /* -INTRUDER_PCH */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F23, UP_20K, DEEP, OFF, ACPI), /* -SC_DTCT */ ++ ++ /* ------- GPIO Group GPP_G ------- */ ++ PAD_NC(GPP_G0, NONE), ++ PAD_NC(GPP_G1, NONE), ++ PAD_NC(GPP_G2, NONE), ++ PAD_NC(GPP_G3, NONE), ++ PAD_CFG_GPO(GPP_G4, 0, DEEP), /* TBT_RTD3_PWR_EN */ ++ PAD_CFG_GPO(GPP_G5, 0, DEEP), /* TBT_FORCE_USB_PWR */ ++ PAD_CFG_GPO(GPP_G6, 0, DEEP), /* -TBT_PERST */ ++ PAD_CFG_GPI_SCI(GPP_G7, NONE, DEEP, LEVEL, INVERT), /* -TBT_PCIE_WAKE */ ++}; ++ ++void variant_config_gpios(void) ++{ ++ gpio_configure_pads(gpio_table, ARRAY_SIZE(gpio_table)); ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c +new file mode 100644 +index 0000000000..3a951ce0da +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c +@@ -0,0 +1,90 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++ ++const u32 cim_verb_data[] = { ++ 0x10ec0257, // Vendor/Device ID: Realtek ALC257 ++ 0x17aa225d, // Subsystem ID ++ 11, ++ AZALIA_SUBVENDOR(0, 0x17aa225d), ++ ++ AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_DESC( ++ AZALIA_INTEGRATED, ++ AZALIA_INTERNAL, ++ AZALIA_MIC_IN, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_NO_JACK_PRESENCE_DETECT, ++ 2, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x13, 0x40000000), // does not describe a jack or internal device ++ AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( ++ AZALIA_INTEGRATED, ++ AZALIA_INTERNAL, ++ AZALIA_SPEAKER, ++ AZALIA_OTHER_ANALOG, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_NO_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x18, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++ AZALIA_MIC_IN, ++ AZALIA_STEREO_MONO_1_8, ++ AZALIA_BLACK, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 3, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x1b, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x1d, 0x40661b45), // does not describe a jack or internal device ++ AZALIA_PIN_CFG(0, 0x1e, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x21, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++ AZALIA_HP_OUT, ++ AZALIA_STEREO_MONO_1_8, ++ AZALIA_BLACK, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 1, 15 ++ )), ++ ++ 0x8086280b, // Vendor/Device ID: Intel Kabylake HDMI ++ 0x80860101, // Subsystem ID ++ 4, ++ AZALIA_SUBVENDOR(2, 0x80860101), ++ ++ AZALIA_PIN_CFG(2, 0x05, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_DIGITAL_DISPLAY, ++ AZALIA_DIGITAL_OTHER_OUT, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), ++ AZALIA_PIN_CFG(2, 0x06, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_DIGITAL_DISPLAY, ++ AZALIA_DIGITAL_OTHER_OUT, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 2, 0 ++ )), ++ AZALIA_PIN_CFG(2, 0x07, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_DIGITAL_DISPLAY, ++ AZALIA_DIGITAL_OTHER_OUT, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 3, 0 ++ )), ++}; ++ ++const u32 pc_beep_verbs[] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c +new file mode 100644 +index 0000000000..5252a402f9 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c +@@ -0,0 +1,20 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include ++ ++void mainboard_memory_init_params(FSPM_UPD *mupd) ++{ ++ FSP_M_CONFIG *mem_cfg = &mupd->FspmConfig; ++ mem_cfg->DqPinsInterleaved = true; /* DDR_DQ in interleave mode */ ++ mem_cfg->CaVrefConfig = 2; /* VREF_CA to CH_A and VREF_DQ_B to CH_B */ ++ mem_cfg->MemorySpdDataLen = CONFIG_DIMM_SPD_SIZE; ++ ++ /* Get SPD for memory slots */ ++ struct spd_block blk = { .addr_map = { 0x50, 0x51, } }; ++ get_spd_smbus(&blk); ++ dump_spd_info(&blk); ++ ++ mem_cfg->MemorySpdPtr00 = (uintptr_t)blk.spd_array[0]; ++ mem_cfg->MemorySpdPtr10 = (uintptr_t)blk.spd_array[1]; ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb +new file mode 100644 +index 0000000000..bf66bd3a69 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb +@@ -0,0 +1,103 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++chip soc/intel/skylake ++ device domain 0 on ++ device ref south_xhci on ++ register "usb2_ports" = "{ ++ [0] = USB2_PORT_MID(OC1), // USB-A ++ [1] = USB2_PORT_MID(OC0), // USB-A (always on) ++ [2] = USB2_PORT_MID(OC_SKIP), // JSC-1 (smartcard slot) ++ [3] = USB2_PORT_MID(OC_SKIP), // USB-C (charging port) ++ [4] = USB2_PORT_MID(OC_SKIP), // JCAM1 (IR camera) ++ [5] = USB2_PORT_MID(OC_SKIP), // JWWAN1 (M.2 WWAN USB) ++ [6] = USB2_PORT_MID(OC_SKIP), // JWLAN1 (M.2 WLAN USB) ++ [7] = USB2_PORT_MID(OC_SKIP), // JCAM1 (webcam) ++ [8] = USB2_PORT_MID(OC_SKIP), // JFPR1 (fingerprint reader) ++ [9] = USB2_PORT_MID(OC_SKIP), // JLCD1 (touch panel) ++ }" ++ register "usb3_ports" = "{ ++ [0] = USB3_PORT_DEFAULT(OC1), // USB-A ++ [1] = USB3_PORT_DEFAULT(OC0), // USB-A (always on) ++ [2] = USB3_PORT_DEFAULT(OC_SKIP), // RTS5344S (SD card reader) ++ [3] = USB3_PORT_DEFAULT(OC_SKIP), // USB-C (charging port) ++ }" ++ end ++ ++ device ref sata on ++ # SATA_2 - JHDD1 SATA SSD ++ register "SataPortsEnable[2]" = "1" ++ register "SataPortsDevSlp[2]" = "1" ++ end ++ ++ # PCIe controller 1 - 1x4 ++ # PCIE 1-4 - RP1 - dGPU - CLKOUT0 - CLKREQ0 ++ # ++ # PCIe controller 2 - 2x1+1x2 (lane reversal) ++ # PCIE 5 - GBE - GBE - CLKOUT1 - CLKREQ1 (clobbers RP8) ++ # PCIE 6 - RP7 - WLAN - CLKOUT2 - CLKREQ2 ++ # PCIE 7-8 - RP5 - WWAN - CLKOUT3 - CLKREQ3 ++ # ++ # PCIe controller 3 - 2x2 ++ # PCIE 9-10 - RP9 - TB3 - CLKOUT4 - CLKREQ4 ++ # PCIE 11-12 - RP11 - SSD - CLKOUT5 - CLKREQ5 ++ ++ # dGPU - x4 ++ device ref pcie_rp1 on ++ register "PcieRpEnable[0]" = "1" ++ register "PcieRpClkReqSupport[0]" = "1" ++ register "PcieRpClkReqNumber[0]" = "0" ++ register "PcieRpClkSrcNumber[0]" = "0" ++ register "PcieRpAdvancedErrorReporting[0]" = "1" ++ register "PcieRpLtrEnable[0]" = "1" ++ end ++ ++ # Ethernet (clobbers RP8) ++ device ref gbe on ++ register "LanClkReqSupported" = "1" ++ register "LanClkReqNumber" = "1" ++ register "EnableLanLtr" = "1" ++ register "EnableLanK1Off" = "1" ++ end ++ ++ # M.2 WLAN - x1 ++ device ref pcie_rp7 on ++ register "PcieRpEnable[6]" = "1" ++ register "PcieRpClkReqSupport[6]" = "1" ++ register "PcieRpClkReqNumber[6]" = "2" ++ register "PcieRpClkSrcNumber[6]" = "2" ++ register "PcieRpAdvancedErrorReporting[6]" = "1" ++ register "PcieRpLtrEnable[6]" = "1" ++ end ++ ++ # M.2 WWAN - x2 ++ device ref pcie_rp5 on ++ register "PcieRpEnable[4]" = "1" ++ register "PcieRpClkReqSupport[4]" = "1" ++ register "PcieRpClkReqNumber[4]" = "3" ++ register "PcieRpClkSrcNumber[4]" = "3" ++ register "PcieRpAdvancedErrorReporting[4]" = "1" ++ register "PcieRpLtrEnable[4]" = "1" ++ end ++ ++ # TB3 (Alpine Ridge LP) - x2 ++ device ref pcie_rp9 on ++ register "PcieRpEnable[8]" = "1" ++ register "PcieRpClkReqSupport[8]" = "1" ++ register "PcieRpClkReqNumber[8]" = "4" ++ register "PcieRpClkSrcNumber[8]" = "4" ++ register "PcieRpAdvancedErrorReporting[8]" = "1" ++ register "PcieRpLtrEnable[8]" = "1" ++ register "PcieRpHotPlug[8]" = "1" ++ end ++ ++ # M.2 2280 caddy - x2 ++ device ref pcie_rp11 on ++ register "PcieRpEnable[10]" = "1" ++ register "PcieRpClkReqSupport[10]" = "1" ++ register "PcieRpClkReqNumber[10]" = "5" ++ register "PcieRpClkSrcNumber[10]" = "5" ++ register "PcieRpAdvancedErrorReporting[10]" = "1" ++ register "PcieRpLtrEnable[10]" = "1" ++ end ++ end ++end +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..47732e37d5b2bad4e674fd10eafa605d26f97840 +GIT binary patch +literal 4106 +zcmeHJUu+a*5TCu>yW9JAmoD2P9tqx`iFWXCLD09RaS&4j$?kY0KGYdgn6;MZ*!anbk!PNr!a%eU +zTXkLEL3ly5L&oUX#CS7?b2%Kad?s-#@;mhg8>>>#S&)d2I +zmP&-g0$k02szSQj(Y*j}YYtQnDH0;2ui{mPhI!flfFgv9nqI4Wr~5_?s`k0kALiCvcP +zCrRUFrpVYPYn?Jn%6MGXUXj_GGJYa!U&-tn8Gn&ANnz_0+@olH3VTw)mlf@-!p8{!e#p0ct5}M(h16D>p?OGjSz6v3juERjS +z#z{?mXvVqrXs_rvUmYR40gNzg(QD6y9E94?4DWO|6eb83LI-smcVC6x1n2reH}rAp +zLM);f=tWDCr``UF5T>!;PYu^H1g>EBP8A}2*fM>s-@nC3pDV|}6+CtfhG(II7`pcw +z`jLfJ!?;*R@Bp=Nw2EPOC7FEs(cugIP_K6tN_$~tvS8nx6iOv|IMrO3&-m*N9ZP#b +znG^~>I|l1cUVSeD9r^k3h0TP}WWD9=MZxY<Z3B2yU!k71#YRpThOJtVheMDA50rV#s@U +z+nKbA{O(olYR}icuzQD*-cjBQ9;%!eMDVP>7mWsF@=%>o)wSgq=n%DHNOYwRr4Ao6 +zbNdgEn*RdDS>Rud+fIY0N8JkP3q6;>8o%R(CE2n3?Xg%qP+U%~6|{XFyxv7Y#;J2Z +XK$lk*wsY^m4}9|iz?mg_AjCfat$CyH + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads +new file mode 100644 +index 0000000000..fcfbd75a92 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads +@@ -0,0 +1,19 @@ ++-- SPDX-License-Identifier: GPL-2.0-or-later ++ ++with HW.GFX.GMA; ++with HW.GFX.GMA.Display_Probing; ++ ++use HW.GFX.GMA; ++use HW.GFX.GMA.Display_Probing; ++ ++private package GMA.Mainboard is ++ ++ ports : constant Port_List := ++ (eDP, ++ DP1, ++ DP2, ++ HDMI1, ++ HDMI2, ++ others => Disabled); ++ ++end GMA.Mainboard; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c +new file mode 100644 +index 0000000000..a98dd2bc4e +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c +@@ -0,0 +1,199 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include "../../gpio.h" ++ ++static const struct pad_config gpio_table[] = { ++ /* ------- GPIO Community 0 ------- */ ++ ++ /* ------- GPIO Group GPP_A ------- */ ++ PAD_CFG_NF(GPP_A0, NONE, DEEP, NF1), /* -KBRC */ ++ PAD_CFG_NF(GPP_A1, NATIVE, DEEP, NF1), /* LPC_AD0 */ ++ PAD_CFG_NF(GPP_A2, NATIVE, DEEP, NF1), /* LPC_AD1 */ ++ PAD_CFG_NF(GPP_A3, NATIVE, DEEP, NF1), /* LPC_AD2 */ ++ PAD_CFG_NF(GPP_A4, NATIVE, DEEP, NF1), /* LPC_AD3 */ ++ PAD_CFG_NF(GPP_A5, NONE, DEEP, NF1), /* -LPC_FRAME */ ++ PAD_CFG_NF(GPP_A6, NONE, DEEP, NF1), /* IRQSER */ ++ PAD_CFG_NF(GPP_A7, NONE, DEEP, NF1), /* -TPM_IRQ */ ++ PAD_CFG_NF(GPP_A8, NONE, DEEP, NF1), /* -CLKRUN */ ++ PAD_CFG_NF(GPP_A9, DN_20K, DEEP, NF1), /* LPCCLK_EC_24M */ ++ PAD_CFG_NF(GPP_A10, DN_20K, DEEP, NF1), /* LPCCLK_DEBUG_24M */ ++ PAD_NC(GPP_A11, NONE), ++ PAD_NC(GPP_A12, NONE), ++ PAD_CFG_NF(GPP_A13, NONE, DEEP, NF1), /* -SUSWARN */ ++ PAD_CFG_NF(GPP_A14, NONE, DEEP, NF1), /* -SUS_STAT */ ++ PAD_CFG_NF(GPP_A15, UP_20K, DEEP, NF1), /* -SUSWARN */ ++ PAD_NC(GPP_A16, NONE), ++ PAD_NC(GPP_A17, NONE), ++ PAD_NC(GPP_A18, NONE), ++ PAD_NC(GPP_A19, NONE), ++ PAD_NC(GPP_A20, NONE), ++ PAD_NC(GPP_A21, NONE), ++ PAD_NC(GPP_A22, NONE), ++ PAD_NC(GPP_A23, NONE), ++ ++ /* ------- GPIO Group GPP_B ------- */ ++ PAD_CFG_NF(GPP_B0, NONE, DEEP, NF1), ++ PAD_CFG_NF(GPP_B1, NONE, DEEP, NF1), ++ PAD_NC(GPP_B2, NONE), ++ PAD_NC(GPP_B3, NONE), ++ PAD_CFG_GPI_SCI(GPP_B4, NONE, DEEP, EDGE_SINGLE, INVERT), /* -TBT_PLUG_EVENT */ ++ PAD_CFG_NF(GPP_B5, NONE, DEEP, NF1), /* -CLKREQ_PCIE0 (dGPU) */ ++ PAD_CFG_NF(GPP_B6, NONE, DEEP, NF1), /* -CLKREQ_PCIE3 (WWAN) */ ++ PAD_CFG_NF(GPP_B7, NONE, DEEP, NF1), /* -CLKREQ_PCIE4 (GBE) */ ++ PAD_CFG_NF(GPP_B8, NONE, DEEP, NF1), /* -CLKREQ_PCIE5 (WLAN) */ ++ PAD_CFG_NF(GPP_B9, NONE, DEEP, NF1), /* -CLKREQ_PCIE6 (TB3) */ ++ PAD_CFG_NF(GPP_B10, NONE, DEEP, NF1), /* -CLKREQ_PCIE8 (SSD) */ ++ PAD_NC(GPP_B11, NONE), ++ PAD_CFG_NF(GPP_B12, NONE, DEEP, NF1), /* -PCH_SLP_S0 */ ++ PAD_CFG_NF(GPP_B13, NONE, DEEP, NF1), /* -PLTRST */ ++ PAD_CFG_NF(GPP_B14, NONE, DEEP, NF1), /* PCH_SPKR */ ++ PAD_CFG_GPO(GPP_B15, 0, DEEP), /* NFC_DLREQ */ ++ PAD_NC(GPP_B16, NONE), ++ PAD_NC(GPP_B17, NONE), ++ PAD_NC(GPP_B18, NONE), ++ PAD_NC(GPP_B19, NONE), ++ PAD_NC(GPP_B20, NONE), ++ PAD_NC(GPP_B21, NONE), ++ PAD_NC(GPP_B22, NONE), ++ PAD_NC(GPP_B23, NONE), ++ ++ /* ------- GPIO Community 1 ------- */ ++ ++ /* ------- GPIO Group GPP_C ------- */ ++ PAD_CFG_NF(GPP_C0, NONE, DEEP, NF1), /* SMB_CLK */ ++ PAD_CFG_NF(GPP_C1, NONE, DEEP, NF1), /* SMB_DATA */ ++ PAD_CFG_GPO(GPP_C2, 1, DEEP), ++ PAD_CFG_NF(GPP_C3, NONE, DEEP, NF1), /* SML0_CLK */ ++ PAD_CFG_NF(GPP_C4, NONE, DEEP, NF1), /* SML0_DATA */ ++ PAD_NC(GPP_C5, NONE), ++ PAD_CFG_NF(GPP_C6, NONE, DEEP, NF1), /* EC_SCL2 */ ++ PAD_CFG_NF(GPP_C7, NONE, DEEP, NF1), /* EC_SDA2 */ ++ PAD_NC(GPP_C8, NONE), ++ PAD_NC(GPP_C9, NONE), ++ PAD_NC(GPP_C10, NONE), ++ PAD_NC(GPP_C11, NONE), ++ PAD_NC(GPP_C12, NONE), ++ PAD_NC(GPP_C13, NONE), ++ PAD_NC(GPP_C14, NONE), ++ PAD_NC(GPP_C15, NONE), ++ PAD_CFG_NF(GPP_C16, NONE, DEEP, NF1), /* I2C0_DATA */ ++ PAD_CFG_NF(GPP_C17, NONE, DEEP, NF1), /* I2C0_CLK */ ++ PAD_NC(GPP_C18, NONE), ++ PAD_NC(GPP_C19, NONE), ++ PAD_CFG_GPO(GPP_C20, 0, DEEP), /* EPRIVACY_ON */ ++ PAD_CFG_GPO(GPP_C21, 0, DEEP), /* TBT_FORCE_PWR */ ++ PAD_CFG_GPI_SCI(GPP_C22, NONE, DEEP, EDGE_SINGLE, INVERT), /* -EC_SCI */ ++ PAD_CFG_GPI_SCI(GPP_C23, NONE, DEEP, EDGE_SINGLE, INVERT), /* -EC_WAKE */ ++ ++ /* ------- GPIO Group GPP_D ------- */ ++ PAD_NC(GPP_D0, NONE), ++ PAD_NC(GPP_D1, NONE), ++ PAD_NC(GPP_D2, NONE), ++ PAD_NC(GPP_D3, NONE), ++ PAD_NC(GPP_D4, NONE), ++ PAD_NC(GPP_D5, NONE), ++ PAD_NC(GPP_D6, NONE), ++ PAD_NC(GPP_D7, NONE), ++ PAD_NC(GPP_D8, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_D9, UP_20K, DEEP, OFF, ACPI), /* -DISCRETE_PRESENCE */ ++ PAD_NC(GPP_D10, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_D11, UP_20K, DEEP, OFF, ACPI), /* DGFX_VRAM_ID0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_D12, UP_20K, DEEP, OFF, ACPI), /* DGFX_VRAM_ID1 */ ++ PAD_NC(GPP_D13, NONE), ++ PAD_NC(GPP_D14, NONE), ++ PAD_NC(GPP_D15, NONE), ++ PAD_NC(GPP_D16, NONE), ++ PAD_CFG_GPO(GPP_D17, 0, DEEP), /* DDI_PRIORITY */ ++ PAD_NC(GPP_D18, NONE), ++ PAD_NC(GPP_D19, NONE), ++ PAD_NC(GPP_D20, NONE), ++ PAD_NC(GPP_D21, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_D22, UP_20K, DEEP, OFF, ACPI), /* -NFC_DTCT */ ++ PAD_NC(GPP_D23, NONE), ++ ++ /* ------- GPIO Group GPP_E ------- */ ++ PAD_CFG_GPO(GPP_E0, 1, DEEP), /* BDC_ON */ ++ PAD_NC(GPP_E1, NONE), ++ PAD_CFG_NF(GPP_E2, NONE, DEEP, NF1), /* -SATA2_DTCT */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_E3, NONE, DEEP, EDGE_SINGLE, ACPI), /* -TBT_PLUG_EVENT */ ++ PAD_CFG_GPO(GPP_E4, 1, DEEP), /* NFC_ON */ ++ PAD_NC(GPP_E5, NONE), ++ PAD_CFG_NF(GPP_E6, NONE, RSMRST, NF1), /* SATA2_DEVSLP */ ++ PAD_NC(GPP_E7, NONE), ++ PAD_NC(GPP_E8, NONE), ++ PAD_CFG_NF(GPP_E9, NONE, DEEP, NF1), /* -USB_PORT0_OC0 */ ++ PAD_CFG_NF(GPP_E10, NONE, DEEP, NF1), /* -USB_PORT1_OC1 */ ++ PAD_NC(GPP_E11, NONE), ++ PAD_CFG_GPI_APIC_HIGH(GPP_E12, NONE, DEEP), /* NFC_INT */ ++ PAD_CFG_NF(GPP_E13, NONE, DEEP, NF1), /* DDIP1_HPD */ ++ PAD_CFG_NF(GPP_E14, NONE, DEEP, NF1), /* DDIP2_HPD */ ++ PAD_NC(GPP_E15, NONE), ++ PAD_NC(GPP_E16, NONE), ++ PAD_CFG_NF(GPP_E17, NONE, DEEP, NF1), /* EDP_HPD */ ++ PAD_NC(GPP_E18, NONE), ++ PAD_CFG_GPO(GPP_E19, 0, DEEP), ++ PAD_CFG_NF(GPP_E20, NONE, DEEP, NF1), /* DDIP2_CTRLCLK */ ++ PAD_CFG_NF(GPP_E21, NONE, DEEP, NF1), /* DDIP2_CTRLDATA */ ++ PAD_CFG_TERM_GPO(GPP_E22, 0, UP_20K, RSMRST), /* -GPU_RST */ ++ PAD_CFG_TERM_GPO(GPP_E23, 0, UP_20K, RSMRST), /* 1R8VIDEO_AON_ON */ ++ ++ /* ------- GPIO Community 2 ------- */ ++ ++ /* -------- GPIO Group GPD -------- */ ++ PAD_CFG_NF(GPD0, NONE, PWROK, NF1), /* -BATLOW */ ++ PAD_CFG_NF(GPD1, NATIVE, PWROK, NF1), /* AC_PRESENT */ ++ PAD_CFG_NF(GPD2, NATIVE, PWROK, NF1), /* -LANWAKE */ ++ PAD_CFG_NF(GPD3, UP_20K, PWROK, NF1), /* -PWRSW_EC */ ++ PAD_CFG_NF(GPD4, NONE, PWROK, NF1), /* -PCH_SLP_S3 */ ++ PAD_CFG_NF(GPD5, NONE, PWROK, NF1), /* -PCH_SLP_S4 */ ++ PAD_CFG_NF(GPD6, NONE, PWROK, NF1), /* -PCH_SLP_M */ ++ PAD_NC(GPD7, NONE), ++ PAD_CFG_NF(GPD8, NONE, PWROK, NF1), /* SUSCLK_32K */ ++ PAD_CFG_NF(GPD9, NONE, PWROK, NF1), /* -PCH_SLP_WLAN */ ++ PAD_CFG_NF(GPD10, NONE, PWROK, NF1), /* -PCH_SLP_S5 */ ++ PAD_CFG_NF(GPD11, NONE, PWROK, NF1), /* LANPHYPC */ ++ ++ /* ------- GPIO Community 3 ------- */ ++ ++ /* ------- GPIO Group GPP_F ------- */ ++ PAD_CFG_GPO(GPP_F0, 0, DEEP), ++ PAD_CFG_GPI_TRIG_OWN(GPP_F1, NONE, DEEP, OFF, ACPI), /* GC6_FB_EN */ ++ PAD_CFG_GPO(GPP_F2, 1, DEEP), /* -GPU_EVENT */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F3, NONE, PLTRST, OFF, ACPI), /* DGFX_PWRGD */ ++ PAD_NC(GPP_F4, NONE), /* -WWAN_RESET */ ++ PAD_NC(GPP_F5, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_F6, UP_20K, DEEP, OFF, ACPI), /* -MIC_HW_EN (R37 to GND) */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F7, UP_20K, DEEP, OFF, ACPI), /* -INT_MIC_DTCT */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F8, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F9, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG1 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F10, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG2 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F11, UP_20K, DEEP, OFF, ACPI), /* WWAN_CFG3 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F12, UP_20K, DEEP, OFF, ACPI), /* PLANARID0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F13, UP_20K, DEEP, OFF, ACPI), /* PLANARID1 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F14, UP_20K, DEEP, OFF, ACPI), /* PLANARID2 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F15, UP_20K, DEEP, OFF, ACPI), /* PLANARID3 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F16, UP_20K, DEEP, OFF, ACPI), /* MEMORYID0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F17, UP_20K, DEEP, OFF, ACPI), /* MEMORYID1 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F18, UP_20K, DEEP, OFF, ACPI), /* MEMORYID2 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F19, UP_20K, DEEP, OFF, ACPI), /* MEMORYID3 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F20, UP_20K, DEEP, OFF, ACPI), /* MEMORYID4 */ ++ PAD_NC(GPP_F21, NONE), ++ PAD_CFG_GPI_TRIG_OWN(GPP_F22, UP_20K, DEEP, OFF, ACPI), /* -TAMPER_SW_DTCT */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F23, UP_20K, DEEP, OFF, ACPI), /* -SC_DTCT */ ++ ++ /* ------- GPIO Group GPP_G ------- */ ++ PAD_NC(GPP_G0, NONE), ++ PAD_NC(GPP_G1, NONE), ++ PAD_NC(GPP_G2, NONE), ++ PAD_NC(GPP_G3, NONE), ++ PAD_CFG_GPO(GPP_G4, 0, DEEP), /* TBT_RTD3_PWR_EN */ ++ PAD_CFG_GPO(GPP_G5, 0, DEEP), /* TBT_FORCE_USB_PWR */ ++ PAD_CFG_GPO(GPP_G6, 0, DEEP), /* -TBT_PERST */ ++ PAD_CFG_GPI_SCI(GPP_G7, NONE, DEEP, LEVEL, INVERT), /* -TBT_PCIE_WAKE */ ++}; ++ ++void variant_config_gpios(void) ++{ ++ gpio_configure_pads(gpio_table, ARRAY_SIZE(gpio_table)); ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c +new file mode 100644 +index 0000000000..b1d96c5a76 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c +@@ -0,0 +1,90 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++ ++const u32 cim_verb_data[] = { ++ 0x10ec0257, // Vendor/Device ID: Realtek ALC257 ++ 0x17aa2258, // Subsystem ID ++ 11, ++ AZALIA_SUBVENDOR(0, 0x17aa2258), ++ ++ AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_DESC( ++ AZALIA_INTEGRATED, ++ AZALIA_INTERNAL, ++ AZALIA_MIC_IN, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_NO_JACK_PRESENCE_DETECT, ++ 2, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x13, 0x40000000), // does not describe a jack or internal device ++ AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( ++ AZALIA_INTEGRATED, ++ AZALIA_INTERNAL, ++ AZALIA_SPEAKER, ++ AZALIA_OTHER_ANALOG, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_NO_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x18, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++ AZALIA_MIC_IN, ++ AZALIA_STEREO_MONO_1_8, ++ AZALIA_BLACK, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 3, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x1b, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x1d, 0x40661b45), // does not describe a jack or internal device ++ AZALIA_PIN_CFG(0, 0x1e, AZALIA_PIN_CFG_NC(0)), ++ AZALIA_PIN_CFG(0, 0x21, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++ AZALIA_HP_OUT, ++ AZALIA_STEREO_MONO_1_8, ++ AZALIA_BLACK, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 1, 15 ++ )), ++ ++ 0x8086280b, // Vendor/Device ID: Intel Kabylake HDMI ++ 0x80860101, // Subsystem ID ++ 4, ++ AZALIA_SUBVENDOR(2, 0x80860101), ++ ++ AZALIA_PIN_CFG(2, 0x05, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_DIGITAL_DISPLAY, ++ AZALIA_DIGITAL_OTHER_OUT, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), ++ AZALIA_PIN_CFG(2, 0x06, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_DIGITAL_DISPLAY, ++ AZALIA_DIGITAL_OTHER_OUT, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), ++ AZALIA_PIN_CFG(2, 0x07, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_DIGITAL_DISPLAY, ++ AZALIA_DIGITAL_OTHER_OUT, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), ++}; ++ ++const u32 pc_beep_verbs[] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c +new file mode 100644 +index 0000000000..001e934b3a +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c +@@ -0,0 +1,44 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static const struct pad_config memory_id_gpio_table[] = { ++ PAD_CFG_GPI_TRIG_OWN(GPP_F16, UP_20K, DEEP, OFF, ACPI), /* MEMORYID0 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F17, UP_20K, DEEP, OFF, ACPI), /* MEMORYID1 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F18, UP_20K, DEEP, OFF, ACPI), /* MEMORYID2 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F19, UP_20K, DEEP, OFF, ACPI), /* MEMORYID3 */ ++ PAD_CFG_GPI_TRIG_OWN(GPP_F20, UP_20K, DEEP, OFF, ACPI), /* MEMORYID4 */ ++}; ++ ++void mainboard_memory_init_params(FSPM_UPD *mupd) ++{ ++ int spd_idx; ++ char spd_name[20]; ++ size_t spd_size; ++ ++ FSP_M_CONFIG *mem_cfg = &mupd->FspmConfig; ++ mem_cfg->DqPinsInterleaved = true; /* DDR_DQ in interleave mode */ ++ mem_cfg->CaVrefConfig = 2; /* VREF_CA to CH_A and VREF_DQ_B to CH_B */ ++ mem_cfg->MemorySpdDataLen = CONFIG_DIMM_SPD_SIZE; ++ ++ /* Get SPD for soldered RAM SPD (CH A) */ ++ gpio_configure_pads(memory_id_gpio_table, ARRAY_SIZE(memory_id_gpio_table)); ++ ++ spd_idx = gpio_get(GPP_F16) | gpio_get(GPP_F17) << 1 | gpio_get(GPP_F18) << 2 | ++ gpio_get(GPP_F19) << 3 | gpio_get(GPP_F20) << 4; ++ printk(BIOS_DEBUG, "Detected MEMORY_ID = %d\n", spd_idx); ++ snprintf(spd_name, sizeof(spd_name), "spd_%d.bin", spd_idx); ++ mem_cfg->MemorySpdPtr00 = (uintptr_t)cbfs_map(spd_name, &spd_size); ++ ++ /* Get SPD for memory slot (CH B) */ ++ struct spd_block blk = { .addr_map = { [1] = 0x51, } }; ++ get_spd_smbus(&blk); ++ dump_spd_info(&blk); ++ ++ mem_cfg->MemorySpdPtr10 = (uintptr_t)blk.spd_array[1]; ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb +new file mode 100644 +index 0000000000..d4afca20c4 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb +@@ -0,0 +1,103 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++chip soc/intel/skylake ++ device domain 0 on ++ device ref south_xhci on ++ register "usb2_ports" = "{ ++ [0] = USB2_PORT_MID(OC0), // JUSB1 (USB-A always on) ++ [1] = USB2_PORT_MID(OC1), // JUSB2 (USB-A) ++ [2] = USB2_PORT_MID(OC_SKIP), // JFPR (smartcard slot) ++ [3] = USB2_PORT_MID(OC_SKIP), // JUSBC (USB-C) ++ [4] = USB2_PORT_MID(OC_SKIP), // JCAM (IR camera) ++ [5] = USB2_PORT_MID(OC_SKIP), // JWWAN (M.2 WWAN USB) ++ [6] = USB2_PORT_MID(OC_SKIP), // JWLAN (M.2 WLAN USB) ++ [7] = USB2_PORT_MID(OC_SKIP), // JCAM (webcam) ++ [8] = USB2_PORT_MID(OC_SKIP), // JFPR (fingerprint reader) ++ [9] = USB2_PORT_MID(OC_SKIP), // JLCD (touch panel) ++ }" ++ register "usb3_ports" = "{ ++ [0] = USB3_PORT_DEFAULT(OC0), // JUSB1 (USB-A always on) ++ [1] = USB3_PORT_DEFAULT(OC1), // JUSB2 (USB-A) ++ [2] = USB3_PORT_DEFAULT(OC_SKIP), // JSD (SD card reader) ++ [3] = USB3_PORT_DEFAULT(OC_SKIP), // JUSBC (USB-C) ++ }" ++ end ++ ++ device ref sata on ++ # SATA_2 - Main M.2 SATA SSD ++ register "SataPortsEnable[2]" = "1" ++ register "SataPortsDevSlp[2]" = "1" ++ end ++ ++ # PCIe controller 1 - 1x2+2x1 ++ # PCIE 1-2 - RP1 - dGPU - CLKOUT0 - CLKREQ0 ++ # PCIE 4 - RP4 - WWAN - CLKOUT1 - CLKREQ1 ++ # ++ # PCIe controller 2 - 2x1+1x2 (lane reversal) ++ # PCIE 5 - GBE - GBE - CLKOUT2 - CLKREQ2 (clobbers RP8) ++ # PCIE 6 - RP7 - WLAN - CLKOUT3 - CLKREQ3 ++ # PCIE 7-8 - RP5 - TB3 - CLKOUT4 - CLKREQ4 ++ # ++ # PCIe controller 3 - 1x4 (lane reversal) ++ # PCIE 9-12 - RP9 - SSD - CLKOUT5 - CLKREQ5 ++ ++ # dGPU - x2 ++ device ref pcie_rp1 on ++ register "PcieRpEnable[0]" = "1" ++ register "PcieRpClkReqSupport[0]" = "1" ++ register "PcieRpClkReqNumber[0]" = "0" ++ register "PcieRpClkSrcNumber[0]" = "0" ++ register "PcieRpAdvancedErrorReporting[0]" = "1" ++ register "PcieRpLtrEnable[0]" = "1" ++ end ++ ++ # M.2 WWAN - x1 ++ device ref pcie_rp4 on ++ register "PcieRpEnable[3]" = "1" ++ register "PcieRpClkReqSupport[3]" = "1" ++ register "PcieRpClkReqNumber[3]" = "1" ++ register "PcieRpClkSrcNumber[3]" = "1" ++ register "PcieRpAdvancedErrorReporting[3]" = "1" ++ register "PcieRpLtrEnable[3]" = "1" ++ end ++ ++ # Ethernet (clobbers RP8) ++ device ref gbe on ++ register "LanClkReqSupported" = "1" ++ register "LanClkReqNumber" = "2" ++ register "EnableLanLtr" = "1" ++ register "EnableLanK1Off" = "1" ++ end ++ ++ # M.2 WLAN - x1 ++ device ref pcie_rp7 on ++ register "PcieRpEnable[6]" = "1" ++ register "PcieRpClkReqSupport[6]" = "1" ++ register "PcieRpClkReqNumber[6]" = "3" ++ register "PcieRpClkSrcNumber[6]" = "3" ++ register "PcieRpAdvancedErrorReporting[6]" = "1" ++ register "PcieRpLtrEnable[6]" = "1" ++ end ++ ++ # TB3 (Alpine Ridge LP) - x2 ++ device ref pcie_rp5 on ++ register "PcieRpEnable[4]" = "1" ++ register "PcieRpClkReqSupport[4]" = "1" ++ register "PcieRpClkReqNumber[4]" = "4" ++ register "PcieRpClkSrcNumber[4]" = "4" ++ register "PcieRpAdvancedErrorReporting[4]" = "1" ++ register "PcieRpLtrEnable[4]" = "1" ++ register "PcieRpHotPlug[4]" = "1" ++ end ++ ++ # M.2 2280 SSD - x2 ++ device ref pcie_rp9 on ++ register "PcieRpEnable[8]" = "1" ++ register "PcieRpClkReqSupport[8]" = "1" ++ register "PcieRpClkReqNumber[8]" = "5" ++ register "PcieRpClkSrcNumber[8]" = "5" ++ register "PcieRpAdvancedErrorReporting[8]" = "1" ++ register "PcieRpLtrEnable[8]" = "1" ++ end ++ end ++end +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..86f39ddb55ea9fb58d5e5699637636ef597c734e +GIT binary patch +literal 512 +zcmY!u;9+)EWZ+<6U|?oq29gXMJYRrxPEL*>N67~+1r7#Qh7a1t+8`-(puhlu3{YAD +YT>%dM8_BI;nL`dsaHtp+rc($20I8n}l>h($ + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..df0f6e58b79286a4aeb690c5027adf7a1f5f668b +GIT binary patch +literal 512 +zcmY!u;9+i6oWQ}rz`)GN3?vyic)kGXoSYm%j*<^t3LFfq3@hZcwLwzoK!E`Q8KATR +Yx&j>hH(SqvWezd%<4`dwOs5b40B_I==>Px# + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..24f0d8992bc5244c62488da9633e4885f52f3e22 +GIT binary patch +literal 512 +zcmY!ucy&~OfFg0G3Wp`)phiHWn5fv$6q +PvjPw>z-1}5hGzN!nb#F$ + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..59b6b9e78263c42aae367ab7d4a784d888f30efe +GIT binary patch +literal 512 +zcmY!ucy(6E*fVuXjUqlKwqu$iMg7pDLK + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a2a64a5e1adada3fc00b2e4edc60c77e610881a9 +GIT binary patch +literal 512 +zcmY!u<-XH%N8S?V-1R3%^a4B#wurhqmHql_HU=XnZ$x{Q& +z*$Oh{IYWaWKO+-03?$Qx1CPkm2-nu217(^xhPas;8kw1RMCls2o4FbS#SI&DT;VDQ +GCj$V){1T)9 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a2a64a5e1adada3fc00b2e4edc60c77e610881a9 +GIT binary patch +literal 512 +zcmY!u<-XH%N8S?V-1R3%^a4B#wurhqmHql_HU=XnZ$x{Q& +z*$Oh{IYWaWKO+-03?$Qx1CPkm2-nu217(^xhPas;8kw1RMCls2o4FbS#SI&DT;VDQ +GCj$V){1T)9 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a64a5a93fb4aef4d5f63d79cb2582731b9ac5063 +GIT binary patch +literal 512 +NcmZQz7zHCa1ONg600961 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..5f23e86606094d3e5d2011db902ebd4a500bbffa +GIT binary patch +literal 512 +zcmY!u<-XHc140(BZf(&^dxD+@TSQ$QOn`kgpFo@WIT6 +z8Mi42GcX`n2w8lrIa@)p&l&!{<7bq|r;x^SwThHl(6E*fVuXjUqobjFu$i-OkeQ!u +Vn70BDFf^?FkI#a;_$28g2LNS*7)Ag9 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..857da9c9828cdac842329f6cef4539283777268b +GIT binary patch +literal 512 +zcmY!uenuv07)YiW2Og2B5w5L42g)>Y3~@6xG%_>sh|)E7H}WzBiW@fQc)?W; +GP6hy+m=i1j + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..b5b14cf2dfa06ae183b0379da4dc825129e1589f +GIT binary patch +literal 512 +zcmY!u;9+)EWZ+<6U|?oq29gXMJU@VRUS6IcN7)B11r7#Qh7a1tdLSuupuhlu3{YAD +XT>%b$v*cE=%%S%6I8=-Z(%b$+tzbnnL|62aHtp+rc($20QGqazW@LL + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..829f149547bc24859646c33d5926938d7a1b90cb +GIT binary patch +literal 512 +zcmY!u;9+)EWZ+<6U|?oq29gXMJYRrxPEL*>N67~+1r7#Qh7a1tdLSuupuhlu3{YAD +XT>%b$o8(ro%%OI594bbI=@bG0z{d&v + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a64a5a93fb4aef4d5f63d79cb2582731b9ac5063 +GIT binary patch +literal 512 +NcmZQz7zHCa1ONg600961 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a64a5a93fb4aef4d5f63d79cb2582731b9ac5063 +GIT binary patch +literal 512 +NcmZQz7zHCa1ONg600961 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..940f1e3cd8e5bd9ea32a82a14edcdcbc8132d8c7 +GIT binary patch +literal 512 +zcmY!u<-XH%N8S?V-1R3%^a4B#wurjQW(9mG0U=XnZ$x{Q& +z0UPq1A)%L_QJxwGl4(Y*BAFWD+8T7AOcTeDU_*B^6OSleBX=`bLy)jxgN`d)<=|uh +E020*^DF6Tf + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..30c84410d417ef7afa8705c93cdb64a9f4e915a0 +GIT binary patch +literal 512 +zcmY!uW!enxp}7)YiWinU~FgllWifig`TLxK(6%}hL^bdB7N9Ss$Lz^FmT39fQ* +FG5`?&65ap+ + +literal 0 +HcmV?d00001 + +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0004-do-not-break-building-other-thinkpads-with-the-hacks.patch b/patches/coreboot-24.12/0004-do-not-break-building-other-thinkpads-with-the-hacks.patch new file mode 100644 index 000000000..81517093a --- /dev/null +++ b/patches/coreboot-24.12/0004-do-not-break-building-other-thinkpads-with-the-hacks.patch @@ -0,0 +1,157 @@ +From d2188ab8134a6a9c67e64dda643b770221dba648 Mon Sep 17 00:00:00 2001 +From: gaspar-ilom +Date: Thu, 6 Mar 2025 23:00:00 +0000 +Subject: [PATCH] do not break building other thinkpads with the hacks for the + t480/s made Mate Kukri + +still not fixing things properly but at least it should now be possible to build older thinkpads without regressions. +prior, some code was just commented or unreachable. now we make this explicit with preprocessor directives. +heads should build all boards on this coreboot version from the same coreboot tree. + +Signed-off-by: gaspar-ilom +--- + src/device/pci_rom.c | 8 +++++--- + src/ec/lenovo/h8/acpi/ec.asl | 4 +++- + src/ec/lenovo/h8/bluetooth.c | 15 ++++++++++----- + src/ec/lenovo/h8/wwan.c | 14 ++++++++++---- + 4 files changed, 28 insertions(+), 13 deletions(-) + +diff --git a/src/device/pci_rom.c b/src/device/pci_rom.c +index cc6b9b068a..7d4b52ba30 100644 +--- a/src/device/pci_rom.c ++++ b/src/device/pci_rom.c +@@ -304,13 +304,15 @@ void pci_rom_ssdt(const struct device *device) + return; + } + +-#if 0 ++ #if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++ const char *scope = "\\_SB.PCI0.RP01.PEGP"; ++ #else + const char *scope = acpi_device_path(device); ++ #endif + if (!scope) { + printk(BIOS_ERR, "%s: Missing ACPI scope\n", dev_path(device)); + return; + } +-#endif + + /* Supports up to four devices. */ + if ((CBMEM_ID_ROM0 + ngfx) > CBMEM_ID_ROM3) { +@@ -338,7 +340,7 @@ void pci_rom_ssdt(const struct device *device) + memcpy(cbrom, rom, cbrom_length); + + /* write _ROM method */ +- acpigen_write_scope("\\_SB.PCI0.RP01.PEGP"); ++ acpigen_write_scope(scope); + acpigen_write_rom(cbrom, cbrom_length); + acpigen_pop_len(); /* pop scope */ + } +diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl +index 8f4a8e1986..f80c15106c 100644 +--- a/src/ec/lenovo/h8/acpi/ec.asl ++++ b/src/ec/lenovo/h8/acpi/ec.asl +@@ -331,7 +331,9 @@ Device(EC) + #include "sleepbutton.asl" + #include "lid.asl" + #include "beep.asl" +-//#include "thermal.asl" ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++#include "thermal.asl" ++#endif + #include "systemstatus.asl" + #include "thinkpad.asl" + } +diff --git a/src/ec/lenovo/h8/bluetooth.c b/src/ec/lenovo/h8/bluetooth.c +index be71a24ced..0b729bd819 100644 +--- a/src/ec/lenovo/h8/bluetooth.c ++++ b/src/ec/lenovo/h8/bluetooth.c +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ +- +-// #include ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++#include ++#endif + #include + #include + #include +@@ -26,23 +27,27 @@ void h8_bluetooth_enable(int on) + */ + bool h8_has_bdc(const struct device *dev) + { ++ #if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++ printk(BIOS_INFO, "H8: BDC detection not implemented. " ++ "Assuming BDC installed\n"); ++ return true; ++ #else + struct ec_lenovo_h8_config *conf = dev->chip_info; + +- if (1 || !conf->has_bdc_detection) { ++ if (!conf->has_bdc_detection) { + printk(BIOS_INFO, "H8: BDC detection not implemented. " + "Assuming BDC installed\n"); + return true; + } + +-#if 0 + if (get_gpio(conf->bdc_gpio_num) == conf->bdc_gpio_lvl) { + printk(BIOS_INFO, "H8: BDC installed\n"); + return true; + } +-#endif + + printk(BIOS_INFO, "H8: BDC not installed\n"); + return false; ++ #endif + } + + /* +diff --git a/src/ec/lenovo/h8/wwan.c b/src/ec/lenovo/h8/wwan.c +index 5cdcf77406..0a62583c56 100644 +--- a/src/ec/lenovo/h8/wwan.c ++++ b/src/ec/lenovo/h8/wwan.c +@@ -1,6 +1,8 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ + +-// #include ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++#include ++#endif + #include + #include + #include +@@ -24,23 +26,27 @@ void h8_wwan_enable(int on) + */ + bool h8_has_wwan(const struct device *dev) + { ++ #if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++ printk(BIOS_INFO, "H8: WWAN detection not implemented. " ++ "Assuming WWAN installed\n"); ++ return true; ++ #else + struct ec_lenovo_h8_config *conf = dev->chip_info; + +- if (1 || !conf->has_wwan_detection) { ++ if (!conf->has_wwan_detection) { + printk(BIOS_INFO, "H8: WWAN detection not implemented. " + "Assuming WWAN installed\n"); + return true; + } + +-#if 0 + if (get_gpio(conf->wwan_gpio_num) == conf->wwan_gpio_lvl) { + printk(BIOS_INFO, "H8: WWAN installed\n"); + return true; + } +-#endif + + printk(BIOS_INFO, "H8: WWAN not installed\n"); + return false; ++ #endif + } + + /* +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0005-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch b/patches/coreboot-24.12/0005-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch new file mode 100644 index 000000000..7dae2d6ad --- /dev/null +++ b/patches/coreboot-24.12/0005-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch @@ -0,0 +1,82 @@ +From 12ff6e798d1cefc5b888e6035e52bf6d70c9ca47 Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Tue, 31 Dec 2024 01:40:42 +0000 +Subject: [PATCH 11/11] soc/intel/pmc: Hardcoded poweroff after power fail + +Coreboot can set the power state for power on after previous +power failure, based on the option table. On the ThinkPad T480, +we have no nvram and, due to coreboot's design, we therefore +have no option table, so the default setting is enabled. + +In my testing, this seems to be that the system will turn on +after a power failure. If your ThinkPad was previously in a state +where it wouldn't turn on when plugging in the power, it'd be fine. + +If your battery ran out later on, this would be triggered and +your ThinkPad would permanently turn on, when plugging in a charger, +and there is currently no way to configure this behaviour. + +We currently only use the common SoC PMC code on the ThinkPad +T480, T480s and the Dell OptiPlex 3050 Micro, at the time of +this patch, and it is desirable that the system be set to power +off after power fail anyway. + +In some cases, you might want the opposite, for example if you're +running a server. This will be documented on the website, for that +reason. + +Signed-off-by: Leah Rowe +--- + src/soc/intel/common/block/pmc/pmclib.c | 36 +++---------------------- + 1 file changed, 4 insertions(+), 32 deletions(-) + +diff --git a/src/soc/intel/common/block/pmc/pmclib.c b/src/soc/intel/common/block/pmc/pmclib.c +index 0fadd6e409..843581b285 100644 +--- a/src/soc/intel/common/block/pmc/pmclib.c ++++ b/src/soc/intel/common/block/pmc/pmclib.c +@@ -760,38 +760,10 @@ void pmc_clear_pmcon_sts(void) + + void pmc_set_power_failure_state(const bool target_on) + { +- const unsigned int state = get_uint_option("power_on_after_fail", +- CONFIG_MAINBOARD_POWER_FAILURE_STATE); +- +- /* +- * On the shutdown path (target_on == false), we only need to +- * update the register for MAINBOARD_POWER_STATE_PREVIOUS. For +- * all other cases, we don't write the register to avoid clob- +- * bering the value set on the boot path. This is necessary, +- * for instance, when we can't access the option backend in SMM. +- */ +- +- switch (state) { +- case MAINBOARD_POWER_STATE_OFF: +- if (!target_on) +- break; +- printk(BIOS_INFO, "Set power off after power failure.\n"); +- pmc_soc_set_afterg3_en(false); +- break; +- case MAINBOARD_POWER_STATE_ON: +- if (!target_on) +- break; +- printk(BIOS_INFO, "Set power on after power failure.\n"); +- pmc_soc_set_afterg3_en(true); +- break; +- case MAINBOARD_POWER_STATE_PREVIOUS: +- printk(BIOS_INFO, "Keep power state after power failure.\n"); +- pmc_soc_set_afterg3_en(target_on); +- break; +- default: +- printk(BIOS_WARNING, "Unknown power-failure state: %d\n", state); +- break; +- } ++ if (!target_on) ++ return; ++ printk(BIOS_INFO, "Set power off after power failure.\n"); ++ pmc_soc_set_afterg3_en(false); + } + + /* This function returns the highest assertion duration of the SLP_Sx assertion widths */ +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0006-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch b/patches/coreboot-24.12/0006-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch new file mode 100644 index 000000000..5e4e6edb3 --- /dev/null +++ b/patches/coreboot-24.12/0006-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch @@ -0,0 +1,32 @@ +From 916c7b027faba625b922e74e45e50f9ceab64a64 Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Mon, 6 Jan 2025 01:16:01 +0000 +Subject: [PATCH 1/1] ec/dasharo: Comment EC_DASHARO_EC_FLASH_SIZE + +We don't use anything dasharo in Libreboot. + +This patch prevents the following config item appearing +in T480 and 3050 Micro configs: + +CONFIG_EC_DASHARO_EC_FLASH_SIZE=0x20000 + +Otherwise, make-oldconfig adds it automatically. + +Signed-off-by: Leah Rowe +--- + src/ec/dasharo/ec/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/ec/dasharo/ec/Kconfig b/src/ec/dasharo/ec/Kconfig +index 901d3ce514..071e37f95e 100644 +--- a/src/ec/dasharo/ec/Kconfig ++++ b/src/ec/dasharo/ec/Kconfig +@@ -28,4 +28,4 @@ config EC_DASHARO_EC_UPDATE_FILE + + config EC_DASHARO_EC_FLASH_SIZE + hex +- default 0x20000 ++ # default 0x20000 +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0007-src-intel-skylake-Disable-stack-overflow-debug-optio.patch b/patches/coreboot-24.12/0007-src-intel-skylake-Disable-stack-overflow-debug-optio.patch new file mode 100644 index 000000000..843700894 --- /dev/null +++ b/patches/coreboot-24.12/0007-src-intel-skylake-Disable-stack-overflow-debug-optio.patch @@ -0,0 +1,61 @@ +From 00b6459a9b360b16529036d9b1e10c977228a7ff Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Mon, 6 Jan 2025 01:36:23 +0000 +Subject: [PATCH 1/1] src/intel/skylake: Disable stack overflow debug options + +The option was appearing in T480/3050micro configs of lbmk, +after updating on the coreboot/next uprev for 20241206 rev8: + +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y + +I did some digging. See coreboot commit: + +commit 51cc2bacb6b07279b97e9934d079060475481fb6 +Author: Subrata Banik +Date: Fri Dec 13 13:07:28 2024 +0530 + + soc/intel/pantherlake: Disable stack overflow debug options + +Well now: + +I'm disabling this behaviour on Skylake, for the same +behaviour, because I want as few behaviour changes in general, +as possible, for the rev8 release. + +According to Subrata's patch, which was for Pantherlake, +without this change, stack corruption can occur on verstage +and romstage early on. Please look at that coreboot patch, +referenced above, for clarity. + +I see no harm in disabling this option for Skylake, since +the behaviour that it otherwise enables was not present +before. + +Signed-off-by: Leah Rowe +--- + src/soc/intel/skylake/Kconfig | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig +index 8e25f796ed..7d324e15ea 100644 +--- a/src/soc/intel/skylake/Kconfig ++++ b/src/soc/intel/skylake/Kconfig +@@ -130,6 +130,15 @@ config DCACHE_RAM_SIZE + The size of the cache-as-ram region required during bootblock + and/or romstage. + ++# Override DEBUG Kconfig to avoid false alarm about stack overflow. ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS ++ bool ++ default n ++ ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS_IN_ALL_STAGES ++ bool ++ default n ++ + config DCACHE_BSP_STACK_SIZE + hex + default 0x20400 if FSP_USES_CB_STACK +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0008-src-intel-x4x-Disable-stack-overflow-debug.patch b/patches/coreboot-24.12/0008-src-intel-x4x-Disable-stack-overflow-debug.patch new file mode 100644 index 000000000..e2eae2a93 --- /dev/null +++ b/patches/coreboot-24.12/0008-src-intel-x4x-Disable-stack-overflow-debug.patch @@ -0,0 +1,33 @@ +From 5671d54d347b110ffade5b8b6e2d052612a8716c Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Mon, 6 Jan 2025 01:53:53 +0000 +Subject: [PATCH 1/1] src/intel/x4x: Disable stack overflow debug + +Signed-off-by: Leah Rowe +--- + src/northbridge/intel/x4x/Kconfig | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/northbridge/intel/x4x/Kconfig b/src/northbridge/intel/x4x/Kconfig +index 097e11126c..7e4e14cf94 100644 +--- a/src/northbridge/intel/x4x/Kconfig ++++ b/src/northbridge/intel/x4x/Kconfig +@@ -28,6 +28,15 @@ config ECAM_MMCONF_BUS_NUMBER + int + default 256 + ++# Override DEBUG Kconfig to avoid false alarm about stack overflow. ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS ++ bool ++ default n ++ ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS_IN_ALL_STAGES ++ bool ++ default n ++ + # This number must be equal or lower than what's reported in ACPI PCI _CRS + config DOMAIN_RESOURCE_32BIT_LIMIT + default 0xfec00000 +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0009-post-skylake-pr0.patch b/patches/coreboot-24.12/0009-post-skylake-pr0.patch new file mode 100644 index 000000000..0f63b133c --- /dev/null +++ b/patches/coreboot-24.12/0009-post-skylake-pr0.patch @@ -0,0 +1,429 @@ +From f9f309190246c66e92db5408c183dd8b617987f3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= +Date: Sat, 23 Nov 2024 22:43:10 +0100 +Subject: [PATCH] soc/intel/lockdown: Allow locking down SPI and LPC in SMM +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Heads payload uses APM_CNT_FINALIZE SMI to set and lock down the SPI +controller with PR0 flash protection for pre-Skylake platforms. + +Add new option to skip LPC and FAST SPI lock down in coreboot and move +it to APM_CNT_FINALIZE SMI handler. Reuse the INTEL_CHIPSET_LOCKDOWN +option to prevent issuing APM_CNT_FINALIZE SMI on normal boot path, +like it was done on pre-Skylake platforms. As the locking on modern +SOCs became more complicated, separate the SPI and LPC locking into +new modules to make linking to SMM easier. + +The expected configuration to leverage the feautre is to unselect +INTEL_CHIPSET_LOCKDOWN and select SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM. + +Testing various microarchitectures happens on heads repository: +https://github.com/linuxboot/heads/pull/1818 + +TEST=Lock the SPI flash using APM_CNT_FINALIZE in heads on Alder Lake +(Protectli VP66xx) and Comet Lake (Protectli VP46xx) platforms. Check +if flash is unlocked in the heads recovery console. Check if flash is +locked in the kexec'ed OS. + +Change-Id: Icbcc6fcde90e5b0a999aacb720e2e3dc2748c838 +Signed-off-by: Michał Żygowski +--- + src/soc/intel/alderlake/finalize.c | 4 +- + src/soc/intel/cannonlake/finalize.c | 4 +- + src/soc/intel/common/block/lpc/Makefile.mk | 4 ++ + src/soc/intel/common/block/smm/smihandler.c | 10 ++++ + .../common/pch/include/intelpch/lockdown.h | 3 ++ + src/soc/intel/common/pch/lockdown/Kconfig | 15 ++++++ + src/soc/intel/common/pch/lockdown/Makefile.mk | 5 ++ + src/soc/intel/common/pch/lockdown/lockdown.c | 48 ++----------------- + .../intel/common/pch/lockdown/lockdown_lpc.c | 23 +++++++++ + .../intel/common/pch/lockdown/lockdown_spi.c | 32 +++++++++++++ + src/soc/intel/denverton_ns/lpc.c | 3 +- + src/soc/intel/elkhartlake/finalize.c | 4 +- + src/soc/intel/jasperlake/finalize.c | 3 +- + src/soc/intel/meteorlake/finalize.c | 4 +- + src/soc/intel/pantherlake/finalize.c | 4 +- + src/soc/intel/skylake/finalize.c | 3 +- + src/soc/intel/tigerlake/finalize.c | 4 +- + src/soc/intel/xeon_sp/finalize.c | 3 +- + src/soc/intel/xeon_sp/lockdown.c | 18 ++----- + 19 files changed, 127 insertions(+), 67 deletions(-) + create mode 100644 src/soc/intel/common/pch/lockdown/lockdown_lpc.c + create mode 100644 src/soc/intel/common/pch/lockdown/lockdown_spi.c + +diff --git a/src/soc/intel/alderlake/finalize.c b/src/soc/intel/alderlake/finalize.c +index 700fde977b..615729d3dd 100644 +--- a/src/soc/intel/alderlake/finalize.c ++++ b/src/soc/intel/alderlake/finalize.c +@@ -85,7 +85,9 @@ static void soc_finalize(void *unused) + printk(BIOS_DEBUG, "Finalizing chipset.\n"); + + pch_finalize(); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); ++ + tbt_finalize(); + if (CONFIG(USE_FSP_NOTIFY_PHASE_READY_TO_BOOT) && + CONFIG(USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE)) +diff --git a/src/soc/intel/cannonlake/finalize.c b/src/soc/intel/cannonlake/finalize.c +index 974794bd97..461ba3a884 100644 +--- a/src/soc/intel/cannonlake/finalize.c ++++ b/src/soc/intel/cannonlake/finalize.c +@@ -87,7 +87,9 @@ static void soc_finalize(void *unused) + printk(BIOS_DEBUG, "Finalizing chipset.\n"); + + pch_finalize(); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); ++ + if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT) && + CONFIG(SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC)) + heci1_disable(); +diff --git a/src/soc/intel/common/block/lpc/Makefile.mk b/src/soc/intel/common/block/lpc/Makefile.mk +index b510cd0ec3..60792654b5 100644 +--- a/src/soc/intel/common/block/lpc/Makefile.mk ++++ b/src/soc/intel/common/block/lpc/Makefile.mk +@@ -5,3 +5,7 @@ romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_LPC) += lpc_lib.c + + ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_LPC) += lpc_lib.c + ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_LPC) += lpc.c ++ ++ifeq ($(CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM),y) ++smm-$(CONFIG_SOC_INTEL_COMMON_BLOCK_LPC) += lpc_lib.c ++endif +diff --git a/src/soc/intel/common/block/smm/smihandler.c b/src/soc/intel/common/block/smm/smihandler.c +index 59489a4f03..2a1f26d2eb 100644 +--- a/src/soc/intel/common/block/smm/smihandler.c ++++ b/src/soc/intel/common/block/smm/smihandler.c +@@ -14,12 +14,14 @@ + #include + #include + #include ++#include + #include + #include + #include + #include + #include + #include ++#include + #include + #include + #include +@@ -345,6 +347,14 @@ static void finalize(void) + } + finalize_done = 1; + ++ if (CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) { ++ /* SPI lock down configuration */ ++ fast_spi_lockdown_bios(CHIPSET_LOCKDOWN_COREBOOT); ++ ++ /* LPC/eSPI lock down configuration */ ++ lpc_lockdown_config(CHIPSET_LOCKDOWN_COREBOOT); ++ } ++ + if (CONFIG(SPI_FLASH_SMM)) + /* Re-init SPI driver to handle locked BAR */ + fast_spi_init(); +diff --git a/src/soc/intel/common/pch/include/intelpch/lockdown.h b/src/soc/intel/common/pch/include/intelpch/lockdown.h +index b5aba06fe0..1b96f41a2a 100644 +--- a/src/soc/intel/common/pch/include/intelpch/lockdown.h ++++ b/src/soc/intel/common/pch/include/intelpch/lockdown.h +@@ -22,4 +22,7 @@ int get_lockdown_config(void); + */ + void soc_lockdown_config(int chipset_lockdown); + ++void fast_spi_lockdown_bios(int chipset_lockdown); ++void lpc_lockdown_config(int chipset_lockdown); ++ + #endif /* SOC_INTEL_COMMON_PCH_LOCKDOWN_H */ +diff --git a/src/soc/intel/common/pch/lockdown/Kconfig b/src/soc/intel/common/pch/lockdown/Kconfig +index 38f60d2056..545185c52f 100644 +--- a/src/soc/intel/common/pch/lockdown/Kconfig ++++ b/src/soc/intel/common/pch/lockdown/Kconfig +@@ -3,7 +3,22 @@ + config SOC_INTEL_COMMON_PCH_LOCKDOWN + bool + default n ++ select HAVE_INTEL_CHIPSET_LOCKDOWN + help + This option allows to have chipset lockdown for DMI, FAST_SPI and + soc_lockdown_config() to implement any additional lockdown as PMC, + LPC for supported PCH. ++ ++config SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM ++ bool "Lock down SPI controller in SMM" ++ default n ++ depends on HAVE_SMI_HANDLER && !INTEL_CHIPSET_LOCKDOWN ++ select SPI_FLASH_SMM ++ help ++ This option allows to have chipset lockdown for FAST_SPI and LPC for ++ supported PCH. If selected, coreboot will skip locking down the SPI ++ and LPC controller. The payload or OS is responsible for locking it ++ using APM_CNT_FINALIZE SMI. Used by heads to set and lock PR0 flash ++ protection. ++ ++ If unsure, say N. +diff --git a/src/soc/intel/common/pch/lockdown/Makefile.mk b/src/soc/intel/common/pch/lockdown/Makefile.mk +index 71466f8edd..64aad562ac 100644 +--- a/src/soc/intel/common/pch/lockdown/Makefile.mk ++++ b/src/soc/intel/common/pch/lockdown/Makefile.mk +@@ -1,2 +1,7 @@ + ## SPDX-License-Identifier: GPL-2.0-only + ramstage-$(CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN) += lockdown.c ++ramstage-$(CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN) += lockdown_lpc.c ++ramstage-$(CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN) += lockdown_spi.c ++ ++smm-$(CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM) += lockdown_lpc.c ++smm-$(CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM) += lockdown_spi.c +diff --git a/src/soc/intel/common/pch/lockdown/lockdown.c b/src/soc/intel/common/pch/lockdown/lockdown.c +index eec3beb01b..2d229e1a90 100644 +--- a/src/soc/intel/common/pch/lockdown/lockdown.c ++++ b/src/soc/intel/common/pch/lockdown/lockdown.c +@@ -60,56 +60,17 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) + /* Set FAST_SPI opcode menu */ + fast_spi_set_opcode_menu(); + +- /* Discrete Lock Flash PR registers */ +- fast_spi_pr_dlock(); +- + /* Check if SPI transaction is pending */ + fast_spi_cycle_in_progress(); + + /* Clear any outstanding status bits like AEL, FCERR, FDONE, SAF etc. */ + fast_spi_clear_outstanding_status(); + +- /* Lock FAST_SPIBAR */ +- fast_spi_lock_bar(); +- + /* Set Vendor Component Lock (VCL) */ + fast_spi_vscc0_lock(); + +- /* Set BIOS Interface Lock, BIOS Lock */ +- if (chipset_lockdown == CHIPSET_LOCKDOWN_COREBOOT) { +- /* BIOS Interface Lock */ +- fast_spi_set_bios_interface_lock_down(); +- +- /* Only allow writes in SMM */ +- if (CONFIG(BOOTMEDIA_SMM_BWP)) { +- fast_spi_set_eiss(); +- fast_spi_enable_wp(); +- } +- +- /* BIOS Lock */ +- fast_spi_set_lock_enable(); +- +- /* EXT BIOS Lock */ +- fast_spi_set_ext_bios_lock_enable(); +- } +-} +- +-static void lpc_lockdown_config(int chipset_lockdown) +-{ +- /* Set BIOS Interface Lock, BIOS Lock */ +- if (chipset_lockdown == CHIPSET_LOCKDOWN_COREBOOT) { +- /* BIOS Interface Lock */ +- lpc_set_bios_interface_lock_down(); +- +- /* Only allow writes in SMM */ +- if (CONFIG(BOOTMEDIA_SMM_BWP)) { +- lpc_set_eiss(); +- lpc_enable_wp(); +- } +- +- /* BIOS Lock */ +- lpc_set_lock_enable(); +- } ++ if (!CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) ++ fast_spi_lockdown_bios(chipset_lockdown); + } + + static void sa_lockdown_config(int chipset_lockdown) +@@ -135,8 +96,9 @@ static void platform_lockdown_config(void *unused) + /* SPI lock down configuration */ + fast_spi_lockdown_cfg(chipset_lockdown); + +- /* LPC/eSPI lock down configuration */ +- lpc_lockdown_config(chipset_lockdown); ++ if (!CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) ++ /* LPC/eSPI lock down configuration */ ++ lpc_lockdown_config(chipset_lockdown); + + /* GPMR lock down configuration */ + gpmr_lockdown_cfg(); +diff --git a/src/soc/intel/common/pch/lockdown/lockdown_lpc.c b/src/soc/intel/common/pch/lockdown/lockdown_lpc.c +new file mode 100644 +index 0000000000..69278ea343 +--- /dev/null ++++ b/src/soc/intel/common/pch/lockdown/lockdown_lpc.c +@@ -0,0 +1,23 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include ++#include ++ ++void lpc_lockdown_config(int chipset_lockdown) ++{ ++ /* Set BIOS Interface Lock, BIOS Lock */ ++ if (chipset_lockdown == CHIPSET_LOCKDOWN_COREBOOT) { ++ /* BIOS Interface Lock */ ++ lpc_set_bios_interface_lock_down(); ++ ++ /* Only allow writes in SMM */ ++ if (CONFIG(BOOTMEDIA_SMM_BWP)) { ++ lpc_set_eiss(); ++ lpc_enable_wp(); ++ } ++ ++ /* BIOS Lock */ ++ lpc_set_lock_enable(); ++ } ++} +diff --git a/src/soc/intel/common/pch/lockdown/lockdown_spi.c b/src/soc/intel/common/pch/lockdown/lockdown_spi.c +new file mode 100644 +index 0000000000..8dbe93013e +--- /dev/null ++++ b/src/soc/intel/common/pch/lockdown/lockdown_spi.c +@@ -0,0 +1,32 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include ++#include ++ ++void fast_spi_lockdown_bios(int chipset_lockdown) ++{ ++ /* Discrete Lock Flash PR registers */ ++ fast_spi_pr_dlock(); ++ ++ /* Lock FAST_SPIBAR */ ++ fast_spi_lock_bar(); ++ ++ /* Set BIOS Interface Lock, BIOS Lock */ ++ if (chipset_lockdown == CHIPSET_LOCKDOWN_COREBOOT) { ++ /* BIOS Interface Lock */ ++ fast_spi_set_bios_interface_lock_down(); ++ ++ /* Only allow writes in SMM */ ++ if (CONFIG(BOOTMEDIA_SMM_BWP)) { ++ fast_spi_set_eiss(); ++ fast_spi_enable_wp(); ++ } ++ ++ /* BIOS Lock */ ++ fast_spi_set_lock_enable(); ++ ++ /* EXT BIOS Lock */ ++ fast_spi_set_ext_bios_lock_enable(); ++ } ++} +diff --git a/src/soc/intel/denverton_ns/lpc.c b/src/soc/intel/denverton_ns/lpc.c +index 7dc971ea92..c4f7681c62 100644 +--- a/src/soc/intel/denverton_ns/lpc.c ++++ b/src/soc/intel/denverton_ns/lpc.c +@@ -536,7 +536,8 @@ static const struct pci_driver lpc_driver __pci_driver = { + + static void finalize_chipset(void *unused) + { +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); + } + + BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, finalize_chipset, NULL); +diff --git a/src/soc/intel/elkhartlake/finalize.c b/src/soc/intel/elkhartlake/finalize.c +index 275413b4ef..fc54710303 100644 +--- a/src/soc/intel/elkhartlake/finalize.c ++++ b/src/soc/intel/elkhartlake/finalize.c +@@ -43,7 +43,9 @@ static void soc_finalize(void *unused) + printk(BIOS_DEBUG, "Finalizing chipset.\n"); + + pch_finalize(); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); ++ + if (CONFIG(USE_FSP_NOTIFY_PHASE_READY_TO_BOOT) && + CONFIG(USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE)) + heci_finalize(); +diff --git a/src/soc/intel/jasperlake/finalize.c b/src/soc/intel/jasperlake/finalize.c +index 8788db155d..4840c0c04c 100644 +--- a/src/soc/intel/jasperlake/finalize.c ++++ b/src/soc/intel/jasperlake/finalize.c +@@ -76,7 +76,8 @@ static void soc_finalize(void *unused) + printk(BIOS_DEBUG, "Finalizing chipset.\n"); + + pch_finalize(); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); + + /* Indicate finalize step with post code */ + post_code(POSTCODE_OS_BOOT); +diff --git a/src/soc/intel/meteorlake/finalize.c b/src/soc/intel/meteorlake/finalize.c +index 1fd1d98fb5..80802db285 100644 +--- a/src/soc/intel/meteorlake/finalize.c ++++ b/src/soc/intel/meteorlake/finalize.c +@@ -64,7 +64,9 @@ static void soc_finalize(void *unused) + printk(BIOS_DEBUG, "Finalizing chipset.\n"); + + pch_finalize(); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); ++ + tbt_finalize(); + sa_finalize(); + if (CONFIG(USE_FSP_NOTIFY_PHASE_READY_TO_BOOT) && +diff --git a/src/soc/intel/pantherlake/finalize.c b/src/soc/intel/pantherlake/finalize.c +index 05ec3eaaca..1d47dd7a0b 100644 +--- a/src/soc/intel/pantherlake/finalize.c ++++ b/src/soc/intel/pantherlake/finalize.c +@@ -63,7 +63,9 @@ static void soc_finalize(void *unused) + printk(BIOS_DEBUG, "Finalizing chipset.\n"); + + pch_finalize(); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); ++ + tbt_finalize(); + sa_finalize(); + if (CONFIG(USE_FSP_NOTIFY_PHASE_READY_TO_BOOT) && +diff --git a/src/soc/intel/skylake/finalize.c b/src/soc/intel/skylake/finalize.c +index fd80aeac1a..a147b62e46 100644 +--- a/src/soc/intel/skylake/finalize.c ++++ b/src/soc/intel/skylake/finalize.c +@@ -106,7 +106,8 @@ static void soc_finalize(void *unused) + pch_finalize_script(dev); + + soc_lockdown(dev); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); + + /* Indicate finalize step with post code */ + post_code(POSTCODE_OS_BOOT); +diff --git a/src/soc/intel/tigerlake/finalize.c b/src/soc/intel/tigerlake/finalize.c +index cd02745a9e..158b2fb691 100644 +--- a/src/soc/intel/tigerlake/finalize.c ++++ b/src/soc/intel/tigerlake/finalize.c +@@ -55,7 +55,9 @@ static void soc_finalize(void *unused) + printk(BIOS_DEBUG, "Finalizing chipset.\n"); + + pch_finalize(); +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); ++ + tbt_finalize(); + if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT)) + heci1_disable(); +-- +2.39.5 + diff --git a/patches/coreboot-24.12/0010-cbmem_tpm-clear_whole_log_on_creation.patch b/patches/coreboot-24.12/0010-cbmem_tpm-clear_whole_log_on_creation.patch new file mode 100644 index 000000000..adb939789 --- /dev/null +++ b/patches/coreboot-24.12/0010-cbmem_tpm-clear_whole_log_on_creation.patch @@ -0,0 +1,37 @@ +From b83a7607203d285b76e94ffd2013c55b184f5d42 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= +Date: Wed, 30 Oct 2024 10:50:37 +0100 +Subject: [PATCH] security/tpm/tspi/log-tpm1.c: Clear whole log area on + creation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The log area was not entirely cleared on creation resulting in +garbage after the last valid lgo entry. It caused the cbmem utility +to parse invalid events and access data outside the log area. +In the TPM2 log sources, the entire area is being cleared, thus the +issue has not been observed. + +Change-Id: I7c780b62b1c6507e1dd1806b20b0270e364cde3d +Signed-off-by: Michał Żygowski +--- + src/security/tpm/tspi/log-tpm1.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/security/tpm/tspi/log-tpm1.c b/src/security/tpm/tspi/log-tpm1.c +index 481b569cd5..453e74b4e8 100644 +--- a/src/security/tpm/tspi/log-tpm1.c ++++ b/src/security/tpm/tspi/log-tpm1.c +@@ -33,7 +33,7 @@ void *tpm1_log_cbmem_init(void) + if (!tclt) + return NULL; + +- memset(tclt, 0, sizeof(*tclt)); ++ memset(tclt, 0, tpm_log_len); + hdr = &tclt->spec_id; + + /* Fill in first "header" entry. */ +-- +2.39.5 + diff --git a/patches/coreboot-4.11/0075-northbridge-amd-Fixed-errors-in-fam15h-DQS-timing.patch b/patches/coreboot-4.11/0075-northbridge-amd-Fixed-errors-in-fam15h-DQS-timing.patch new file mode 100644 index 000000000..6cc730098 --- /dev/null +++ b/patches/coreboot-4.11/0075-northbridge-amd-Fixed-errors-in-fam15h-DQS-timing.patch @@ -0,0 +1,62 @@ +From f6c818898b3f978bd22ed2829a881322e0eadaf9 Mon Sep 17 00:00:00 2001 +From: Mike Rothfuss <6182328+mrothfuss@users.noreply.github.com> +Date: Fri, 23 Aug 2024 19:54:54 -0600 +Subject: [PATCH 1/2] northbridge/amd: Fixed errors in fam15h DQS timing + +Fixed two errors in determining whether valid values were +found for read DQS delays in raminit. +--- + src/northbridge/amd/amdmct/mct_ddr3/mctdqs_d.c | 17 ++++++----------- + 1 file changed, 6 insertions(+), 11 deletions(-) + +diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mctdqs_d.c b/src/northbridge/amd/amdmct/mct_ddr3/mctdqs_d.c +index d34b2dc2ba..6cf67afa4f 100644 +--- a/src/northbridge/amd/amdmct/mct_ddr3/mctdqs_d.c ++++ b/src/northbridge/amd/amdmct/mct_ddr3/mctdqs_d.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include "mct_d.h" + #include "mct_d_gcc.h" + +@@ -1287,6 +1288,7 @@ static uint8_t TrainDQSRdWrPos_D_Fam15(struct MCTStatStruc *pMCTstat, + uint8_t cur_count = 0; + uint8_t best_pos = 0; + uint8_t best_count = 0; ++ uint16_t region_center; + + uint32_t index_reg = 0x98; + uint32_t dev = pDCTstat->dev_dct; +@@ -1455,23 +1457,16 @@ static uint8_t TrainDQSRdWrPos_D_Fam15(struct MCTStatStruc *pMCTstat, + last_pos = 0; + } + +- if (best_count > 2) { +- uint16_t region_center = (best_pos + (best_count / 2)); +- +- if (region_center < 16) { +- printk(BIOS_WARNING, "TrainDQSRdWrPos: negative DQS recovery delay detected!" +- " Attempting to continue but your system may be unstable...\n"); +- region_center = 0; +- } else { +- region_center -= 16; +- } ++ region_center = (best_pos + (best_count / 2)); ++ if ((best_count > 2) && (region_center >= 16)) { ++ region_center -= 16; + + /* Restore current settings of other (previously trained) lanes to the active array */ + memcpy(current_read_dqs_delay, initial_read_dqs_delay, sizeof(current_read_dqs_delay)); + + /* Program the Read DQS Timing Control register with the center of the passing window */ + current_read_dqs_delay[lane] = region_center; +- passing_dqs_delay_found[lane] = 1; ++ passing_read_dqs_delay_found = 1; + + /* Commit the current Read DQS Timing Control settings to the hardware registers */ + write_dqs_read_data_timing_registers(current_read_dqs_delay, dev, dct, dimm, index_reg); +-- +2.39.2 + diff --git a/patches/coreboot-4.11/0076-northbridge-amd-Added-resets-for-ram-training-failur.patch b/patches/coreboot-4.11/0076-northbridge-amd-Added-resets-for-ram-training-failur.patch new file mode 100644 index 000000000..487342219 --- /dev/null +++ b/patches/coreboot-4.11/0076-northbridge-amd-Added-resets-for-ram-training-failur.patch @@ -0,0 +1,68 @@ +From ce1c7a35fa11b46d0478e97c4a4001179ab9d1bf Mon Sep 17 00:00:00 2001 +From: Mike Rothfuss <6182328+mrothfuss@users.noreply.github.com> +Date: Fri, 23 Aug 2024 19:59:09 -0600 +Subject: [PATCH 2/2] northbridge/amd: Added resets for ram training failures + +Instead of booting into an unstable state (and crashing), the board +resets to re-attempt raminit. +--- + src/northbridge/amd/amdmct/mct_ddr3/mcthwl.c | 7 +++++-- + src/northbridge/amd/amdmct/mct_ddr3/mctsrc.c | 7 +++++-- + 2 files changed, 10 insertions(+), 4 deletions(-) + +diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mcthwl.c b/src/northbridge/amd/amdmct/mct_ddr3/mcthwl.c +index 1ee10608b9..9a53bd352d 100644 +--- a/src/northbridge/amd/amdmct/mct_ddr3/mcthwl.c ++++ b/src/northbridge/amd/amdmct/mct_ddr3/mcthwl.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include "mct_d.h" + #include "mct_d_gcc.h" + +@@ -265,11 +266,13 @@ static void WriteLevelization_HW(struct MCTStatStruc *pMCTstat, + + pDCTstat->TargetFreq = final_target_freq; + +- if (global_phy_training_status) ++ if (global_phy_training_status) { + printk(BIOS_WARNING, + "%s: Uncorrectable invalid value(s) detected in second phase of write levelling; " +- "continuing but system may be unstable!\n", ++ "Restarting system\n", + __func__); ++ soft_reset(); ++ } + + uint8_t dct; + for (dct = 0; dct < 2; dct++) { +diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mctsrc.c b/src/northbridge/amd/amdmct/mct_ddr3/mctsrc.c +index dbb989fe3d..c4cb53442d 100644 +--- a/src/northbridge/amd/amdmct/mct_ddr3/mctsrc.c ++++ b/src/northbridge/amd/amdmct/mct_ddr3/mctsrc.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include "mct_d.h" + #include "mct_d_gcc.h" + +@@ -1698,8 +1699,10 @@ void dqsTrainMaxRdLatency_SW_Fam15(struct MCTStatStruc *pMCTstat, + Set_NB32_index_wait_DCT(dev, Channel, index_reg, 0x00000050, 0x13131313); + } + dword = Get_NB32_DCT(dev, Channel, 0x268) & 0x3ffff; +- if (dword) +- printk(BIOS_ERR, "WARNING: MaxRdLatency training FAILED! Attempting to continue but your system may be unstable...\n"); ++ if (dword) { ++ printk(BIOS_ERR, "WARNING: MaxRdLatency training FAILED! Restarting system\n"); ++ soft_reset(); ++ } + + /* 2.10.5.8.5.1.5 */ + nb_pstate = 0; +-- +2.39.2 + diff --git a/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch b/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch new file mode 100644 index 000000000..7f08287e8 --- /dev/null +++ b/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch @@ -0,0 +1,203 @@ +From a88dd4b6fbac8748a6f4580ad6363da47f5b3bc2 Mon Sep 17 00:00:00 2001 +From: Alexander Couzens +Date: Sat, 19 Mar 2022 13:42:33 +0000 +Subject: [PATCH] mb/lenovo/x230: introduce EDP variant + +There is a modification for the x230 which uses the 2nd DP from the +dock as the integrated panel's connection, which allows using a custom +eDP panel instead of the stock LVDS display. + +There are several adapter boards present on the market and all of them +use the same method of enabling the custom eDP panel. + +To make this work with coreboot, the internal LVDS connector should be +disabled in libgfxinit. Additionally, VBT has been modified to keep +brightness controls functional on the adapter boards that use LVDS for +the job. + +The modifications done to the VBT are: +- Remove the LVDS port entry. +- Move the DP-3 (which is the 2nd DP on the dock) entry to the first + position on the list. +- Set the DP-3 as internally connected. + +This has been reported to work with the following panels: +- LP125WF2-SPB4 (1920*1080, 12.5") +- LQ125T1JW02 (2560*1440, 12.5") +- LQ133M1JW21 (1920*1080, 13.3") +- LTN133HL10-201 (1920*1080, 13.3") +- B133HAN04.6 (1920*1080, 13.3") +- B133QAN02.0 (2560*1600, 13.3") + +Other eDP panels not on this list should work as well. + +Change-Id: I0355d39a61956792e69bccd5274cfc2749d72bf0 +Signed-off-by: Alexander Couzens +Signed-off-by: Felix Singer +Signed-off-by: Alexei Sorokin +Reviewed-on: https://review.coreboot.org/c/coreboot/+/28950 +Tested-by: build bot (Jenkins) +Reviewed-by: Felix Singer +--- + src/mainboard/lenovo/x230/Kconfig | 15 ++++++++----- + src/mainboard/lenovo/x230/Kconfig.name | 3 +++ + src/mainboard/lenovo/x230/Makefile.mk | 5 +++++ + .../lenovo/x230/variants/x230_edp/data.vbt | Bin 0 -> 4281 bytes + .../x230/variants/x230_edp/gma-mainboard.ads | 21 ++++++++++++++++++ + 5 files changed, 38 insertions(+), 6 deletions(-) + create mode 100644 src/mainboard/lenovo/x230/variants/x230_edp/data.vbt + create mode 100644 src/mainboard/lenovo/x230/variants/x230_edp/gma-mainboard.ads + +diff --git a/src/mainboard/lenovo/x230/Kconfig b/src/mainboard/lenovo/x230/Kconfig +index 279095629be..78b2373c2d8 100644 +--- a/src/mainboard/lenovo/x230/Kconfig ++++ b/src/mainboard/lenovo/x230/Kconfig +@@ -1,4 +1,4 @@ +-if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T || BOARD_LENOVO_X230S ++if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T || BOARD_LENOVO_X230S || BOARD_LENOVO_X230_EDP + + config BOARD_SPECIFIC_OPTIONS + def_bool y +@@ -11,7 +11,7 @@ config BOARD_SPECIFIC_OPTIONS + select H8_HAS_BAT_THRESHOLDS_IMPL + select H8_HAS_PRIMARY_FN_KEYS if BOARD_LENOVO_X230S + select NO_UART_ON_SUPERIO +- select BOARD_ROMSIZE_KB_12288 if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T ++ select BOARD_ROMSIZE_KB_12288 if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T || BOARD_LENOVO_X230_EDP + select BOARD_ROMSIZE_KB_16384 if BOARD_LENOVO_X230S + select HAVE_ACPI_TABLES + select HAVE_OPTION_TABLE +@@ -20,7 +20,7 @@ config BOARD_SPECIFIC_OPTIONS + select INTEL_INT15 + select DRIVERS_RICOH_RCE822 + select MEMORY_MAPPED_TPM +- select MAINBOARD_HAS_TPM1 if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T ++ select MAINBOARD_HAS_TPM1 if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T || BOARD_LENOVO_X230_EDP + select MAINBOARD_HAS_LIBGFXINIT + select GFX_GMA_PANEL_1_ON_LVDS if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T + select INTEL_GMA_HAVE_VBT +@@ -47,17 +47,20 @@ config MAINBOARD_DIR + default "lenovo/x230" + + config VARIANT_DIR +- default "x230" if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T ++ default "x230" if BOARD_LENOVO_X230 || BOARD_LENOVO_X230T || BOARD_LENOVO_X230_EDP + default "x230s" if BOARD_LENOVO_X230S + + config MAINBOARD_PART_NUMBER +- default "ThinkPad X230" if BOARD_LENOVO_X230 ++ default "ThinkPad X230" if BOARD_LENOVO_X230 || BOARD_LENOVO_X230_EDP + default "ThinkPad X230t" if BOARD_LENOVO_X230T + default "ThinkPad X230s" if BOARD_LENOVO_X230S + + config OVERRIDE_DEVICETREE + default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" + ++config INTEL_GMA_VBT_FILE ++ default "src/mainboard/\$(MAINBOARDDIR)/variants/x230_edp/data.vbt" if BOARD_LENOVO_X230_EDP ++ + config USBDEBUG_HCD_INDEX + int + default 2 +@@ -79,4 +82,4 @@ config PS2M_EISAID + config THINKPADEC_HKEY_EISAID + default "LEN0068" + +-endif # BOARD_LENOVO_X230 || BOARD_LENOVO_X230T || BOARD_LENOVO_X230S ++endif # BOARD_LENOVO_X230 || BOARD_LENOVO_X230T || BOARD_LENOVO_X230S || BOARD_LENOVO_X230_EDP +diff --git a/src/mainboard/lenovo/x230/Kconfig.name b/src/mainboard/lenovo/x230/Kconfig.name +index 1a014368795..e7290a12dd9 100644 +--- a/src/mainboard/lenovo/x230/Kconfig.name ++++ b/src/mainboard/lenovo/x230/Kconfig.name +@@ -6,3 +6,6 @@ config BOARD_LENOVO_X230T + + config BOARD_LENOVO_X230S + bool "ThinkPad X230s" ++ ++config BOARD_LENOVO_X230_EDP ++ bool "ThinkPad X230 eDP Mod (2K/FHD)" +diff --git a/src/mainboard/lenovo/x230/Makefile.mk b/src/mainboard/lenovo/x230/Makefile.mk +index 8e801f145dd..6e6f9f90b9f 100644 +--- a/src/mainboard/lenovo/x230/Makefile.inc ++++ b/src/mainboard/lenovo/x230/Makefile.inc +@@ -5,4 +5,9 @@ bootblock-y += variants/$(VARIANT_DIR)/gpio.c + romstage-y += variants/$(VARIANT_DIR)/early_init.c + romstage-y += variants/$(VARIANT_DIR)/gpio.c + ramstage-y += variants/$(VARIANT_DIR)/hda_verb.c ++ ++ifeq ($(CONFIG_BOARD_LENOVO_X230_EDP),y) ++ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += variants/x230_edp/gma-mainboard.ads ++else + ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += variants/$(VARIANT_DIR)/gma-mainboard.ads ++endif +diff --git a/src/mainboard/lenovo/x230/variants/x230_edp/data.vbt b/src/mainboard/lenovo/x230/variants/x230_edp/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..13384d45571ff76e592335143d01315e37893186 +GIT binary patch +literal 4281 +zcmdT`Z)_aZ5&ym0y}P}=-MjTVC6^p6b={56T^4V^SA+LolmX+RUx+79#iSqiP~ars*|P{j#W<|Sw32Qpw?S@B$TK! +zT%y8#_th3_%L^xJRhpi?y+F#XZ5B@+U98gh$p??rmIq1sVr%N_-*;O-QJ>e_m+#Gc +zeSJjvzQO*1!F<1Mj*JdZ9IBMcg_+XCI898^NNKt-Jw1A;SiXxYQxjvQVrgb{#5RMi +z3_rAVdim%B-#tOO;ZDl)3wi>F!IEkCq2;B0R9IZ3DP?n3(8mm!Gbk$bf{?ofjp)+WX;f0xKuMreM_FPop&M`zu|-4&b{lx} +z6dXr%nIN^a1Q1g^?g`SApyQo+We^Ju;y^Soa0Kxp0ExE)gG^{(s5wk=5)@Iwe?zpD +z@%1v$crW@+c=`T;{ewfYIC5a@V7W3iGdp+pJ^l}V_@k99K7NB27i?KEp$JF`50mi@ +zjG1XXrseRG7Qw69ek|x~_*Klqd$9}}jBGpu*K}~RX~1KAld;P%uwb}2&iFCo7mQyT +zCSGP-Wc-%#2gY9*A29yLh$l?6F>Yks%;;r&gE7oF#P|+lf$=@YNyZt*N3Nz%%kOxj$xHTH_I6i5-#j$7@-%=}( +z?1954MnX?xAuk79(< +zSr6;_4gTc~tacpa=As!xD;@CT7xX)U4}W57_`9~2NpCP65!^@JyGbYMG6B#@{r1i&qF#431THdvdmK?gb!}@x&d86kH8RtSun)L +zMg&qo8p@sxlqPr)H*t1i5Xc8fNK*dW_}wA77I--u)J{nAs;))bo8vk&YfS^jD1^rM=s>0ytuB(VlIOTx;M223I$qhjl3%0pyLp$ECQ*_^UYE{?(M!zFMP3W9I_cUj9w4&M7&s8K0k@rirz}Oms94I6gg>kPulEG+g%^&e&n+7+xV#SfijjY{5o+C7V}H- +zZs9PGrN7SK-OZ8YGZ>yr(&i#tdss~q`sQ|0&fnIIOUJ;O2*-=b;v=kW?O}6KsoH4P +z0smI&%EQn#cd@w$RZTVP=TtP?l7~|?nRTSIQO2qkgO+Z!=3#T$D-XeMvn68}T3Ey8 +zHleye(7mkLXe*JtfA{Q*lj!gc)Wck4IFj|C#q&~HiNmA&>Z|kF4(Uvj%v~DWNT8*x>a2}rST)i~8vd61DwO!2$JZMNNi6hyH +z2d_)6&979w%w$-vyatVrqw??t&t%}iZhDAP3%j_I#cGANdzLq>W;J(F=Xwkxxj%^H +zwQDmn=w}|@-y`RG{*wz0>A(ZGtk~AM=#-fE(LV1uZE98+Nk>UmiyyuJ8?## Disabled); ++ ++end GMA.Mainboard; +-- +2.39.2 + diff --git a/patches/coreboot-nitrokey-clevo_release/0001-dasharo-hardcode-configurations.patch b/patches/coreboot-nitrokey-clevo_release/0001-dasharo-hardcode-configurations.patch deleted file mode 100644 index 5bc9754dc..000000000 --- a/patches/coreboot-nitrokey-clevo_release/0001-dasharo-hardcode-configurations.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff -ur dasharo_cb.org/src/vendorcode/dasharo/options.c dasharo_cb/src/vendorcode/dasharo/options.c ---- dasharo_cb.org/src/vendorcode/dasharo/options.c 2023-12-18 21:57:46.915582991 +0100 -+++ dasharo_cb/src/vendorcode/dasharo/options.c 2023-12-19 19:16:13.077019389 +0100 -@@ -189,7 +189,12 @@ - - uint8_t get_sleep_type_option(void) - { -+ -+#if CONFIG(BOARD_NOVACUSTOM_NV4X_ADLP) -+ uint8_t sleep_type = SLEEP_TYPE_OPTION_S3; -+#else - uint8_t sleep_type = SLEEP_TYPE_OPTION_S0IX; -+#endif - - if (CONFIG(DRIVERS_EFI_VARIABLE_STORE)) - read_u8_var("SleepType", &sleep_type); diff --git a/patches/coreboot-nitrokey-clevo_release/0002-dasharo-hardcode-me.patch b/patches/coreboot-nitrokey-clevo_release/0002-dasharo-hardcode-me.patch deleted file mode 100644 index cb4a77868..000000000 --- a/patches/coreboot-nitrokey-clevo_release/0002-dasharo-hardcode-me.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -ur coreboot-nitrokey.org/src/vendorcode/dasharo/options.c coreboot-nitrokey/src/vendorcode/dasharo/options.c ---- coreboot-nitrokey.org/src/vendorcode/dasharo/options.c 2024-01-22 14:11:59.525612567 +0100 -+++ coreboot-nitrokey/src/vendorcode/dasharo/options.c 2024-01-22 14:12:07.535544365 +0100 -@@ -133,7 +133,7 @@ - if (CONFIG(DRIVERS_EFI_VARIABLE_STORE)) - read_u8_var("MeMode", &var); - -- return var; -+ return ME_MODE_DISABLE_HAP; - } - - bool is_smm_bwp_permitted(void) diff --git a/patches/coreboot-purism/0001-cbmem_tpm-clear_whole_log_on_creation.patch b/patches/coreboot-purism/0001-cbmem_tpm-clear_whole_log_on_creation.patch new file mode 100644 index 000000000..adb939789 --- /dev/null +++ b/patches/coreboot-purism/0001-cbmem_tpm-clear_whole_log_on_creation.patch @@ -0,0 +1,37 @@ +From b83a7607203d285b76e94ffd2013c55b184f5d42 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= +Date: Wed, 30 Oct 2024 10:50:37 +0100 +Subject: [PATCH] security/tpm/tspi/log-tpm1.c: Clear whole log area on + creation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The log area was not entirely cleared on creation resulting in +garbage after the last valid lgo entry. It caused the cbmem utility +to parse invalid events and access data outside the log area. +In the TPM2 log sources, the entire area is being cleared, thus the +issue has not been observed. + +Change-Id: I7c780b62b1c6507e1dd1806b20b0270e364cde3d +Signed-off-by: Michał Żygowski +--- + src/security/tpm/tspi/log-tpm1.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/security/tpm/tspi/log-tpm1.c b/src/security/tpm/tspi/log-tpm1.c +index 481b569cd5..453e74b4e8 100644 +--- a/src/security/tpm/tspi/log-tpm1.c ++++ b/src/security/tpm/tspi/log-tpm1.c +@@ -33,7 +33,7 @@ void *tpm1_log_cbmem_init(void) + if (!tclt) + return NULL; + +- memset(tclt, 0, sizeof(*tclt)); ++ memset(tclt, 0, tpm_log_len); + hdr = &tclt->spec_id; + + /* Fill in first "header" entry. */ +-- +2.39.5 + diff --git a/patches/coreboot-talos_2/0003-ugly_skiboot-patch_fix_for_newer_gcc_from_musl_125.patch b/patches/coreboot-talos_2/0003-ugly_skiboot-patch_fix_for_newer_gcc_from_musl_125.patch new file mode 100644 index 000000000..97bb9cc62 --- /dev/null +++ b/patches/coreboot-talos_2/0003-ugly_skiboot-patch_fix_for_newer_gcc_from_musl_125.patch @@ -0,0 +1,17 @@ +diff --git a/payloads/external/skiboot/patches/0002-ugly_fix_for_newer_gcc_from_musl_125.patch b/payloads/external/skiboot/patches/0002-ugly_fix_for_newer_gcc_from_musl_125.patch +new file mode 100644 +index 0000000..5db9bca +--- /dev/null ++++ b/payloads/external/skiboot/patches/0002-ugly_fix_for_newer_gcc_from_musl_125.patch +@@ -0,0 +1,11 @@ ++--- Makefile.main.orig 2024-11-06 16:19:12.161240140 -0500 +++++ Makefile.main 2024-11-06 16:23:01.119252412 -0500 ++@@ -74,7 +74,7 @@ ++ CPPFLAGS += -DDEBUG -DCCAN_LIST_DEBUG ++ endif ++ ++-CFLAGS := -fno-strict-aliasing -pie -fpie -fno-pic -mbig-endian -m64 -fno-asynchronous-unwind-tables +++CFLAGS := -Wno-error=address-of-packed-member -Wno-error=format-overflow -fno-strict-aliasing -pie -fpie -fno-pic -mbig-endian -m64 -fno-asynchronous-unwind-tables ++ CFLAGS += -mcpu=power7 ++ CFLAGS += -Wl,--oformat,elf64-powerpc -ggdb ++ CFLAGS += $(call try-cflag,$(CC),-ffixed-r13) diff --git a/patches/cryptsetup2-2.3.3.patch b/patches/cryptsetup2-2.6.1.patch similarity index 72% rename from patches/cryptsetup2-2.3.3.patch rename to patches/cryptsetup2-2.6.1.patch index 8a673ef86..036aa007a 100644 --- a/patches/cryptsetup2-2.3.3.patch +++ b/patches/cryptsetup2-2.6.1.patch @@ -1,7 +1,7 @@ -diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ---- cryptsetup-2.3.3-clean/configure 2020-06-10 14:05:45.784925972 +0200 -+++ cryptsetup-2.3.3/configure 2020-06-10 14:12:03.811651237 +0200 -@@ -10206,7 +10206,7 @@ +diff -u -r cryptsetup-2.4.3-clean/configure cryptsetup-2.4.3/configure +--- cryptsetup-2.4.3-clean/configure 2022-01-13 17:24:34.000000000 +0800 ++++ cryptsetup-2.4.3/configure 2022-01-16 14:08:37.088258763 +0800 +@@ -11056,7 +11056,7 @@ hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no @@ -10,7 +10,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported -@@ -10290,7 +10290,7 @@ +@@ -11140,7 +11140,7 @@ # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH @@ -19,7 +19,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then -@@ -10336,7 +10336,7 @@ +@@ -11186,7 +11186,7 @@ ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' @@ -28,7 +28,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_minus_L=yes ;; esac -@@ -10356,7 +10356,7 @@ +@@ -11206,7 +11206,7 @@ cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. @@ -37,7 +37,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no -@@ -10386,7 +10386,7 @@ +@@ -11236,7 +11236,7 @@ ;; os2*) @@ -46,7 +46,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll -@@ -10416,7 +10416,7 @@ +@@ -11266,7 +11266,7 @@ interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no @@ -55,7 +55,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by -@@ -10492,7 +10492,7 @@ +@@ -11342,7 +11342,7 @@ xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' @@ -64,7 +64,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ -@@ -10559,7 +10559,7 @@ +@@ -11409,7 +11409,7 @@ # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then @@ -73,7 +73,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else -@@ -10588,7 +10588,7 @@ +@@ -11438,7 +11438,7 @@ if test no = "$ld_shlibs"; then runpath_var= @@ -82,7 +82,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure export_dynamic_flag_spec= whole_archive_flag_spec= fi -@@ -10706,7 +10706,7 @@ +@@ -11556,7 +11556,7 @@ # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes @@ -91,7 +91,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator= fi ;; -@@ -10790,11 +10790,11 @@ +@@ -11642,11 +11642,11 @@ aix_libpath=$lt_cv_aix_libpath_ fi @@ -105,7 +105,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else -@@ -10843,7 +10843,7 @@ +@@ -11697,7 +11697,7 @@ aix_libpath=$lt_cv_aix_libpath_ fi @@ -114,7 +114,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' -@@ -10883,7 +10883,7 @@ +@@ -11737,7 +11737,7 @@ ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' @@ -123,25 +123,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_minus_L=yes ;; esac -@@ -10901,7 +10901,7 @@ - case $cc_basename in - cl*) - # Native MSVC -- hardcode_libdir_flag_spec=' ' -+ hardcode_libdir_flag_spec=" " - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' -@@ -10942,7 +10942,7 @@ - ;; - *) - # Assume MSVC wrapper -- hardcode_libdir_flag_spec=' ' -+ hardcode_libdir_flag_spec=" " - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib -@@ -10993,7 +10993,7 @@ +@@ -11847,7 +11847,7 @@ dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' @@ -150,7 +132,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_shlibpath_var=no ;; -@@ -11003,7 +11003,7 @@ +@@ -11857,7 +11857,7 @@ # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' @@ -159,16 +141,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_direct=yes hardcode_shlibpath_var=no ;; -@@ -11019,7 +11019,7 @@ - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' -- hardcode_libdir_flag_spec='-R$libdir' -+ hardcode_libdir_flag_spec=" " - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; -@@ -11030,7 +11030,7 @@ +@@ -11884,7 +11884,7 @@ else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi @@ -177,7 +150,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator=: hardcode_direct=yes -@@ -11047,7 +11047,7 @@ +@@ -11901,7 +11901,7 @@ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then @@ -186,7 +159,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes -@@ -11124,7 +11124,7 @@ +@@ -11979,7 +11979,7 @@ esac fi if test no = "$with_gnu_ld"; then @@ -195,7 +168,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator=: case $host_cpu in -@@ -11183,7 +11183,7 @@ +@@ -12040,7 +12040,7 @@ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' @@ -204,7 +177,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes -@@ -11205,7 +11205,7 @@ +@@ -12062,7 +12062,7 @@ else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi @@ -213,7 +186,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_direct=yes hardcode_shlibpath_var=no ;; -@@ -11213,7 +11213,7 @@ +@@ -12070,7 +12070,7 @@ newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes @@ -222,7 +195,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; -@@ -11229,11 +11229,11 @@ +@@ -12086,11 +12086,11 @@ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' @@ -236,7 +209,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure fi else ld_shlibs=no -@@ -11241,7 +11241,7 @@ +@@ -12098,7 +12098,7 @@ ;; os2*) @@ -245,7 +218,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll -@@ -11277,7 +11277,7 @@ +@@ -12134,7 +12134,7 @@ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' @@ -254,7 +227,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator=: ;; -@@ -11285,7 +11285,7 @@ +@@ -12142,7 +12142,7 @@ if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' @@ -263,7 +236,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' -@@ -11293,7 +11293,7 @@ +@@ -12150,7 +12150,7 @@ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly @@ -272,7 +245,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure fi archive_cmds_need_lc='no' hardcode_libdir_separator=: -@@ -11322,7 +11322,7 @@ +@@ -12179,7 +12179,7 @@ ;; esac fi @@ -281,7 +254,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; -@@ -11349,7 +11349,7 @@ +@@ -12206,7 +12206,7 @@ else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi @@ -290,7 +263,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no -@@ -11419,7 +11419,7 @@ +@@ -12276,7 +12276,7 @@ allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no @@ -299,7 +272,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' -@@ -11436,7 +11436,7 @@ +@@ -12293,7 +12293,7 @@ uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' @@ -308,7 +281,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_shlibpath_var=no ;; -@@ -11804,7 +11804,7 @@ +@@ -12662,7 +12662,7 @@ version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no @@ -317,7 +290,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' -@@ -12094,16 +12094,16 @@ +@@ -12952,16 +12952,16 @@ ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes @@ -337,7 +310,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ;; esac ;; -@@ -12118,7 +12118,7 @@ +@@ -12976,7 +12976,7 @@ shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' @@ -346,7 +319,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ;; hpux9* | hpux10* | hpux11*) -@@ -12130,7 +12130,7 @@ +@@ -12988,7 +12988,7 @@ case $host_cpu in ia64*) shrext_cmds='.so' @@ -355,7 +328,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. -@@ -12146,7 +12146,7 @@ +@@ -13004,7 +13004,7 @@ ;; hppa*64*) shrext_cmds='.sl' @@ -364,7 +337,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. -@@ -12179,7 +12179,7 @@ +@@ -13037,7 +13037,7 @@ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -373,7 +346,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ;; irix5* | irix6* | nonstopux*) -@@ -12216,7 +12216,7 @@ +@@ -13074,7 +13074,7 @@ shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" @@ -382,7 +355,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ;; # No shared lib support for Linux oldld, aout, or coff. -@@ -12237,11 +12237,11 @@ +@@ -13095,11 +13095,11 @@ # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. @@ -396,7 +369,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ;; # This must be glibc/ELF. -@@ -12292,7 +12292,7 @@ +@@ -13153,7 +13153,7 @@ # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. @@ -405,7 +378,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not -@@ -12322,7 +12322,7 @@ +@@ -13183,7 +13183,7 @@ soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -414,7 +387,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure dynamic_linker='NetBSD ld.elf_so' ;; -@@ -12341,7 +12341,7 @@ +@@ -13202,7 +13202,7 @@ fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -423,7 +396,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ;; newsos6) -@@ -12359,7 +12359,7 @@ +@@ -13220,7 +13220,7 @@ soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -432,7 +405,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure dynamic_linker='ldqnx.so' ;; -@@ -12431,7 +12431,7 @@ +@@ -13292,7 +13292,7 @@ soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -441,7 +414,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; -@@ -12488,7 +12488,7 @@ +@@ -13349,7 +13349,7 @@ soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -450,7 +423,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else -@@ -12510,7 +12510,7 @@ +@@ -13371,7 +13371,7 @@ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -459,7 +432,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure ;; uts4*) -@@ -13610,7 +13610,7 @@ +@@ -14490,7 +14490,7 @@ acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" @@ -468,7 +441,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" -@@ -21296,7 +21296,7 @@ +@@ -22538,7 +22538,7 @@ with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' @@ -477,7 +450,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -@@ -21327,7 +21327,7 @@ +@@ -22569,7 +22569,7 @@ postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' @@ -486,7 +459,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' -@@ -22485,7 +22485,7 @@ +@@ -23727,7 +23727,7 @@ finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. @@ -495,7 +468,7 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec -@@ -22582,7 +22582,7 @@ +@@ -23824,7 +23824,7 @@ # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist @@ -504,10 +477,10 @@ diff -u -r cryptsetup-2.3.3-clean/configure cryptsetup-2.3.3/configure # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator -diff -u -r cryptsetup-2.3.3-clean/Makefile.in cryptsetup-2.3.3/Makefile.in ---- cryptsetup-2.3.3-clean/Makefile.in 2020-06-10 14:05:45.781594282 +0200 -+++ cryptsetup-2.3.3/Makefile.in 2020-06-10 14:30:09.512375745 +0200 -@@ -1032,6 +1032,8 @@ +diff -u -r cryptsetup-2.4.3-clean/Makefile.in cryptsetup-2.4.3/Makefile.in +--- cryptsetup-2.4.3-clean/Makefile.in 2022-01-13 17:24:33.000000000 +0800 ++++ cryptsetup-2.4.3/Makefile.in 2022-01-16 14:08:37.096258854 +0800 +@@ -1115,6 +1115,8 @@ @CRYPTSETUP_TRUE@cryptsetup_LDADD = $(LDADD) \ @CRYPTSETUP_TRUE@ libcryptsetup.la \ @CRYPTSETUP_TRUE@ @POPT_LIBS@ \ @@ -516,31 +489,218 @@ diff -u -r cryptsetup-2.3.3-clean/Makefile.in cryptsetup-2.3.3/Makefile.in @CRYPTSETUP_TRUE@ @PWQUALITY_LIBS@ \ @CRYPTSETUP_TRUE@ @PASSWDQC_LIBS@ \ @CRYPTSETUP_TRUE@ @UUID_LIBS@ \ -@@ -1060,6 +1062,9 @@ +@@ -1147,6 +1149,9 @@ @VERITYSETUP_TRUE@veritysetup_LDADD = $(LDADD) \ @VERITYSETUP_TRUE@ libcryptsetup.la \ @VERITYSETUP_TRUE@ @POPT_LIBS@ \ -+@VERITYSETUP_TRUE@ @UUID_LIBS@ \ -+@VERITYSETUP_TRUE@ @DEVMAPPER_LIBS@ \ -+@VERITYSETUP_TRUE@ @JSON_C_LIBS@ \ - @VERITYSETUP_TRUE@ @PWQUALITY_LIBS@ \ - @VERITYSETUP_TRUE@ @PASSWDQC_LIBS@ \ ++@VERITYSETUP_TRUE@ @UUID_LIBS@ \ ++@VERITYSETUP_TRUE@ @DEVMAPPER_LIBS@ \ ++@VERITYSETUP_TRUE@ @JSON_C_LIBS@ \ @VERITYSETUP_TRUE@ @BLKID_LIBS@ -@@ -1093,6 +1093,8 @@ + + @STATIC_TOOLS_TRUE@@VERITYSETUP_TRUE@veritysetup_static_SOURCES = $(veritysetup_SOURCES) +@@ -1177,6 +1182,8 @@ @INTEGRITYSETUP_TRUE@ libcryptsetup.la \ @INTEGRITYSETUP_TRUE@ @POPT_LIBS@ \ @INTEGRITYSETUP_TRUE@ @UUID_LIBS@ \ +@INTEGRITYSETUP_TRUE@ @DEVMAPPER_LIBS@ \ +@INTEGRITYSETUP_TRUE@ @JSON_C_LIBS@ \ @INTEGRITYSETUP_TRUE@ @BLKID_LIBS@ - + @INTEGRITYSETUP_TRUE@@STATIC_TOOLS_TRUE@integritysetup_static_SOURCES = $(integritysetup_SOURCES) -@@ -1122,6 +1122,8 @@ - @REENCRYPT_TRUE@ @POPT_LIBS@ \ - @REENCRYPT_TRUE@ @PWQUALITY_LIBS@ \ - @REENCRYPT_TRUE@ @PASSWDQC_LIBS@ \ -+@REENCRYPT_TRUE@ @DEVMAPPER_LIBS@ \ -+@REENCRYPT_TRUE@ @JSON_C_LIBS@ \ - @REENCRYPT_TRUE@ @UUID_LIBS@ \ - @REENCRYPT_TRUE@ @BLKID_LIBS@ +--- ./configure.orig 2023-11-26 14:22:30.912000000 -0500 ++++ ./configure 2023-11-26 14:26:21.714000000 -0500 +@@ -12336,7 +12336,7 @@ + + case $cc_basename in + tcc*) +- hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' ++ hardcode_libdir_flag_spec=" " + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) +@@ -12755,7 +12755,7 @@ + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC +- hardcode_libdir_flag_spec=' ' ++ hardcode_libdir_flag_spec=" " + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' +@@ -12796,7 +12796,7 @@ + ;; + *) + # Assume MSVC and ICC wrapper +- hardcode_libdir_flag_spec=' ' ++ hardcode_libdir_flag_spec=" " + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib +@@ -12873,7 +12873,7 @@ + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly* | midnightbsd*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- hardcode_libdir_flag_spec='-R$libdir' ++ hardcode_libdir_flag_spec=" " + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; +@@ -13052,7 +13052,7 @@ + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' ++ hardcode_libdir_flag_spec=" " + ;; + esac + ;; +--- ./configure.mod 2023-11-26 14:46:49.779000000 -0500 ++++ ./configure 2023-11-26 14:47:56.962000000 -0500 +@@ -17670,7 +17670,7 @@ + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' +@@ -17958,16 +17958,16 @@ + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + esac + ;; +@@ -17982,7 +17982,7 @@ + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + hpux9* | hpux10* | hpux11*) +@@ -17994,7 +17994,7 @@ + case $host_cpu in + ia64*) + shrext_cmds='.so' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +@@ -18010,7 +18010,7 @@ + ;; + hppa*64*) + shrext_cmds='.sl' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +@@ -18043,7 +18043,7 @@ + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + irix5* | irix6* | nonstopux*) +@@ -18080,7 +18080,7 @@ + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + # No shared lib support for Linux oldld, aout, or coff. +@@ -18101,7 +18101,7 @@ + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. +- hardcode_into_libs=yes ++ hardcode_into_libs=no + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. +@@ -18159,7 +18159,7 @@ + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. +- hardcode_into_libs=yes ++ hardcode_into_libs=no + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not +@@ -18189,7 +18189,7 @@ + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker='NetBSD ld.elf_so' + ;; + +@@ -18208,7 +18208,7 @@ + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + newsos6) +@@ -18226,7 +18226,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker='ldqnx.so' + ;; + +@@ -18298,7 +18298,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; +@@ -18355,7 +18355,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else +@@ -18377,7 +18377,7 @@ + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + uts4*) diff --git a/patches/gpg2-2.2.10.patch b/patches/gpg2-2.2.10.patch deleted file mode 100644 index ed940b1b3..000000000 --- a/patches/gpg2-2.2.10.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff -u --recursive /home/tlaurion/build/clean/gnupg-2.2.10/configure gnupg-2.2.10/configure ---- /home/tlaurion/build/clean/gnupg-2.2.10/configure 2016-08-17 09:20:25.000000000 -0400 -+++ gnupg-2.2.10/configure 2018-01-20 16:55:14.502067084 -0500 -@@ -572,7 +572,7 @@ - ac_clean_files= - ac_config_libobj_dir=. - LIBOBJS= --cross_compiling=no -+cross_compiling=yes - subdirs= - MFLAGS= - MAKEFLAGS= -diff -u --recursive gnupg-2.2.10/common/ttyio.c gnupg-2.2.10/common/ttyio.c.mod ---- gnupg-2.2.10/common/ttyio.c 2017-08-28 06:22:54.000000000 -0400 -+++ gnupg-2.2.10/common/ttyio.c.mod 2018-09-18 23:00:07.386250017 -0400 -@@ -190,7 +190,9 @@ - #elif defined (HAVE_W32CE_SYSTEM) - ttyfp = stderr; - #else -- ttyfp = batchmode? stderr : fopen (tty_get_ttyname (), "r+"); -+ //ttyfp = batchmode? stderr : fopen( tty_get_ttyname (), "r+"); -+ ttyfp = stderr; -+ - if( !ttyfp ) { - log_error("cannot open '%s': %s\n", tty_get_ttyname (), - strerror(errno) ); - diff --git a/patches/libassuan-2.5.1.patch b/patches/libgcrypt-1.10.2.patch similarity index 89% rename from patches/libassuan-2.5.1.patch rename to patches/libgcrypt-1.10.2.patch index ff27dbd27..902d96ec2 100644 --- a/patches/libassuan-2.5.1.patch +++ b/patches/libgcrypt-1.10.2.patch @@ -1,7 +1,7 @@ -diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ---- libassuan-2.5.1-clean/configure 2017-12-07 06:55:50.000000000 -0800 -+++ libassuan-2.5.1/configure 2020-01-12 13:39:50.655638965 -0800 -@@ -10781,7 +10781,7 @@ +diff -u -r libgcrypt-1.8.3-clean/configure libgcrypt-1.8.3/configure +--- libgcrypt-1.8.3-clean/configure 2018-06-13 00:39:33.000000000 -0700 ++++ libgcrypt-1.8.3/configure 2020-01-12 13:32:34.840010800 -0800 +@@ -11292,7 +11292,7 @@ version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no @@ -10,7 +10,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' -@@ -11020,16 +11020,16 @@ +@@ -11531,16 +11531,16 @@ ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes @@ -30,7 +30,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ;; esac ;; -@@ -11042,7 +11042,7 @@ +@@ -11553,7 +11553,7 @@ soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -39,7 +39,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ;; haiku*) -@@ -11055,7 +11055,7 @@ +@@ -11566,7 +11566,7 @@ shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' @@ -48,7 +48,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ;; hpux9* | hpux10* | hpux11*) -@@ -11067,7 +11067,7 @@ +@@ -11578,7 +11578,7 @@ case $host_cpu in ia64*) shrext_cmds='.so' @@ -57,7 +57,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. -@@ -11082,7 +11082,7 @@ +@@ -11593,7 +11593,7 @@ ;; hppa*64*) shrext_cmds='.sl' @@ -66,7 +66,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. -@@ -11115,7 +11115,7 @@ +@@ -11626,7 +11626,7 @@ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -75,7 +75,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ;; irix5* | irix6* | nonstopux*) -@@ -11152,7 +11152,7 @@ +@@ -11663,7 +11663,7 @@ shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" @@ -84,7 +84,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ;; # No shared lib support for Linux oldld, aout, or coff. -@@ -11173,7 +11173,7 @@ +@@ -11684,7 +11684,7 @@ # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. @@ -93,7 +93,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. -@@ -11228,7 +11228,7 @@ +@@ -11739,7 +11739,7 @@ # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. @@ -102,7 +102,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then -@@ -11253,7 +11253,7 @@ +@@ -11764,7 +11764,7 @@ soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -111,7 +111,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure dynamic_linker='NetBSD ld.elf_so' ;; -@@ -11272,7 +11272,7 @@ +@@ -11783,7 +11783,7 @@ fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -120,7 +120,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ;; newsos6) -@@ -11290,7 +11290,7 @@ +@@ -11801,7 +11801,7 @@ soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -129,7 +129,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure dynamic_linker='ldqnx.so' ;; -@@ -11352,7 +11352,7 @@ +@@ -11863,7 +11863,7 @@ soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -138,7 +138,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; -@@ -11409,7 +11409,7 @@ +@@ -11920,7 +11920,7 @@ soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -147,7 +147,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else -@@ -11431,7 +11431,7 @@ +@@ -11942,7 +11942,7 @@ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -156,7 +156,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure ;; uts4*) -@@ -15680,7 +15680,7 @@ +@@ -19824,7 +19824,7 @@ postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' @@ -165,7 +165,7 @@ diff -u -r libassuan-2.5.1-clean/configure libassuan-2.5.1/configure sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -@@ -16896,7 +16896,7 @@ +@@ -21088,7 +21088,7 @@ finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. diff --git a/patches/linux-5.10.5/0001-fake-acpi.patch b/patches/linux-5.10.214/0001-fake-acpi.patch similarity index 100% rename from patches/linux-5.10.5/0001-fake-acpi.patch rename to patches/linux-5.10.214/0001-fake-acpi.patch diff --git a/patches/linux-5.10.5/0002-nmi-squelch.patch b/patches/linux-5.10.214/0002-nmi-squelch.patch similarity index 100% rename from patches/linux-5.10.5/0002-nmi-squelch.patch rename to patches/linux-5.10.214/0002-nmi-squelch.patch diff --git a/patches/linux-5.10.5/0003-fake-trampoline.patch b/patches/linux-5.10.214/0003-fake-trampoline.patch similarity index 100% rename from patches/linux-5.10.5/0003-fake-trampoline.patch rename to patches/linux-5.10.214/0003-fake-trampoline.patch diff --git a/patches/linux-5.10.5/0010-winterfell-ahci.patch b/patches/linux-5.10.214/0010-winterfell-ahci.patch similarity index 100% rename from patches/linux-5.10.5/0010-winterfell-ahci.patch rename to patches/linux-5.10.214/0010-winterfell-ahci.patch diff --git a/patches/linux-5.10.214/shebangs.patch b/patches/linux-5.10.214/shebangs.patch new file mode 100644 index 000000000..34164d291 --- /dev/null +++ b/patches/linux-5.10.214/shebangs.patch @@ -0,0 +1,40 @@ +diff --git a/scripts/check-sysctl-docs b/scripts/check-sysctl-docs +index 8bcb9e26c7bc..90137319c50a 100755 +--- a/scripts/check-sysctl-docs ++++ b/scripts/check-sysctl-docs +@@ -1,4 +1,4 @@ +-#!/usr/bin/gawk -f ++#!/usr/bin/env -S gawk -f + # SPDX-License-Identifier: GPL-2.0 + + # Script to check sysctl documentation against source files +diff --git a/scripts/ld-version.sh b/scripts/ld-version.sh +index f2be0ff9a738..7a5b546ece16 100755 +--- a/scripts/ld-version.sh ++++ b/scripts/ld-version.sh +@@ -1,4 +1,4 @@ +-#!/usr/bin/awk -f ++#!/usr/bin/env -S awk -f + # SPDX-License-Identifier: GPL-2.0 + # extract linker version number from stdin and turn into single number + { +diff --git a/scripts/parse-maintainers.pl b/scripts/parse-maintainers.pl +index 2ca4eb3f190d..9515765158fa 100755 +--- a/scripts/parse-maintainers.pl ++++ b/scripts/parse-maintainers.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl -w ++#!/usr/bin/env -S perl -w + # SPDX-License-Identifier: GPL-2.0 + + use strict; +diff --git a/scripts/ver_linux b/scripts/ver_linux +index 0968a3070eff..345b92f71d2d 100755 +--- a/scripts/ver_linux ++++ b/scripts/ver_linux +@@ -1,4 +1,4 @@ +-#!/usr/bin/awk -f ++#!/usr/bin/env -S awk -f + # SPDX-License-Identifier: GPL-2.0 + # Before running this script please ensure that your PATH is + # typical as you use for compilation/installation. I use diff --git a/patches/linux-5.10.5/0004-libsubcmd_Fix_use-after-free-for-realloc.patch b/patches/linux-5.10.5/0004-libsubcmd_Fix_use-after-free-for-realloc.patch deleted file mode 100644 index 57d0d5038..000000000 --- a/patches/linux-5.10.5/0004-libsubcmd_Fix_use-after-free-for-realloc.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 52a9dab6d892763b2a8334a568bd4e2c1a6fde66 Mon Sep 17 00:00:00 2001 -From: Kees Cook -Date: Sun, 13 Feb 2022 10:24:43 -0800 -Subject: [PATCH] libsubcmd: Fix use-after-free for realloc(..., 0) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -GCC 12 correctly reports a potential use-after-free condition in the -xrealloc helper. Fix the warning by avoiding an implicit "free(ptr)" -when size == 0: - -In file included from help.c:12: -In function 'xrealloc', - inlined from 'add_cmdname' at help.c:24:2: subcmd-util.h:56:23: error: pointer may be used after 'realloc' [-Werror=use-after-free] - 56 | ret = realloc(ptr, size); - | ^~~~~~~~~~~~~~~~~~ -subcmd-util.h:52:21: note: call to 'realloc' here - 52 | void *ret = realloc(ptr, size); - | ^~~~~~~~~~~~~~~~~~ -subcmd-util.h:58:31: error: pointer may be used after 'realloc' [-Werror=use-after-free] - 58 | ret = realloc(ptr, 1); - | ^~~~~~~~~~~~~~~ -subcmd-util.h:52:21: note: call to 'realloc' here - 52 | void *ret = realloc(ptr, size); - | ^~~~~~~~~~~~~~~~~~ - -Fixes: 2f4ce5ec1d447beb ("perf tools: Finalize subcmd independence") -Reported-by: Valdis Klētnieks -Signed-off-by: Kees Kook -Tested-by: Valdis Klētnieks -Tested-by: Justin M. Forbes -Acked-by: Josh Poimboeuf -Cc: linux-hardening@vger.kernel.org -Cc: Valdis Klētnieks -Link: http://lore.kernel.org/lkml/20220213182443.4037039-1-keescook@chromium.org -Signed-off-by: Arnaldo Carvalho de Melo ---- - tools/lib/subcmd/subcmd-util.h | 11 ++--------- - 1 file changed, 2 insertions(+), 9 deletions(-) - -diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h -index 794a375dad3601..b2aec04fce8f67 100644 ---- a/tools/lib/subcmd/subcmd-util.h -+++ b/tools/lib/subcmd/subcmd-util.h -@@ -50,15 +50,8 @@ static NORETURN inline void die(const char *err, ...) - static inline void *xrealloc(void *ptr, size_t size) - { - void *ret = realloc(ptr, size); -- if (!ret && !size) -- ret = realloc(ptr, 1); -- if (!ret) { -- ret = realloc(ptr, size); -- if (!ret && !size) -- ret = realloc(ptr, 1); -- if (!ret) -- die("Out of memory, realloc failed"); -- } -+ if (!ret) -+ die("Out of memory, realloc failed"); - return ret; - } - - diff --git a/patches/linux-5.5-openpower/shebangs.patch b/patches/linux-5.5-openpower/shebangs.patch new file mode 100644 index 000000000..38f5cb533 --- /dev/null +++ b/patches/linux-5.5-openpower/shebangs.patch @@ -0,0 +1,190 @@ +diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter +index 8c965f6a9881..bcd66a014453 100755 +--- a/scripts/bloat-o-meter ++++ b/scripts/bloat-o-meter +@@ -1,4 +1,4 @@ +-#!/usr/bin/python ++#!/usr/bin/env python + # + # Copyright 2004 Matt Mackall + # +diff --git a/scripts/coccicheck b/scripts/coccicheck +index e04d328210ac..851c3307ca74 100755 +--- a/scripts/coccicheck ++++ b/scripts/coccicheck +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0 + # Linux kernel coccicheck + # +diff --git a/scripts/config b/scripts/config +index e0e39826dae9..ba11e350e8af 100755 +--- a/scripts/config ++++ b/scripts/config +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0 + # Manipulate options in a .config file from the command line + +diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh +index 13e5fbafdf2f..8c22ac90123b 100755 +--- a/scripts/decode_stacktrace.sh ++++ b/scripts/decode_stacktrace.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0 + # (c) 2014, Sasha Levin + #set -x +diff --git a/scripts/diffconfig b/scripts/diffconfig +index 89abf777f197..627eba5849b5 100755 +--- a/scripts/diffconfig ++++ b/scripts/diffconfig +@@ -1,4 +1,4 @@ +-#!/usr/bin/python ++#!/usr/bin/env python + # SPDX-License-Identifier: GPL-2.0 + # + # diffconfig - a tool to compare .config files. +diff --git a/scripts/faddr2line b/scripts/faddr2line +index 6c6439f69a72..5079957d4993 100755 +--- a/scripts/faddr2line ++++ b/scripts/faddr2line +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0 + # + # Translate stack dump function offsets. +diff --git a/scripts/find-unused-docs.sh b/scripts/find-unused-docs.sh +index 3f46f8977dc4..363e7ecab554 100755 +--- a/scripts/find-unused-docs.sh ++++ b/scripts/find-unused-docs.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # (c) 2017, Jonathan Corbet + # sayli karnik + # +diff --git a/scripts/get_abi.pl b/scripts/get_abi.pl +index c738cb795514..ba87b230fe0a 100755 +--- a/scripts/get_abi.pl ++++ b/scripts/get_abi.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl ++#!/usr/bin/env perl + # SPDX-License-Identifier: GPL-2.0 + + use strict; +diff --git a/scripts/gfp-translate b/scripts/gfp-translate +index b2ce416d944b..2fcea3e9afb3 100755 +--- a/scripts/gfp-translate ++++ b/scripts/gfp-translate +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0-only + # Translate the bits making up a GFP mask + # (c) 2009, Mel Gorman +diff --git a/scripts/ld-version.sh b/scripts/ld-version.sh +index f2be0ff9a738..081efc679705 100755 +--- a/scripts/ld-version.sh ++++ b/scripts/ld-version.sh +@@ -1,4 +1,4 @@ +-#!/usr/bin/awk -f ++#!/usr/bin/env -S awk -f + # SPDX-License-Identifier: GPL-2.0 + # extract linker version number from stdin and turn into single number + { +diff --git a/scripts/mkuboot.sh b/scripts/mkuboot.sh +index 4b1fe09e9042..0b6df121a3b5 100755 +--- a/scripts/mkuboot.sh ++++ b/scripts/mkuboot.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0 + + # +diff --git a/scripts/objdiff b/scripts/objdiff +index 72b0b63c3fe1..95f087300637 100755 +--- a/scripts/objdiff ++++ b/scripts/objdiff +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0-only + + # objdiff - a small script for validating that a commit or series of commits +diff --git a/scripts/parse-maintainers.pl b/scripts/parse-maintainers.pl +index 255cef1b098d..c2d11c87fdb4 100644 +--- a/scripts/parse-maintainers.pl ++++ b/scripts/parse-maintainers.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl -w ++#!/usr/bin/env -S perl -w + # SPDX-License-Identifier: GPL-2.0 + + use strict; +diff --git a/scripts/prune-kernel b/scripts/prune-kernel +index e8aa940bc0a9..620230f677bc 100755 +--- a/scripts/prune-kernel ++++ b/scripts/prune-kernel +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0 + + # because I use CONFIG_LOCALVERSION_AUTO, not the same version again and +diff --git a/scripts/show_delta b/scripts/show_delta +index 264399307c4f..28e67e178194 100755 +--- a/scripts/show_delta ++++ b/scripts/show_delta +@@ -1,4 +1,4 @@ +-#!/usr/bin/python ++#!/usr/bin/env python + # SPDX-License-Identifier: GPL-2.0-only + # + # show_deltas: Read list of printk messages instrumented with +diff --git a/scripts/sphinx-pre-install b/scripts/sphinx-pre-install +index 470ccfe678aa..214ed660c0d0 100755 +--- a/scripts/sphinx-pre-install ++++ b/scripts/sphinx-pre-install +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl ++#!/usr/bin/env perl + # SPDX-License-Identifier: GPL-2.0-or-later + use strict; + +diff --git a/scripts/split-man.pl b/scripts/split-man.pl +index c3db607ee9ec..96bd99dc977a 100755 +--- a/scripts/split-man.pl ++++ b/scripts/split-man.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl ++#!/usr/bin/env perl + # SPDX-License-Identifier: GPL-2.0 + # + # Author: Mauro Carvalho Chehab +diff --git a/scripts/tags.sh b/scripts/tags.sh +index 4e18ae5282a6..02c08d460997 100755 +--- a/scripts/tags.sh ++++ b/scripts/tags.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # SPDX-License-Identifier: GPL-2.0-only + # Generate tags or cscope files + # Usage tags.sh +diff --git a/scripts/ver_linux b/scripts/ver_linux +index 85005d6b7f10..34e4530fd5b6 100755 +--- a/scripts/ver_linux ++++ b/scripts/ver_linux +@@ -1,4 +1,4 @@ +-#!/usr/bin/awk -f ++#!/usr/bin/env -S awk -f + # SPDX-License-Identifier: GPL-2.0 + # Before running this script please ensure that your PATH is + # typical as you use for compilation/installation. I use diff --git a/patches/linux-6.6.16-openpower/0001-xhci-Reset-controller-on-xhci-shutdown.patch b/patches/linux-6.6.16-openpower/0001-xhci-Reset-controller-on-xhci-shutdown.patch new file mode 100644 index 000000000..7f9c426ea --- /dev/null +++ b/patches/linux-6.6.16-openpower/0001-xhci-Reset-controller-on-xhci-shutdown.patch @@ -0,0 +1,29 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Brian King +Date: Wed, 25 Oct 2017 10:42:59 +1100 +Subject: [PATCH 1/2] xhci: Reset controller on xhci shutdown + +Fixes kexec boot. Without a hard reset, some USB chips will fail to +initialize in a kexec booted kernel. + +Signed-off-by: Brian King +Signed-off-by: Samuel Mendoza-Jonas +Signed-off-by: Joel Stanley +--- + drivers/usb/host/xhci.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c +index 473b0b64dd57..ca0c642ce935 100644 +--- a/drivers/usb/host/xhci.c ++++ b/drivers/usb/host/xhci.c +@@ -812,6 +812,9 @@ void xhci_shutdown(struct usb_hcd *hcd) + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "xhci_shutdown completed - status = %x", + readl(&xhci->op_regs->status)); ++ ++ /* TI XHCI controllers do not come back after kexec without this hack */ ++ pci_reset_function_locked(to_pci_dev(hcd->self.sysdev)); + } + EXPORT_SYMBOL_GPL(xhci_shutdown); + diff --git a/patches/linux-6.6.16-openpower/0002-Release-OpenPower-kernel.patch b/patches/linux-6.6.16-openpower/0002-Release-OpenPower-kernel.patch new file mode 100644 index 000000000..f46c5c5ad --- /dev/null +++ b/patches/linux-6.6.16-openpower/0002-Release-OpenPower-kernel.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Joel Stanley +Date: Thu, 15 Jul 2021 17:21:55 +0930 +Subject: [PATCH 2/2] Release OpenPower kernel + +Signed-off-by: Joel Stanley +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index 92accf2ddc08..18dcc81a67e4 100644 +--- a/Makefile ++++ b/Makefile +@@ -2,7 +2,7 @@ + VERSION = 6 + PATCHLEVEL = 6 + SUBLEVEL = 16 +-EXTRAVERSION = ++EXTRAVERSION = -openpower1 + NAME = Hurr durr I'ma ninja sloth + + # *DOCUMENTATION* diff --git a/patches/linux-6.6.16-openpower/0003-drm-ast-Add-option-to-initialize-palette-on-driver-l.patch b/patches/linux-6.6.16-openpower/0003-drm-ast-Add-option-to-initialize-palette-on-driver-l.patch new file mode 100644 index 000000000..3e7f14d5a --- /dev/null +++ b/patches/linux-6.6.16-openpower/0003-drm-ast-Add-option-to-initialize-palette-on-driver-l.patch @@ -0,0 +1,138 @@ +From 39017ede41e6286e232c18cdf8b6b600dd751696 Mon Sep 17 00:00:00 2001 +From: Timothy Pearson +Date: Fri, 9 Feb 2024 16:22:29 -0600 +Subject: [PATCH] drm/ast: Add option to initialize palette on driver load + +Non-x86 systems, such as OpenPOWER and ARM machines, do not execute the ASPEED- +provided option ROM on system start. As a result, the VGA palette registers +remain uninitialized, leading to odd colors and generally hard to read output +on the VGA port. + +Add a new module option, ast_resetpalette, to enable loading a linear greyscale +palette into the VGA RAMDAC. This option is intended for use by the first Linux +kernel to load after initial power on, such as the skiroot kernel on OpenPOWER +systems. + +Signed-off-by: Timothy Pearson +--- + drivers/gpu/drm/ast/ast_drv.c | 4 ++++ + drivers/gpu/drm/ast/ast_drv.h | 14 ++++++++++++++ + drivers/gpu/drm/ast/ast_main.c | 8 ++++++++ + drivers/gpu/drm/ast/ast_mode.c | 14 -------------- + 4 files changed, 26 insertions(+), 14 deletions(-) + +diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c +index e1224ef4ad83..d46dc88ccbe9 100644 +--- a/drivers/gpu/drm/ast/ast_drv.c ++++ b/drivers/gpu/drm/ast/ast_drv.c +@@ -1,5 +1,6 @@ + /* + * Copyright 2012 Red Hat Inc. ++ * Copyright 2024 Raptor Engineering, LLC. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the +@@ -40,9 +41,12 @@ + #include "ast_drv.h" + + static int ast_modeset = -1; ++int ast_resetpalette = -1; + + MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); ++MODULE_PARM_DESC(resetpalette, "Disable/Enable palette reset on load"); + module_param_named(modeset, ast_modeset, int, 0400); ++module_param_named(resetpalette, ast_resetpalette, int, 0400); + + /* + * DRM driver +diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h +index f7053f2972bb..61b6ae0dfbf3 100644 +--- a/drivers/gpu/drm/ast/ast_drv.h ++++ b/drivers/gpu/drm/ast/ast_drv.h +@@ -340,6 +340,20 @@ static inline void ast_set_index_reg_mask(struct ast_device *ast, u32 base, u8 i + ast_set_index_reg(ast, base, index, tmp); + } + ++static inline void ast_load_palette_index(struct ast_device *ast, ++ u8 index, u8 red, u8 green, ++ u8 blue) ++{ ++ ast_io_write8(ast, AST_IO_DAC_INDEX_WRITE, index); ++ ast_io_read8(ast, AST_IO_SEQ_PORT); ++ ast_io_write8(ast, AST_IO_DAC_DATA, red); ++ ast_io_read8(ast, AST_IO_SEQ_PORT); ++ ast_io_write8(ast, AST_IO_DAC_DATA, green); ++ ast_io_read8(ast, AST_IO_SEQ_PORT); ++ ast_io_write8(ast, AST_IO_DAC_DATA, blue); ++ ast_io_read8(ast, AST_IO_SEQ_PORT); ++} ++ + #define AST_VIDMEM_SIZE_8M 0x00800000 + #define AST_VIDMEM_SIZE_16M 0x01000000 + #define AST_VIDMEM_SIZE_32M 0x02000000 +diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c +index dae365ed3969..ada259761b0e 100644 +--- a/drivers/gpu/drm/ast/ast_main.c ++++ b/drivers/gpu/drm/ast/ast_main.c +@@ -1,5 +1,6 @@ + /* + * Copyright 2012 Red Hat Inc. ++ * Copyright 2024 Raptor Engineering, LLC. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the +@@ -35,6 +36,8 @@ + + #include "ast_drv.h" + ++extern int ast_resetpalette; ++ + static bool ast_is_vga_enabled(struct drm_device *dev) + { + struct ast_device *ast = to_ast_device(dev); +@@ -432,6 +435,7 @@ struct ast_device *ast_device_create(const struct drm_driver *drv, + struct ast_device *ast; + bool need_post = false; + int ret = 0; ++ int index = 0; + + ast = devm_drm_dev_alloc(&pdev->dev, drv, struct ast_device, base); + if (IS_ERR(ast)) +@@ -517,5 +521,9 @@ struct ast_device *ast_device_create(const struct drm_driver *drv, + if (ret) + return ERR_PTR(ret); + ++ if (ast_resetpalette == 1) ++ for (index = 0x00; index < 0x100; index++) ++ ast_load_palette_index(ast, index, index, index, index); ++ + return ast; + } +diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c +index 3de0f457fff6..81bed5eeb87b 100644 +--- a/drivers/gpu/drm/ast/ast_mode.c ++++ b/drivers/gpu/drm/ast/ast_mode.c +@@ -51,20 +51,6 @@ + + #define AST_LUT_SIZE 256 + +-static inline void ast_load_palette_index(struct ast_device *ast, +- u8 index, u8 red, u8 green, +- u8 blue) +-{ +- ast_io_write8(ast, AST_IO_DAC_INDEX_WRITE, index); +- ast_io_read8(ast, AST_IO_SEQ_PORT); +- ast_io_write8(ast, AST_IO_DAC_DATA, red); +- ast_io_read8(ast, AST_IO_SEQ_PORT); +- ast_io_write8(ast, AST_IO_DAC_DATA, green); +- ast_io_read8(ast, AST_IO_SEQ_PORT); +- ast_io_write8(ast, AST_IO_DAC_DATA, blue); +- ast_io_read8(ast, AST_IO_SEQ_PORT); +-} +- + static void ast_crtc_set_gamma_linear(struct ast_device *ast, + const struct drm_format_info *format) + { +-- +2.39.2 + diff --git a/patches/linux-6.6.16-openpower/0004-Force-ASpeed-RAMDAC-palette-reset.patch b/patches/linux-6.6.16-openpower/0004-Force-ASpeed-RAMDAC-palette-reset.patch new file mode 100644 index 000000000..1b7961912 --- /dev/null +++ b/patches/linux-6.6.16-openpower/0004-Force-ASpeed-RAMDAC-palette-reset.patch @@ -0,0 +1,26 @@ +From 33cb4510b70e7625636a4280e29081ce7cef69e9 Mon Sep 17 00:00:00 2001 +From: Raptor Engineering Development Team +Date: Fri, 2 Feb 2018 07:37:41 -0600 +Subject: [PATCH] Force ASpeed RAMDAC palette reset + +--- + drivers/gpu/drm/ast/ast_drv.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c +index 8124eaa92ed3..c44797598760 100644 +--- a/drivers/gpu/drm/ast/ast_drv.c ++++ b/drivers/gpu/drm/ast/ast_drv.c +@@ -35,7 +35,7 @@ + #include "ast_drv.h" + + static int ast_modeset = -1; +-int ast_resetpalette = -1; ++int ast_resetpalette = 1; + + MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); + MODULE_PARM_DESC(resetpalette, "Disable/Enable palette reset on load"); +-- +2.15.1 + + diff --git a/patches/linux-6.6.16-openpower/0005-powerpc-Add-gpr1-and-fpu-save-restore-functions.patch b/patches/linux-6.6.16-openpower/0005-powerpc-Add-gpr1-and-fpu-save-restore-functions.patch new file mode 100644 index 000000000..c19ab1795 --- /dev/null +++ b/patches/linux-6.6.16-openpower/0005-powerpc-Add-gpr1-and-fpu-save-restore-functions.patch @@ -0,0 +1,329 @@ +From f14d20a4aed3b87277557d1ba9ad589dbbdc0900 Mon Sep 17 00:00:00 2001 +From: Timothy Pearson +Date: Mon, 12 Feb 2024 10:26:49 -0600 +Subject: [PATCH] powerpc: Add gpr1 and fpu save/restore functions + +When building the kernel in size optimized mode with the amdgpu module enabled, +gcc will begin referencing external gpr1 and fpu save/restore functions. This +will then cause a linker failure as we do not link against libgcc which +normally contains those builtin functions. + +Implement gpr1 and fpu save/restore functions per the ABI v2 documentation. + +Tested on a Talos II with a WX7100 installed and running in DisplayCore mode. + +Reported-by: kernel test robot +Tested-by: Timothy Pearson +Signed-off-by: Timothy Pearson +--- + arch/powerpc/kernel/prom_init_check.sh | 4 +- + arch/powerpc/lib/crtsavres.S | 244 +++++++++++++++++++++++++ + scripts/mod/modpost.c | 4 + + 3 files changed, 250 insertions(+), 2 deletions(-) + +diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh +index 69623b9045d5..76c5651e29d3 100644 +--- a/arch/powerpc/kernel/prom_init_check.sh ++++ b/arch/powerpc/kernel/prom_init_check.sh +@@ -72,10 +72,10 @@ do + + # ignore register save/restore funcitons + case $UNDEF in +- _restgpr_*|_restgpr0_*|_rest32gpr_*) ++ _restgpr_*|_restgpr0_*|_restgpr1_*|_rest32gpr_*) + OK=1 + ;; +- _savegpr_*|_savegpr0_*|_save32gpr_*) ++ _savegpr_*|_savegpr0_*|_restgpr0_*|_save32gpr_*) + OK=1 + ;; + esac +diff --git a/arch/powerpc/lib/crtsavres.S b/arch/powerpc/lib/crtsavres.S +index 7e5e1c28e56a..6cd870aacd7f 100644 +--- a/arch/powerpc/lib/crtsavres.S ++++ b/arch/powerpc/lib/crtsavres.S +@@ -3,6 +3,7 @@ + * + * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc. + * Copyright 2008 Freescale Semiconductor, Inc. ++ * Copyright 2024 Raptor Engineering, LLC + * Written By Michael Meissner + * + * Based on gcc/config/rs6000/crtsavres.asm from gcc +@@ -435,6 +436,127 @@ _restgpr0_31: + mtlr r0 + blr + ++.globl _savegpr1_14 ++_savegpr1_14: ++ std r14,-144(r12) ++.globl _savegpr1_15 ++_savegpr1_15: ++ std r15,-136(r12) ++.globl _savegpr1_16 ++_savegpr1_16: ++ std r16,-128(r12) ++.globl _savegpr1_17 ++_savegpr1_17: ++ std r17,-120(r12) ++.globl _savegpr1_18 ++_savegpr1_18: ++ std r18,-112(r12) ++.globl _savegpr1_19 ++_savegpr1_19: ++ std r19,-104(r12) ++.globl _savegpr1_20 ++_savegpr1_20: ++ std r20,-96(r12) ++.globl _savegpr1_21 ++_savegpr1_21: ++ std r21,-88(r12) ++.globl _savegpr1_22 ++_savegpr1_22: ++ std r22,-80(r12) ++.globl _savegpr1_23 ++_savegpr1_23: ++ std r23,-72(r12) ++.globl _savegpr1_24 ++_savegpr1_24: ++ std r24,-64(r12) ++.globl _savegpr1_25 ++_savegpr1_25: ++ std r25,-56(r12) ++.globl _savegpr1_26 ++_savegpr1_26: ++ std r26,-48(r12) ++.globl _savegpr1_27 ++_savegpr1_27: ++ std r27,-40(r12) ++.globl _savegpr1_28 ++_savegpr1_28: ++ std r28,-32(r12) ++.globl _savegpr1_29 ++_savegpr1_29: ++ std r29,-24(r12) ++.globl _savegpr1_30 ++_savegpr1_30: ++ std r30,-16(r12) ++.globl _savegpr1_31 ++_savegpr1_31: ++ std r31,-8(r12) ++ std r0,16(r12) ++ blr ++ ++.globl _restgpr1_14 ++_restgpr1_14: ++ ld r14,-144(r12) ++.globl _restgpr1_15 ++_restgpr1_15: ++ ld r15,-136(r12) ++.globl _restgpr1_16 ++_restgpr1_16: ++ ld r16,-128(r12) ++.globl _restgpr1_17 ++_restgpr1_17: ++ ld r17,-120(r12) ++.globl _restgpr1_18 ++_restgpr1_18: ++ ld r18,-112(r12) ++.globl _restgpr1_19 ++_restgpr1_19: ++ ld r19,-104(r12) ++.globl _restgpr1_20 ++_restgpr1_20: ++ ld r20,-96(r12) ++.globl _restgpr1_21 ++_restgpr1_21: ++ ld r21,-88(r12) ++.globl _restgpr1_22 ++_restgpr1_22: ++ ld r22,-80(r12) ++.globl _restgpr1_23 ++_restgpr1_23: ++ ld r23,-72(r12) ++.globl _restgpr1_24 ++_restgpr1_24: ++ ld r24,-64(r12) ++.globl _restgpr1_25 ++_restgpr1_25: ++ ld r25,-56(r12) ++.globl _restgpr1_26 ++_restgpr1_26: ++ ld r26,-48(r12) ++.globl _restgpr1_27 ++_restgpr1_27: ++ ld r27,-40(r12) ++.globl _restgpr1_28 ++_restgpr1_28: ++ ld r28,-32(r12) ++.globl _restgpr1_29 ++_restgpr1_29: ++ ld r0,16(r12) ++ ld r29,-24(r12) ++ mtlr r0 ++ ld r30,-16(r12) ++ ld r31,-8(r12) ++ blr ++ ++.globl _restgpr1_30 ++_restgpr1_30: ++ ld r30,-16(r12) ++.globl _restgpr1_31 ++_restgpr1_31: ++ ld r0,16(r12) ++ ld r31,-8(r12) ++ mtlr r0 ++ blr ++ + #ifdef CONFIG_ALTIVEC + /* Called with r0 pointing just beyond the end of the vector save area. */ + +@@ -540,6 +662,128 @@ _restvr_31: + + #endif /* CONFIG_ALTIVEC */ + ++#ifdef CONFIG_PPC_FPU ++ ++.globl _savefpr_14 ++_savefpr_14: ++ stfd f14,-144(r1) ++.globl _savefpr_15 ++_savefpr_15: ++ stfd f15,-136(r1) ++.globl _savefpr_16 ++_savefpr_16: ++ stfd f16,-128(r1) ++.globl _savefpr_17 ++_savefpr_17: ++ stfd f17,-120(r1) ++.globl _savefpr_18 ++_savefpr_18: ++ stfd f18,-112(r1) ++.globl _savefpr_19 ++_savefpr_19: ++ stfd f19,-104(r1) ++.globl _savefpr_20 ++_savefpr_20: ++ stfd f20,-96(r1) ++.globl _savefpr_21 ++_savefpr_21: ++ stfd f21,-88(r1) ++.globl _savefpr_22 ++_savefpr_22: ++ stfd f22,-80(r1) ++.globl _savefpr_23 ++_savefpr_23: ++ stfd f23,-72(r1) ++.globl _savefpr_24 ++_savefpr_24: ++ stfd f24,-64(r1) ++.globl _savefpr_25 ++_savefpr_25: ++ stfd f25,-56(r1) ++.globl _savefpr_26 ++_savefpr_26: ++ stfd f26,-48(r1) ++.globl _savefpr_27 ++_savefpr_27: ++ stfd f27,-40(r1) ++.globl _savefpr_28 ++_savefpr_28: ++ stfd f28,-32(r1) ++.globl _savefpr_29 ++_savefpr_29: ++ stfd f29,-24(r1) ++.globl _savefpr_30 ++_savefpr_30: ++ stfd f30,-16(r1) ++.globl _savefpr_31 ++_savefpr_31: ++ stfd f31,-8(r1) ++ std r0, 16(r1) ++ blr ++ ++.globl _restfpr_14 ++_restfpr_14: ++ lfd f14,-144(r1) ++.globl _restfpr_15 ++_restfpr_15: ++ lfd f15,-136(r1) ++.globl _restfpr_16 ++_restfpr_16: ++ lfd f16,-128(r1) ++.globl _restfpr_17 ++_restfpr_17: ++ lfd f17,-120(r1) ++.globl _restfpr_18 ++_restfpr_18: ++ lfd f18,-112(r1) ++.globl _restfpr_19 ++_restfpr_19: ++ lfd f19,-104(r1) ++.globl _restfpr_20 ++_restfpr_20: ++ lfd f20,-96(r1) ++.globl _restfpr_21 ++_restfpr_21: ++ lfd f21,-88(r1) ++.globl _restfpr_22 ++_restfpr_22: ++ lfd f22,-80(r1) ++.globl _restfpr_23 ++_restfpr_23: ++ lfd f23,-72(r1) ++.globl _restfpr_24 ++_restfpr_24: ++ lfd f24,-64(r1) ++.globl _restfpr_25 ++_restfpr_25: ++ lfd f25,-56(r1) ++.globl _restfpr_26 ++_restfpr_26: ++ lfd f26,-48(r1) ++.globl _restfpr_27 ++_restfpr_27: ++ lfd f27,-40(r1) ++.globl _restfpr_28 ++_restfpr_28: ++ lfd f28,-32(r1) ++.globl _restfpr_29 ++_restfpr_29: ++ ld r0, 16(r1) ++ lfd f29,-24(r1) ++ mtlr r0 ++ lfd f30,-16(r1) ++ lfd f31,-8(r1) ++ blr ++.globl _restfpr_30 ++_restfpr_30: ++ lfd f30,-16(r1) ++.globl _restfpr_31 ++_restfpr_31: ++ ld r0, 16(r1) ++ lfd f31,-8(r1) ++ ++#endif /* CONFIG_PPC_FPU */ ++ + #endif /* CONFIG_PPC64 */ + + #endif +diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c +index 267b9a0a3abc..153a163ba3f7 100644 +--- a/scripts/mod/modpost.c ++++ b/scripts/mod/modpost.c +@@ -597,8 +597,12 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname) + /* Special register function linked on all modules during final link of .ko */ + if (strstarts(symname, "_restgpr0_") || + strstarts(symname, "_savegpr0_") || ++ strstarts(symname, "_restgpr1_") || ++ strstarts(symname, "_savegpr1_") || + strstarts(symname, "_restvr_") || + strstarts(symname, "_savevr_") || ++ strstarts(symname, "_restfpr_") || ++ strstarts(symname, "_savefpr_") || + strcmp(symname, ".TOC.") == 0) + return 1; + +-- +2.39.2 + diff --git a/patches/linux-6.6.16-openpower/0006-arch-powerpc-Kconfig-enable-inclusion-of-drivers-fir.patch b/patches/linux-6.6.16-openpower/0006-arch-powerpc-Kconfig-enable-inclusion-of-drivers-fir.patch new file mode 100644 index 000000000..95c566015 --- /dev/null +++ b/patches/linux-6.6.16-openpower/0006-arch-powerpc-Kconfig-enable-inclusion-of-drivers-fir.patch @@ -0,0 +1,24 @@ +From 6fca185285b3c355511885cdb4344a758550c9ba Mon Sep 17 00:00:00 2001 +From: Krystian Hebel +Date: Wed, 8 Mar 2023 13:53:10 +0100 +Subject: [PATCH 6/7] arch/powerpc/Kconfig: enable inclusion of + drivers/firmware + +Signed-off-by: Krystian Hebel +--- + arch/powerpc/Kconfig | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 2fe51e0ad..76cfc1277 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -1309,3 +1309,5 @@ config PPC_LIB_RHEAP + source "arch/powerpc/kvm/Kconfig" + + source "kernel/livepatch/Kconfig" ++ ++source "drivers/firmware/Kconfig" +-- +2.47.1 + diff --git a/patches/linux-6.6.16-openpower/0007-drivers-firmware-google-expose-CBMEM-as-sysfs-file.patch b/patches/linux-6.6.16-openpower/0007-drivers-firmware-google-expose-CBMEM-as-sysfs-file.patch new file mode 100644 index 000000000..107f72ff6 --- /dev/null +++ b/patches/linux-6.6.16-openpower/0007-drivers-firmware-google-expose-CBMEM-as-sysfs-file.patch @@ -0,0 +1,91 @@ +From 9cdaa84d65888ea288860426a70f36737a6640c6 Mon Sep 17 00:00:00 2001 +From: Krystian Hebel +Date: Tue, 28 Mar 2023 18:31:21 +0200 +Subject: [PATCH 7/7] drivers/firmware/google: expose CBMEM as sysfs file + +Signed-off-by: Krystian Hebel +--- + drivers/firmware/google/Kconfig | 8 ++++++ + drivers/firmware/google/coreboot_table.c | 33 ++++++++++++++++++++++++ + 2 files changed, 41 insertions(+) + +diff --git a/drivers/firmware/google/Kconfig b/drivers/firmware/google/Kconfig +index 41b78f5cb..cb0443f9c 100644 +--- a/drivers/firmware/google/Kconfig ++++ b/drivers/firmware/google/Kconfig +@@ -44,6 +44,14 @@ config GOOGLE_COREBOOT_TABLE + device tree node /firmware/coreboot. + If unsure say N. + ++config GOOGLE_COREBOOT_CBMEM ++ bool "Expose CBMEM as file" ++ depends on GOOGLE_COREBOOT_TABLE ++ help ++ This option exposes raw contents of coreboot's CBMEM to be consumed ++ by userspace tools. Path to file: /sys/firmware/cbmem. ++ If unsure say N. ++ + config GOOGLE_MEMCONSOLE + tristate + depends on GOOGLE_MEMCONSOLE_X86_LEGACY || GOOGLE_MEMCONSOLE_COREBOOT +diff --git a/drivers/firmware/google/coreboot_table.c b/drivers/firmware/google/coreboot_table.c +index 33ae94745..06d6db594 100644 +--- a/drivers/firmware/google/coreboot_table.c ++++ b/drivers/firmware/google/coreboot_table.c +@@ -81,6 +81,18 @@ void coreboot_driver_unregister(struct coreboot_driver *driver) + } + EXPORT_SYMBOL(coreboot_driver_unregister); + ++#ifdef CONFIG_GOOGLE_COREBOOT_CBMEM ++static ssize_t cbmem_read(struct file *filp, struct kobject *kobp, ++ struct bin_attribute *bin_attr, char *buf, ++ loff_t pos, size_t count) ++{ ++ return memory_read_from_buffer(buf, count, &pos, ++ bin_attr->private, bin_attr->size); ++} ++ ++static BIN_ATTR_RO(cbmem, 0); ++#endif ++ + static int coreboot_table_populate(struct device *dev, void *ptr) + { + int i, ret; +@@ -167,6 +179,20 @@ static int coreboot_table_probe(struct platform_device *pdev) + + memunmap(ptr); + ++#ifdef CONFIG_GOOGLE_COREBOOT_CBMEM ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 1); ++ if (res && res->start && res->end && resource_size(res)) { ++ bin_attr_cbmem.size = resource_size(res); ++ bin_attr_cbmem.private = memremap(res->start, ++ resource_size(res), ++ MEMREMAP_WB); ++ if (sysfs_create_bin_file(firmware_kobj, &bin_attr_cbmem)) { ++ bin_attr_cbmem.size = 0; ++ bin_attr_cbmem.private = NULL; ++ } ++ } ++#endif ++ + return ret; + } + +@@ -178,6 +204,13 @@ static int __cb_dev_unregister(struct device *dev, void *dummy) + + static int coreboot_table_remove(struct platform_device *pdev) + { ++#ifdef CONFIG_GOOGLE_COREBOOT_CBMEM ++ if (bin_attr_cbmem.private) { ++ sysfs_remove_bin_file(firmware_kobj, &bin_attr_cbmem); ++ memunmap(bin_attr_cbmem.private); ++ } ++#endif ++ + bus_for_each_dev(&coreboot_bus_type, NULL, NULL, __cb_dev_unregister); + return 0; + } +-- +2.47.1 + diff --git a/patches/lvm2-2.03.23.patch b/patches/lvm2-2.03.23.patch new file mode 100644 index 000000000..587e1bb69 --- /dev/null +++ b/patches/lvm2-2.03.23.patch @@ -0,0 +1,150 @@ +--- ./lib/mm/memlock.c.orig 2023-11-27 13:52:46.281000000 -0500 ++++ ./lib/mm/memlock.c 2023-11-27 13:56:35.656000000 -0500 +@@ -160,6 +160,7 @@ + + static void _allocate_memory(void) + { ++#if 0 + #if defined(__GLIBC__) && !defined(VALGRIND_POOL) + /* Memory allocation is currently only tested with glibc + * for different C libraries, some other mechanisms might be needed +@@ -233,11 +234,14 @@ + for (i = 0; i < area; ++i) + free(areas[i]); + #endif ++#endif + } + + static void _release_memory(void) + { ++#if 0 + free(_malloc_mem); ++#endif + } + + /* +@@ -313,7 +317,7 @@ + + if (lock == LVM_MLOCK) { + if (mlock((const void*)from, sz) < 0) { +- log_sys_error("mlock", line); ++ //log_sys_error("mlock", line); + return 0; + } + } else { +--- ./libdm/libdm-stats.c.orig 2023-11-27 13:59:40.677000000 -0500 ++++ ./libdm/libdm-stats.c 2023-11-27 14:07:28.655000000 -0500 +@@ -18,7 +18,23 @@ + #include "libdm/misc/dmlib.h" + #include "libdm/misc/kdev_t.h" + ++#if 0 + #include "math.h" /* log10() */ ++#else ++static int ilog10(double x) ++{ ++ int e = 0; ++ ++ while(x > 10) ++ { ++ e++; ++ x = x / 10; ++ } ++ ++ return e; ++} ++#endif ++ + + #include + #include +@@ -556,7 +572,12 @@ + while(entry >= bins) { + value = (double) (entry--)->upper; + /* Use lround to avoid size_t -> double cast warning. */ ++#if 0 + hist_len += 1 + (size_t) lround(log10(value / scale)); ++#else ++ hist_len += 1 + ilog10(value / scale); ++#endif ++ + if (entry != bins) + hist_len++; /* ',' */ + } +@@ -1863,7 +1884,12 @@ + i = dm_bit_get_first(regions); + for (; i >= 0; i = dm_bit_get_next(regions, i)) { + /* length of region_id or range start in characters */ ++#if 0 + id_len = (i) ? 1 + (size_t) log10(i) : 1; ++#else ++ id_len = (i) ? 1 + ilog10(i) : 1; ++#endif ++ + buflen += id_len; + j = i; + do +@@ -1878,7 +1904,11 @@ + /* handle range */ + if (i != j) { + /* j is always > i, which is always >= 0 */ ++#if 0 + id_len = 1 + (size_t) log10(j); ++#else ++ id_len = 1 + ilog10(j); ++#endif + buflen += id_len + 1; /* range end plus "-" */ + } + buflen++; + +--- ./tools/lvmcmdline.c.orig 2023-11-27 14:12:46.649000000 -0500 ++++ ./tools/lvmcmdline.c 2023-11-27 14:15:47.563000000 -0500 +@@ -3438,7 +3438,7 @@ + static int _check_standard_fds(void) + { + int err = is_valid_fd(STDERR_FILENO); +- ++#if 0 + if (!is_valid_fd(STDIN_FILENO) && + !(stdin = fopen(_PATH_DEVNULL, "r"))) { + if (err) +@@ -3463,7 +3463,7 @@ + strerror(errno)); + return 0; + } +- ++#endif + return 1; + } + +@@ -3644,7 +3644,7 @@ + */ + dm_set_name_mangling_mode(DM_STRING_MANGLING_NONE); + +- if (!(cmd = create_toolcontext(0, NULL, 1, threaded, set_connections, set_filters))) { ++ if (!(cmd = create_toolcontext(0, NULL, 0, threaded, set_connections, set_filters))) { + return_NULL; + } + +--- ./make.tmpl.orig 2023-11-28 13:29:11.744000000 -0500 ++++ ./make.tmpl.in 2023-11-28 13:29:36.716000000 -0500 +@@ -210,7 +210,7 @@ + M_INSTALL_PROGRAM = -m 555 + M_INSTALL_DATA = -m 444 + endif +-INSTALL_PROGRAM = $(INSTALL) $(M_INSTALL_PROGRAM) $(STRIP) ++INSTALL_PROGRAM = $(INSTALL) $(M_INSTALL_PROGRAM) + INSTALL_DATA = $(INSTALL) -p $(M_INSTALL_DATA) + INSTALL_WDATA = $(INSTALL) -p -m 644 + +--- ./libdm/make.tmpl.orig 2023-11-28 13:29:52.760000000 -0500 ++++ ./libdm/make.tmpl.in 2023-11-28 13:30:22.336000000 -0500 +@@ -173,7 +173,7 @@ + M_INSTALL_PROGRAM = -m 555 + M_INSTALL_DATA = -m 444 + endif +-INSTALL_PROGRAM = $(INSTALL) $(M_INSTALL_PROGRAM) $(STRIP) ++INSTALL_PROGRAM = $(INSTALL) $(M_INSTALL_PROGRAM) + INSTALL_DATA = $(INSTALL) -p $(M_INSTALL_DATA) + INSTALL_WDATA = $(INSTALL) -p -m 644 + diff --git a/patches/newt-0.52.20.patch b/patches/newt-0.52.24.patch similarity index 100% rename from patches/newt-0.52.20.patch rename to patches/newt-0.52.24.patch diff --git a/patches/openssl-3.0.8.patch b/patches/openssl-3.0.8.patch new file mode 100644 index 000000000..db4e79e4d --- /dev/null +++ b/patches/openssl-3.0.8.patch @@ -0,0 +1,35 @@ +--- ./util/mkbuildinf.pl.orig 2023-02-07 08:43:33.000000000 -0500 ++++ ./util/mkbuildinf.pl 2024-03-27 14:36:49.974651246 -0400 +@@ -12,7 +12,7 @@ + my ($cflags, $platform) = @ARGV; + $cflags = "compiler: $cflags"; + +-my $date = gmtime($ENV{'SOURCE_DATE_EPOCH'} || time()) . " UTC"; ++my $date = gmtime($ENV{'SOURCE_DATE_EPOCH'} || '0') . " UTC"; + + print <<"END_OUTPUT"; + /* +@@ -36,21 +36,7 @@ + * literal + */ + static const char compiler_flags[] = { +-END_OUTPUT +- +-my $ctr = 0; +-foreach my $c (split //, $cflags) { +- $c =~ s|([\\'])|\\$1|; +- # Max 16 characters per line +- if (($ctr++ % 16) == 0) { +- if ($ctr != 1) { +- print "\n"; +- } +- print " "; +- } +- print "'$c',"; +-} +-print <<"END_OUTPUT"; +-'\\0' ++ 'r','e','p','r','o','d','u','c','i','b','l','e',' ','b','u','i', ++ 'l','d','\\0' + }; + END_OUTPUT diff --git a/patches/slang-2.3.3/unhardcode-ln-in-Makefile.patch b/patches/slang-2.3.3/unhardcode-ln-in-Makefile.patch new file mode 100644 index 000000000..590e06915 --- /dev/null +++ b/patches/slang-2.3.3/unhardcode-ln-in-Makefile.patch @@ -0,0 +1,13 @@ +diff --git a/src/Makefile.in b/src/Makefile.in +index 7fe4dc2..38fe174 100644 +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -75,7 +75,7 @@ RM = rm -f + RM_R = rm -rf + AR_CR = ar cr + RMDIR = rmdir +-LN = /bin/ln -sf ++LN = ln -sf + CP = cp + @SET_MAKE@ + #--------------------------------------------------------------------------- diff --git a/patches/tpm2-tools-5.2.patch b/patches/tpm2-tools-5.2.patch deleted file mode 100644 index f4720f230..000000000 --- a/patches/tpm2-tools-5.2.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff --git a/Makefile.am b/Makefile.am -index 7132215..32e2193 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -93,7 +93,7 @@ tss2_tools = \ - - # Bundle all the tools into a single program similar to busybox - bin_PROGRAMS += tools/tpm2 --tools_tpm2_LDADD = $(LDADD) $(CURL_LIBS) -+tools_tpm2_LDADD = $(LDADD) - tools_tpm2_CFLAGS = $(AM_CFLAGS) -DTPM2_TOOLS_MAX="$(words $(tpm2_tools))" - tools_tpm2_SOURCES = \ - tools/tpm2_tool.c \ -@@ -127,7 +127,6 @@ tpm2_tools = \ - tools/tpm2_encryptdecrypt.c \ - tools/tpm2_evictcontrol.c \ - tools/tpm2_flushcontext.c \ -- tools/tpm2_getekcertificate.c \ - tools/tpm2_getrandom.c \ - tools/tpm2_gettime.c \ - tools/tpm2_hash.c \ -diff --git a/configure.ac b/configure.ac -index f1c1711..7279baa 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -59,7 +59,6 @@ PKG_CHECK_MODULES([TSS2_MU], [tss2-mu]) - PKG_CHECK_MODULES([TSS2_RC], [tss2-rc]) - PKG_CHECK_MODULES([TSS2_SYS], [tss2-sys]) - PKG_CHECK_MODULES([CRYPTO], [libcrypto >= 1.1.0]) --PKG_CHECK_MODULES([CURL], [libcurl]) - - # pretty print of devicepath if efivar library is present - PKG_CHECK_MODULES([EFIVAR], [efivar],,[true]) diff --git a/patches/tpm2-tools-5.6.patch b/patches/tpm2-tools-5.6.patch new file mode 100644 index 000000000..991d0791c --- /dev/null +++ b/patches/tpm2-tools-5.6.patch @@ -0,0 +1,42 @@ +--- ./bootstrap.orig 2023-11-08 02:19:36.000000000 -0500 ++++ ./bootstrap 2024-04-03 12:18:46.722995465 -0400 +@@ -5,7 +5,7 @@ + + # Generate a VERSION file that is included in the dist tarball to avoid needed git + # when calling autoreconf in a release tarball. +-git describe --tags --always --dirty > VERSION ++#git describe --tags --always --dirty > VERSION + + # generate list of source files for use in Makefile.am + # if you add new source files, you must run ./bootstrap again +diff --git a/Makefile.am b/Makefile.am +index 7132215..32e2193 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -93,7 +93,7 @@ tss2_tools = \ + + # Bundle all the tools into a single program similar to busybox + bin_PROGRAMS += tools/tpm2 +-tools_tpm2_LDADD = $(LDADD) $(CURL_LIBS) ++tools_tpm2_LDADD = $(LDADD) + tools_tpm2_CFLAGS = $(AM_CFLAGS) -DTPM2_TOOLS_MAX="$(words $(tpm2_tools))" + tools_tpm2_SOURCES = \ + tools/tpm2_tool.c \ +@@ -127,7 +127,6 @@ tpm2_tools = \ + tools/tpm2_encryptdecrypt.c \ + tools/tpm2_evictcontrol.c \ + tools/tpm2_flushcontext.c \ +- tools/tpm2_getekcertificate.c \ + tools/tpm2_getrandom.c \ + tools/tpm2_gettime.c \ + tools/tpm2_hash.c \ +--- ./configure.ac.orig 2023-11-08 02:19:36.000000000 -0500 ++++ ./configure.ac 2024-04-02 12:05:00.270985575 -0400 +@@ -80,7 +80,6 @@ + AC_CHECK_LIB(crypto, [EVP_sm4_cfb128], [ + AC_DEFINE([HAVE_EVP_SM4_CFB], [1], [Support EVP_sm4_cfb in openssl])], + []) +-PKG_CHECK_MODULES([CURL], [libcurl]) + + # pretty print of devicepath if efivar library is present + # auto detect if not specified via the --with-efivar option. diff --git a/patches/tpm2-tss-3.2.0.patch b/patches/tpm2-tss-3.2.2.patch similarity index 100% rename from patches/tpm2-tss-3.2.0.patch rename to patches/tpm2-tss-3.2.2.patch diff --git a/patches/util-linux-2.29.2.patch b/patches/util-linux-2.29.2.patch deleted file mode 100644 index 5a54b26ff..000000000 --- a/patches/util-linux-2.29.2.patch +++ /dev/null @@ -1,139 +0,0 @@ ---- ./configure 2017-02-22 07:07:46.595740152 -0500 -+++ ./configure 2023-02-27 13:34:27.068000000 -0500 -@@ -13408,7 +13408,7 @@ - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no -- hardcode_into_libs=yes -+ hardcode_into_libs=no - if test ia64 = "$host_cpu"; then - # AIX 5 supports IA64 - library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' -@@ -13698,16 +13698,16 @@ - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - esac - ;; -@@ -13722,7 +13722,7 @@ - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - - hpux9* | hpux10* | hpux11*) -@@ -13734,7 +13734,7 @@ - case $host_cpu in - ia64*) - shrext_cmds='.so' -- hardcode_into_libs=yes -+ hardcode_into_libs=no - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. -@@ -13750,7 +13750,7 @@ - ;; - hppa*64*) - shrext_cmds='.sl' -- hardcode_into_libs=yes -+ hardcode_into_libs=no - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. -@@ -13783,7 +13783,7 @@ - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - - irix5* | irix6* | nonstopux*) -@@ -13820,7 +13820,7 @@ - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" - sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - - # No shared lib support for Linux oldld, aout, or coff. -@@ -13841,7 +13841,7 @@ - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. -- hardcode_into_libs=yes -+ hardcode_into_libs=no - - dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. -@@ -13896,7 +13896,7 @@ - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. -- hardcode_into_libs=yes -+ hardcode_into_libs=no - - # Add ABI-specific directories to the system library path. - sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" -@@ -13936,7 +13936,7 @@ - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - - newsos6) -@@ -13954,7 +13954,7 @@ - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no -- hardcode_into_libs=yes -+ hardcode_into_libs=no - dynamic_linker='ldqnx.so' - ;; - -@@ -14026,7 +14026,7 @@ - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes -- hardcode_into_libs=yes -+ hardcode_into_libs=no - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; -@@ -14083,7 +14083,7 @@ - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes -- hardcode_into_libs=yes -+ hardcode_into_libs=no - if test yes = "$with_gnu_ld"; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else -@@ -14105,7 +14105,7 @@ - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no -- hardcode_into_libs=yes -+ hardcode_into_libs=no - ;; - - uts4*) diff --git a/patches/util-linux-2.39.patch b/patches/util-linux-2.39.patch new file mode 100644 index 000000000..e39fcfc58 --- /dev/null +++ b/patches/util-linux-2.39.patch @@ -0,0 +1,276 @@ +--- ./configure.orig 2023-05-17 06:53:16.721284360 -0400 ++++ ./configure 2023-11-28 13:57:50.012000000 -0500 +@@ -16580,7 +16580,7 @@ + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' +@@ -16870,16 +16870,16 @@ + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + esac + ;; +@@ -16894,7 +16894,7 @@ + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + hpux9* | hpux10* | hpux11*) +@@ -16906,7 +16906,7 @@ + case $host_cpu in + ia64*) + shrext_cmds='.so' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +@@ -16922,7 +16922,7 @@ + ;; + hppa*64*) + shrext_cmds='.sl' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +@@ -16955,7 +16955,7 @@ + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + irix5* | irix6* | nonstopux*) +@@ -16992,7 +16992,7 @@ + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + # No shared lib support for Linux oldld, aout, or coff. +@@ -17013,7 +17013,7 @@ + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. +- hardcode_into_libs=yes ++ hardcode_into_libs=no + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. +@@ -17071,7 +17071,7 @@ + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. +- hardcode_into_libs=yes ++ hardcode_into_libs=no + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" +@@ -17111,7 +17111,7 @@ + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + newsos6) +@@ -17129,7 +17129,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker='ldqnx.so' + ;; + +@@ -17201,7 +17201,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; +@@ -17258,7 +17258,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else +@@ -17280,7 +17280,7 @@ + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + uts4*) +@@ -20574,7 +20574,7 @@ + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' +@@ -20862,16 +20862,16 @@ + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + esac + ;; +@@ -20886,7 +20886,7 @@ + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + hpux9* | hpux10* | hpux11*) +@@ -20898,7 +20898,7 @@ + case $host_cpu in + ia64*) + shrext_cmds='.so' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +@@ -20914,7 +20914,7 @@ + ;; + hppa*64*) + shrext_cmds='.sl' +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +@@ -20947,7 +20947,7 @@ + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + irix5* | irix6* | nonstopux*) +@@ -20984,7 +20984,7 @@ + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + # No shared lib support for Linux oldld, aout, or coff. +@@ -21005,7 +21005,7 @@ + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. +- hardcode_into_libs=yes ++ hardcode_into_libs=no + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. +@@ -21063,7 +21063,7 @@ + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. +- hardcode_into_libs=yes ++ hardcode_into_libs=no + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" +@@ -21103,7 +21103,7 @@ + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + newsos6) +@@ -21121,7 +21121,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + dynamic_linker='ldqnx.so' + ;; + +@@ -21193,7 +21193,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; +@@ -21250,7 +21250,7 @@ + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ hardcode_into_libs=no + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else +@@ -21272,7 +21272,7 @@ + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +- hardcode_into_libs=yes ++ hardcode_into_libs=no + ;; + + uts4*) diff --git a/site-local/config b/site-local/config new file mode 100644 index 000000000..674ecd9f8 --- /dev/null +++ b/site-local/config @@ -0,0 +1,7 @@ +BRAND_NAME=Dasharo + +ifeq "novacustom-nv4x_adl" "$(BOARD)" + +export CONFIG_COREBOOT_LOCALVERSION="\(coreboot+heads\) v0.9.2" + +endif diff --git a/targets/optiplex_blobs.mk b/targets/optiplex_blobs.mk new file mode 100644 index 000000000..d5af9e281 --- /dev/null +++ b/targets/optiplex_blobs.mk @@ -0,0 +1,13 @@ +# Targets for downloading optiplex 7010/9010 blobs: including ACM, SINIT and EC blobs + +REQUIRED_BLOBS := \ + $(pwd)/blobs/xx30/IVB_BIOSAC_PRODUCTION.bin \ + $(pwd)/blobs/xx30/SNB_IVB_SINIT_20190708_PW.bin \ + $(pwd)/blobs/xx30/sch5545_ecfw.bin + +# Make the Coreboot build depend on the required blobs +$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: $(REQUIRED_BLOBS) + +# Rule to generate all required blobs +$(REQUIRED_BLOBS): + $(pwd)/blobs/xx30/optiplex_7010_9010.sh $(pwd)/blobs/xx30 diff --git a/targets/qemu.md b/targets/qemu.md index 0dfdd63e3..1587fa882 100644 --- a/targets/qemu.md +++ b/targets/qemu.md @@ -1,4 +1,4 @@ -qemu-coreboot-(fb)whiptail-tpm[1,2](-hotp) boards +qemu-coreboot-(fb)whiptail-tpmX(-hotp) boards === The `qemu-coreboot-fbwhiptail-tpm1-hotp` configuration (and their variants) permits testing of most features of Heads. @@ -87,3 +87,14 @@ swtpm on Debian bookworm === 1. Install dependencies * `sudo apt install swtpm swtpm-tools` + +swtpm on nix docker image +=== +Nothing to do. Everything needed is in the docker image. + +Just make sure to pass DISPLAY environement variable on your docker command line. eg: +* Remotely downloaded docker image (doing make command only inside of docker example): + * `docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=qemu-coreboot-whiptail-tpm2` + * `docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=qemu-coreboot-whiptail-tpm2 run` +* Locally created docker image from nix develop environment (jumping into docker image variation of the above, where developer does what he wants within): + * `docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env` diff --git a/targets/qemu.mk b/targets/qemu.mk index 930afa7b3..5520ebcdf 100644 --- a/targets/qemu.mk +++ b/targets/qemu.mk @@ -16,7 +16,7 @@ endif ifeq "$(CONFIG_TPM2_TSS)" "y" SWTPM_TPMVER := --tpm2 -SWTPM_PRESETUP := swtpm_setup --create-config-files skip-if-exist +SWTPM_PRESETUP := swtpm_setup --create-config-files root,skip-if-exist else # TPM1 is the default SWTPM_TPMVER := @@ -26,6 +26,7 @@ endif #borrowed from https://github.com/orangecms/webboot/blob/boot-via-qemu/run-webboot.sh TPMDIR=$(build)/$(BOARD)/vtpm +CANOKEY_DIR=$(build)/$(BOARD) $(TPMDIR)/.manufacture: mkdir -p "$(TPMDIR)" $(SWTPM_PRESETUP) @@ -44,7 +45,7 @@ $(MEMORY_SIZE_FILE): @echo "$(QEMU_MEMORY_SIZE)" >"$(MEMORY_SIZE_FILE)" USB_FD_IMG=$(build)/$(BOARD)/usb_fd.raw $(USB_FD_IMG): - dd if=/dev/zero bs=1M of="$(USB_FD_IMG)" bs=1M count=256 + dd if=/dev/zero bs=1M of="$(USB_FD_IMG)" bs=1M count=256 >/dev/null 2>&1 # Debian obnoxiously does not include /usr/sbin in PATH for non-root, even # though it is meaningful to use mkfs.vfat (etc.) as non-root MKFS_VFAT=mkfs.vfat; \ @@ -74,6 +75,10 @@ else ifeq "$(USB_TOKEN)" "LibremKey" QEMU_USB_TOKEN_DEV := -device usb-host,vendorid=12653,productid=19531 else ifneq "$(USB_TOKEN)" "" QEMU_USB_TOKEN_DEV := -device "usb-host,$(USB_TOKEN)" +# If no USB token is specified, support canokey by default +else +# official instruction -usb -device canokey,file=$HOME/.canokey-file -device canokey +QEMU_USB_TOKEN_DEV := -usb -device canokey,file=$(CANOKEY_DIR)/.canokey-file endif run: $(TPMDIR)/.manufacture $(ROOT_DISK_IMG) $(MEMORY_SIZE_FILE) $(USB_FD_IMG) @@ -88,7 +93,7 @@ run: $(TPMDIR)/.manufacture $(ROOT_DISK_IMG) $(MEMORY_SIZE_FILE) $(USB_FD_IMG) -qemu-system-x86_64 -drive file="$(ROOT_DISK_IMG)",if=virtio \ --machine q35,accel=kvm:tcg \ -rtc base=utc \ - -smp "$$(nproc)" \ + -smp 1 \ -vga std \ -m "$$(cat "$(MEMORY_SIZE_FILE)")" \ -serial stdio \ diff --git a/targets/split_8mb4mb.mk b/targets/split_8mb4mb.mk index 473c41bc0..f6e8e7fa0 100644 --- a/targets/split_8mb4mb.mk +++ b/targets/split_8mb4mb.mk @@ -7,12 +7,24 @@ # # When flashing via an external programmer it is easiest to have # two separate files for these pieces. -all: $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom -$(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom: $(board_build)/$(CB_OUTPUT_FILE) - $(call do,DD 8MB,$@,dd of=$@ if=$< bs=65536 count=128 skip=0 status=none) - @sha256sum $@ | tee -a "$(HASHES)" +all: bottom top -all: $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom -$(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom: $(board_build)/$(CB_OUTPUT_FILE) - $(call do,DD 4MB,$@,dd of=$@ if=$< bs=65536 count=64 skip=128 status=none) - @sha256sum $@ | tee -a "$(HASHES)" +bottom: $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom + +$(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom: $(board_build)/$(CB_OUTPUT_FILE) FORCE + @rm -f $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom + $(call do,DD 8MB,$(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom,dd if=$< of=$@ bs=65536 count=128 skip=0 status=none) + @sha256sum $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom | tee -a "$(HASHES)" + @stat -c "%8s:%n" $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-bottom.rom | tee -a "$(SIZES)" + +top: $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom + +$(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom: $(board_build)/$(CB_OUTPUT_FILE) FORCE + @rm -f $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom + $(call do,DD 4MB,$(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom,dd if=$< of=$@ bs=65536 count=64 skip=128 status=none) + @sha256sum $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom | tee -a "$(HASHES)" + @stat -c "%8s:%n" $(board_build)/heads-$(BOARD)-$(HEADS_GIT_VERSION)-top.rom | tee -a "$(SIZES)" + +FORCE: + +.PHONY: all bottom top FORCE diff --git a/targets/xx80_me_blobs.mk b/targets/xx80_me_blobs.mk new file mode 100644 index 000000000..ebc32bd40 --- /dev/null +++ b/targets/xx80_me_blobs.mk @@ -0,0 +1,21 @@ +# Targets for downloading xx80 ME blob, neutering it and deactivating ME. +# This also uses the deguard tool to bypass Intel Boot Guard exploiting CVE-2017-5705. +# See https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00086.html + +# xx80-*-maximized boards require of you initially call one of the +# following to have gbe.bin ifd.bin and me.bin +# - blobs/xx80/download_clean_me_and_deguard.sh +# To download Lenovo original ME binary, neuter+deactivate ME, produce +# reduced IFD ME region and expanded BIOS IFD region. +# Also creates the tb.bin blob to flash the Thunderbolt SPI. + +# Make the Coreboot build depend on the following 3rd party blobs: +$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ + $(pwd)/blobs/xx80/me.bin $(pwd)/blobs/xx80/tb.bin $(build)/$(BOARD)/tb.bin + +$(pwd)/blobs/xx80/me.bin $(pwd)/blobs/xx80/tb.bin &: + $(pwd)/blobs/xx80/download_clean_deguard_me_pad_tb.sh \ + -m $(pwd)/blobs/utils/me_cleaner/me_cleaner.py $(pwd)/blobs/xx80 + +$(build)/$(BOARD)/tb.bin: $(pwd)/blobs/xx80/tb.bin + cp $(pwd)/blobs/xx80/tb.bin $(build)/$(BOARD) diff --git a/unmaintained_boards/README.md b/unmaintained_boards/README.md new file mode 100644 index 000000000..b78ef5e5c --- /dev/null +++ b/unmaintained_boards/README.md @@ -0,0 +1,13 @@ +Boards listed under this directory are not made available from CircleCI. No .rom file is available for endusers. This is protecting as good as possible regular endusers from having to open up their devices and having to own a SPI-clip and a external flasher. +After core changes in coreboot or heads, known testers with external flasher are asked to test a new release and report if their system is starting up fine. If those known testers do not respond, a .rom id made available from CircleCI to the public with addition in filename UNTESTED_ . This invite people with external flasher that could recover a not booting system to report if the release is working fine. +Warning: Do not try to use UNTESTED_ images if you do not have a external flasher. + +After about a month passes by and there is still no report if the system is starting up fine with the new release, the device is moved to this directory to stop building UNTESTED_ images. Reason for this is because there are always users ignoring all warnings and then asking questions like how to recover a not starting system without external programmer. + +To get a device out of this directory and make it at available from CircleCI again, open up a issue here https://github.com/linuxboot/heads/issues and ask for a build for the specific device you like to test or build it youself. When building it yourself, please dont forget to report a working state. + +The additional name UNMAINTAINED_ is added to the device name, when maintanance is known needed. +When device is UNTESTED_ and someone test and report a not booting image, the device get as soon as possibe moved to this directory and changed from UNTESTED_ to UNMAINTAINED_. Its then tested and not working. + +When a device have just the addition UNMAINTAINED_ but is not in this directory and there are CircleCI .rom files available to the endusers, then its tested starting up the system but have some problems like for example not working Network card and there is no maintainer to fix the problem. +If a UNMAINTAINED_ device dont get tested on a new release, it follow up the same UNTESTED_ procedure like described above and have UNMAINTAINED_UNTESTED_ in the name. diff --git a/boards/UNTESTED_p8z77-m_pro-tpm1-hotp-maximized/UNTESTED_p8z77-m_pro-tpm1-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-hotp-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-hotp-maximized.config similarity index 100% rename from boards/UNTESTED_p8z77-m_pro-tpm1-hotp-maximized/UNTESTED_p8z77-m_pro-tpm1-hotp-maximized.config rename to unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-hotp-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-hotp-maximized.config diff --git a/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config similarity index 95% rename from boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config rename to unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config index 2ac199768..458e978a0 100644 --- a/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config @@ -39,11 +39,11 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config CONFIG_COREBOOT_CONFIG=config/coreboot-p8z77-m_pro-tpm1.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -65,6 +65,7 @@ CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init @@ -72,9 +73,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="P8Z77-M PRO" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #Set this option to zero out the VSCC table https://github.com/osresearch/heads/pull/1358#discussion_r1153251399 export CONFIG_ZERO_IFD_VSCC=y diff --git a/boards/UNTESTED_qemu-linuxboot/UNTESTED_qemu-linuxboot.config b/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config similarity index 95% rename from boards/UNTESTED_qemu-linuxboot/UNTESTED_qemu-linuxboot.config rename to unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config index c47edd571..32beb6741 100644 --- a/boards/UNTESTED_qemu-linuxboot/UNTESTED_qemu-linuxboot.config +++ b/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config @@ -18,7 +18,7 @@ CONFIG_QRENCODE=y CONFIG_TPMTOTP=y endif -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -37,7 +37,6 @@ export CONFIG_BOOTSCRIPT_NETWORK=/bin/network-init-recovery export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOOT_STATIC_IP=10.0.2.15 # You can ssh into the qemu instance by running diff --git a/boards/UNTESTED_t420/UNTESTED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config similarity index 77% rename from boards/UNTESTED_t420/UNTESTED_t420.config rename to unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index db2917e05..a4d2c6fd4 100644 --- a/boards/UNTESTED_t420/UNTESTED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -1,13 +1,13 @@ # Configuration for a t420 running Qubes 4.1 and other OS, X220 is identical to X230 on the Linux Side of things. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -32,6 +32,5 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad T420" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq --ifd --image bios" diff --git a/boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config similarity index 90% rename from boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-hotp-legacy.config rename to unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config index 1c7c527ea..93001f92e 100644 --- a/boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config @@ -8,8 +8,8 @@ # Addition vs standard x230 board config: # HOTP_KEY: HOTP challenge for currently supported USB Security dongles export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-legacy.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config @@ -19,7 +19,7 @@ CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=n CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -61,9 +61,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T430-hotp-legacy" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" # This board has two SPI flash chips, an 8 MB that holds the IFD, # the ME image and part of the coreboot image, and a 4 MB one that diff --git a/boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config similarity index 82% rename from boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config rename to unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config index 3a7312a50..d0f6fbfee 100644 --- a/boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config @@ -4,15 +4,15 @@ # IDEALLY you should flash maximized top and bottom rom images exteranlly once instead. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy-flash.config CONFIG_LINUX_CONFIG=config/linux-x230-flash.config #Add bare minimal tools for flashing boards CONFIG_BASH=n -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_ZSTD=n #CONFIG_GPG=y #CONFIG_FLASHTOOLS=y @@ -28,7 +28,7 @@ CONFIG_LINUX_USB=y export CONFIG_BOOTSCRIPT=/bin/xx30-flash.init export CONFIG_BOARD_NAME="ThinkPad T430-legacy-flash" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config similarity index 89% rename from boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config rename to unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config index 367b1573e..09a254988 100644 --- a/boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config @@ -5,8 +5,8 @@ # dropbear support(ssh client/server) # e1000e (ethernet driver) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-legacy.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config @@ -16,7 +16,7 @@ CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=n CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -55,9 +55,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T430-legacy" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" # This board has two SPI flash chips, an 8 MB that holds the IFD, # the ME image and part of the coreboot image, and a 4 MB one that diff --git a/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config similarity index 89% rename from boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config rename to unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index cd3752942..8d6dd05be 100644 --- a/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -5,8 +5,8 @@ # - Forged 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx20/extract.sh) # - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t520-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -14,9 +14,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -60,9 +61,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad T520-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config similarity index 89% rename from boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config rename to unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index f23da0aa4..7346163f8 100644 --- a/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -5,8 +5,8 @@ # - Forged 00:DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx20/extract.sh) # - Note that this MAC address can be modified under build/coreboot-VER/util/bincfg/gbe-82579LM.set export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t520-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -14,9 +14,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -59,9 +60,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad T520-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config similarity index 93% rename from boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config rename to unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config index 2bee0e424..61084c020 100644 --- a/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a t530 with a dGPU. Initialization of the dGPU is necessary in order to use an external monitor via the DisplayPort (either the in-built mini-DisplayPort or the DisplayPort in the dock). In order to build this the relevant script in the blobs directory must be run (or self-pulled roms placed in that directory) and after building the rom, the nvramtool must be run on the 12MB rom to change the default graphics mode away from integrated-only graphics (see README_vbios in the blobs directory). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-dgpu-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -64,9 +65,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T530-dgpu-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config similarity index 93% rename from boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config rename to unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config index 9266ad803..94d2780f1 100644 --- a/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a t530 with a dGPU. Initialization of the dGPU is necessary in order to use an external monitor via the DisplayPort (either the in-built mini-DisplayPort or the DisplayPort in the dock). In order to build this the relevant script in the blobs directory must be run (or self-pulled roms placed in that directory) and after building the rom, the nvramtool must be run on the 12MB rom to change the default graphics mode away from integrated-only graphics (see README_vbios in the blobs directory). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-dgpu-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -63,9 +64,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad T530-dgpu-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config similarity index 94% rename from boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config rename to unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config index e008d6f59..e35937fd6 100644 --- a/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a w530 with the K1000M Nvidia Quadro dGPU. Initialization of the dGPU is necessary in order to use an external monitor whether through the in-build VGA or mini-DisplayPort or via the dock. In order to build this the relevant script in the blobs directory must be run (or self-pulled roms placed in that directory) and after building the rom, the nvramtool must be run on the 12MB rom to change the default graphics mode away from integrated-only graphics (see README_vbios in the blobs directory). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K1000m-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -64,9 +65,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad W530-dgpu-K1000m-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config similarity index 94% rename from boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config rename to unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config index d913a4c11..f091f80d2 100644 --- a/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a w530 with the K1000M Nvidia Quadro dGPU. Initialization of the dGPU is necessary in order to use an external monitor whether through the in-build VGA or mini-DisplayPort or via the dock. In order to build this the relevant script in the blobs directory must be run (or self-pulled roms placed in that directory) and after building the rom, the nvramtool must be run on the 12MB rom to change the default graphics mode away from integrated-only graphics (see README_vbios in the blobs directory). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K1000m-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -63,9 +64,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad W530-dgpu-K1000m-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config similarity index 94% rename from boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config rename to unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config index b006a12c9..18d207e25 100644 --- a/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a w530 with the K2000M Nvidia Quadro dGPU. Initialization of the dGPU is necessary in order to use an external monitor whether through the in-build VGA or mini-DisplayPort or via the dock. In order to build this the relevant script in the blobs directory must be run (or self-pulled roms placed in that directory) and after building the rom, the nvramtool must be run on the 12MB rom to change the default graphics mode away from integrated-only graphics (see README_vbios in the blobs directory). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K2000m-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -64,9 +65,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad W530-dgpu-K2000m-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config similarity index 94% rename from boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config rename to unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config index 4de99bc92..a05be9046 100644 --- a/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config @@ -8,8 +8,8 @@ # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) # This board is designed for a w530 with the K2000M Nvidia Quadro dGPU. Initialization of the dGPU is necessary in order to use an external monitor whether through the in-build VGA or mini-DisplayPort or via the dock. In order to build this the relevant script in the blobs directory must be run (or self-pulled roms placed in that directory) and after building the rom, the nvramtool must be run on the 12MB rom to change the default graphics mode away from integrated-only graphics (see README_vbios in the blobs directory). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K2000m-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config @@ -17,9 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -63,9 +64,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad W530-dgpu-K2000m-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/boards/UNTESTED_x220/UNTESTED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config similarity index 85% rename from boards/UNTESTED_x220/UNTESTED_x220.config rename to unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index cb1a6be5d..494648e29 100644 --- a/boards/UNTESTED_x220/UNTESTED_x220.config +++ b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config @@ -1,7 +1,7 @@ # Configuration for a x220 running Qubes 4.1 and other OS, X220 is identical to X230 on the Linux Side of things. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config @@ -11,7 +11,7 @@ CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -55,6 +55,5 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="ThinkPad X220" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq --ifd --image bios" diff --git a/unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config new file mode 100644 index 000000000..9cfbc4d6b --- /dev/null +++ b/unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config @@ -0,0 +1,73 @@ +# Configuration for a x230 with HOTP (Nitrokey/Purism USB Security dongle enabled HOTP support) +# running Qubes 4.1 and other OSes. +# +# Deactivated to fit in coreboot's CONFIG_CBFS_SIZE=0x700000 : +# dropbear support(ssh client/server) +# e1000e (ethernet driver) +# +# Addition vs standard x230 board config: +# HOTP_KEY: HOTP challenge for currently supported USB Security dongles +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config +CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config + +#Additional hardware support +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=n + +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#Remote attestation support +#TPM based requirements +export CONFIG_TPM=y +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +export CONFIG_AUTO_BOOT_TIMEOUT=5 + +#Nitrokey Storage admin tool +CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): +#CONFIG_CAIRO=y +#CONFIG_FBWHIPTAIL=y + +#Additional tools: +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=n +#Ethernet driver (Heads only) +CONFIG_LINUX_E1000E=n + +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="Thinkpad X230-hotp-legacy" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" + +# This board has two SPI flash chips, an 8 MB that holds the IFD, +# the ME image and part of the coreboot image, and a 4 MB one that +# has the rest of the coreboot and the reset vector. +# +# Only flashing to the bios region is safe to do. The easiest is to +# flash internally when the IFD is unlocked for writing, and x230-flash +# is installed first. diff --git a/unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config new file mode 100644 index 000000000..eb5fd3ad0 --- /dev/null +++ b/unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config @@ -0,0 +1,36 @@ +# Minimal configuration for a x230 to support flashrom and USB +# This top SPI flash image needed to flash legacy board counterpart internally +# This image can be flashed through 1vyrain and skulls +# IDEALLY you should flash maximized top and bottom rom images exteranlly once instead. + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-UNMAINTAINED_x230-legacy-flash.config +CONFIG_LINUX_CONFIG=config/linux-x230-flash.config + +#Add bare minimal tools for flashing boards +CONFIG_BASH=n +CONFIG_FLASHPROG=y +CONFIG_ZSTD=n +#CONFIG_GPG=y +#CONFIG_FLASHTOOLS=y +CONFIG_PCIUTILS=y +#CONFIG_MBEDTLS=y +#CONFIG_QRENCODE=y +#CONFIG_TPMTOTP=y +#CONFIG_DROPBEAR=y + + +#Additional hardware support +CONFIG_LINUX_USB=y +#CONFIG_LINUX_E1000E=y + +export CONFIG_BOOTSCRIPT=/bin/xx30-flash.init +export CONFIG_BOARD_NAME="ThinkPad X230-legacy-flash" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" + +CONFIG_LEGACY_FLASH=y + +BOARD_TARGETS := legacy_flash diff --git a/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config b/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config new file mode 100644 index 000000000..d093dcdbf --- /dev/null +++ b/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config @@ -0,0 +1,66 @@ +# Configuration for a X230 running Qubes 4.1 and other Linux Based OSes (through kexec) +# +# Deactivated to fit in coreboot's CONFIG_CBFS_SIZE=0x700000 : +# dropbear support(ssh client/server) +# e1000e (ethernet driver) +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-UNMAINTAINED_x230-legacy.config +CONFIG_LINUX_CONFIG=config/linux-UNMAINTAINED_x230-legacy.config + +#Additional hardware support +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000E=n + +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHPROG=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y + +#Remote attestation support +#TPM based requirements +export CONFIG_TPM=y +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=n + +#Nitrokey Storage admin tool +CONFIG_NKSTORECLI=n + +#GUI Support +#Console based Whiptail support(Console based, no FB): +CONFIG_SLANG=y +CONFIG_NEWT=y +#FBWhiptail based (Graphical): +#CONFIG_CAIRO=y +#CONFIG_FBWHIPTAIL=y + +#Additional tools: +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=n + +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOARD_NAME="Thinkpad X230-legacy" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" + +# This board has two SPI flash chips, an 8 MB that holds the IFD, +# the ME image and part of the coreboot image, and a 4 MB one that +# has the rest of the coreboot and the reset vector. +# +# Only flashing to the bios region is safe to do. The easiest is to +# flash internally when the IFD is unlocked for writing, and x230-flash +# is installed first. diff --git a/boards/UNTESTED_leopard/UNTESTED_leopard.config b/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config similarity index 95% rename from boards/UNTESTED_leopard/UNTESTED_leopard.config rename to unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config index fe9866ab0..8d874d736 100644 --- a/boards/UNTESTED_leopard/UNTESTED_leopard.config +++ b/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config @@ -15,7 +15,7 @@ CONFIG_MUSL=n else # These don't fit if u-root is turned on #CONFIG_CRYPTSETUP=y -#CONFIG_FLASHROM=y +#CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y #CONFIG_GPG=y CONFIG_KEXEC=y @@ -41,7 +41,6 @@ export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_TPM=n export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" $(board_build)/linuxboot.rom: linuxboot.intermediate diff --git a/boards/UNTESTED_r630/UNTESTED_r630.config b/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config similarity index 92% rename from boards/UNTESTED_r630/UNTESTED_r630.config rename to unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config index 2f0ec38e1..14d6abb67 100644 --- a/boards/UNTESTED_r630/UNTESTED_r630.config +++ b/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config @@ -8,7 +8,7 @@ CONFIG_LINUX_CONFIG=config/linux-linuxboot.config export CONFIG_LINUX_VERSION=4.14.62 #CONFIG_CRYPTSETUP=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y #CONFIG_GPG=y CONFIG_KEXEC=y CONFIG_UTIL_LINUX=y @@ -29,4 +29,3 @@ export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" diff --git a/boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config b/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config similarity index 94% rename from boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config rename to unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config index 591984b39..2a0148d73 100644 --- a/boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config +++ b/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config @@ -16,7 +16,7 @@ CONFIG_LINUX_CONFIG=config/linux-linuxboot.config export CONFIG_LINUX_VERSION=4.14.62 #CONFIG_CRYPTSETUP=y -#CONFIG_FLASHROM=y +#CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG=y CONFIG_KEXEC=y @@ -41,4 +41,3 @@ export CONFIG_TPM=n export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" diff --git a/boards/UNTESTED_tioga/UNTESTED_tioga.config b/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config similarity index 95% rename from boards/UNTESTED_tioga/UNTESTED_tioga.config rename to unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config index 7d72429ba..109c02fc5 100644 --- a/boards/UNTESTED_tioga/UNTESTED_tioga.config +++ b/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config @@ -17,7 +17,7 @@ CONFIG_MUSL=n else # These don't fit if u-root is turned on #CONFIG_CRYPTSETUP=y -#CONFIG_FLASHROM=y +#CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y #CONFIG_GPG=y CONFIG_KEXEC=y @@ -44,7 +44,6 @@ export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_TPM=n export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" $(board_build)/linuxboot.rom: linuxboot.intermediate diff --git a/boards/UNTESTED_winterfell/UNTESTED_winterfell.config b/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config similarity index 96% rename from boards/UNTESTED_winterfell/UNTESTED_winterfell.config rename to unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config index 22e87dd5c..d9cae6534 100644 --- a/boards/UNTESTED_winterfell/UNTESTED_winterfell.config +++ b/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config @@ -17,7 +17,7 @@ CONFIG_MUSL=n else # These don't fit if u-root is turned on #CONFIG_CRYPTSETUP=y -#CONFIG_FLASHROM=y +#CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG=y CONFIG_KEXEC=y @@ -43,7 +43,6 @@ export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_TPM=n export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOOT_DEV="/dev/sda1" #$(board_build)/linuxboot.rom: $(build)/$(linuxboot_dir)/ diff --git a/boards/UNTESTED_winterfell/uinit.go b/unmaintained_boards/UNTESTED_winterfell/uinit.go similarity index 100% rename from boards/UNTESTED_winterfell/uinit.go rename to unmaintained_boards/UNTESTED_winterfell/uinit.go diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/unmaintained_boards/x230-hotp-legacy/x230-hotp-legacy.config similarity index 91% rename from boards/x230-hotp-legacy/x230-hotp-legacy.config rename to unmaintained_boards/x230-hotp-legacy/x230-hotp-legacy.config index 0398b5429..1d6233d72 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/unmaintained_boards/x230-hotp-legacy/x230-hotp-legacy.config @@ -8,7 +8,7 @@ # Addition vs standard x230 board config: # HOTP_KEY: HOTP challenge for currently supported USB Security dongles export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config @@ -19,7 +19,7 @@ CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=n CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -61,9 +61,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad X230-hotp-legacy" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" # This board has two SPI flash chips, an 8 MB that holds the IFD, # the ME image and part of the coreboot image, and a 4 MB one that diff --git a/boards/x230-legacy-flash/x230-legacy-flash.config b/unmaintained_boards/x230-legacy-flash/x230-legacy-flash.config similarity index 78% rename from boards/x230-legacy-flash/x230-legacy-flash.config rename to unmaintained_boards/x230-legacy-flash/x230-legacy-flash.config index 356ca7c75..ed0e79908 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/unmaintained_boards/x230-legacy-flash/x230-legacy-flash.config @@ -4,15 +4,15 @@ # IDEALLY you should flash maximized top and bottom rom images exteranlly once instead. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 -CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy-flash.config +CONFIG_COREBOOT_CONFIG=config/coreboot-UNMAINTAINED_x230-legacy-flash.config CONFIG_LINUX_CONFIG=config/linux-x230-flash.config #Add bare minimal tools for flashing boards CONFIG_BASH=n -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_ZSTD=n #CONFIG_GPG=y #CONFIG_FLASHTOOLS=y @@ -29,7 +29,7 @@ CONFIG_LINUX_USB=y export CONFIG_BOOTSCRIPT=/bin/xx30-flash.init export CONFIG_BOARD_NAME="ThinkPad X230-legacy-flash" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/boards/x230-legacy/x230-legacy.config b/unmaintained_boards/x230-legacy/x230-legacy.config similarity index 85% rename from boards/x230-legacy/x230-legacy.config rename to unmaintained_boards/x230-legacy/x230-legacy.config index cc877284b..bdd821218 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/unmaintained_boards/x230-legacy/x230-legacy.config @@ -4,18 +4,18 @@ # dropbear support(ssh client/server) # e1000e (ethernet driver) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 -CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config -CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config +CONFIG_COREBOOT_CONFIG=config/coreboot-UNMAINTAINED_x230-legacy.config +CONFIG_LINUX_CONFIG=config/linux-UNMAINTAINED_x230-legacy.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=n CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -54,9 +54,8 @@ export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" -export CONFIG_BOOT_DEV="/dev/sda1" export CONFIG_BOARD_NAME="Thinkpad X230-legacy" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" # This board has two SPI flash chips, an 8 MB that holds the IFD, # the ME image and part of the coreboot image, and a 4 MB one that